reactjs 无法在KeyDown上调用useCallback函数

ivqmmu1c  于 2023-03-17  发布在  React
关注(0)|答案(1)|浏览(157)
<span
              key="next"
              aria-label={"Next"}
              // ref={NextPageButtonRef}
              onClick={changeHandler(!hasNext, page + 1)}
              onKeyDown={(e) => {
                if (e.key === "Enter") {
                    changeHandler(!hasNext, page + 1);
                }
              }
              tabIndex={0}
            >
              <span>Next</span>
            </span>
const changeHandler = useCallback(
    (exitEarly: boolean, target: number) => () => {
      if (target === page || exitEarly) {
        return;
      }

      onPageChange(clamp(target, 1, count as number));
    },
    [onPageChange, page, count]
  );

实际上,我希望在按Enter键时调用“changeHandler
当我像这样直接调用它时它就工作了
onKeyDown = {changeHandler(!hasNext, page + 1)}
但我希望它只在按Enter键时调用

bgibtngc

bgibtngc1#

useCallback有一个返回函数的函数,所以当在onKeyDown处理程序中调用changeHandler时,它不会执行执行检查和触发onPageChange的函数
您可以通过删除额外的函数来解决此问题

const changeHandler = useCallback(
    (exitEarly: boolean, target: number) => {
        if (target === page || exitEarly) {
            return;
        }

        onPageChange(clamp(target, 1, count as number));
    },
    [onPageChange, page, count],
);

那么onClick需要有一个匿名函数,因为changeHandler不再返回它将立即调用的函数。

<span
  key="next"
  aria-label={"Next"}
  // ref={NextPageButtonRef}
  onClick={() => changeHandler(!hasNext, page + 1)}
  onKeyDown={(e) => {
    if (e.key === "Enter") {
        changeHandler(!hasNext, page + 1);
    }
  }
  tabIndex={0}
>
  <span>Next</span>
</span>

相关问题