reactjs - 无法在 KeyDown 上调用 useCallback 函数

标签 reactjs react-hooks keyboard-events

            <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 时调用

最佳答案

您的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>

关于reactjs - 无法在 KeyDown 上调用 useCallback 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75764588/

相关文章:

jQuery 倒计时暂停和重复

javascript - React 中多个组件的渲染优先级

javascript - ReactJs中如何传入函数?

reactjs - React 中 Mailchimp 订阅期间的脚本错误

reactjs - 有没有办法在 createSlice 中访问全局状态?

javascript - 类型 'IntrinsicAttributes'(自定义 Hook )上不存在 React 属性

python - 在 Pygame 中获取键盘输入的更简单方法?

vue.js - 如何在vuejs中检测ctrl + z和ctrl + y?

reactjs - 在 React Native 中使用多个上下文提供程序的更好方法

javascript - 对 useEffect Hook 内的多个 setState() 调用进行 React 批量更新