当前位置: 首页 > 面试题库 >

使用初始状态来反应useState钩子事件处理程序

空翼
2023-03-14
问题内容

我仍然不停地做出反应,但仍在努力查看我在做什么错。我有一个用于调整面板大小的组件,边缘的onmousedown会更新状态的值,然后有一个用于mousemove的事件处理程序,该事件处理程序使用此值,但是在值更改后似乎没有更新。

这是我的代码:

export default memo(() => {
  const [activePoint, setActivePoint] = useState(null); // initial is null

  const handleResize = () => {
    console.log(activePoint); // is null but should be 'top|bottom|left|right'
  };

  const resizerMouseDown = (e, point) => {
    setActivePoint(point); // setting state as 'top|bottom|left|right'
    window.addEventListener('mousemove', handleResize);
    window.addEventListener('mouseup', cleanup); // removed for clarity
  };

  return (
    <div className="interfaceResizeHandler">
      {resizePoints.map(point => (
        <div
          key={ point }
          className={ `interfaceResizeHandler__resizer interfaceResizeHandler__resizer--${ point }` }
          onMouseDown={ e => resizerMouseDown(e, point) }
        />
      ))}
    </div>
  );
});

问题出在handleResize函数上,应该使用的activePoint是字符串的最新版本,top|left|bottom|right而实际上是null


问题答案:

当前,您的问题是您正在读取过去的价值。当您定义handleResize它属于该渲染时,因此,在重新渲染时,事件侦听器没有任何反应,因此它仍从其渲染中读取旧值。

要解决此问题,您应该使用一个ref并useRef保持更新,以便您可以读取当前值。

示例(链接到jsfiddle):

  const [activePoint, _setActivePoint] = React.useState(null);

  // define a ref
  const activePointRef = React.useRef(activePoint);

  // in place of original `setActivePoint`
  const setActivePoint = x => {
    activePointRef.current = x; // keep updated
    _setActivePoint(x);
  };

  const handleResize = () => {
    // now when reading `activePointRef.current` you'll
    // have access to the current state
    console.log(activePointRef.current);
  };

  const resizerMouseDown = /* still the same */;

  return /* return is still the same */


 类似资料:
  • 问题内容: React有一个叫做useState的钩子,在向功能组件添加状态时使用。 该挂钩API参考状态: useState : 返回一个有状态值,以及一个更新它的函数。 在初始渲染期间,返回的状态()与作为第一个参数()传递的值相同。 该功能用于更新状态。它接受一个新的状态值并排队重新呈现组件。 该阵营文档状态: 作为论点我们要传递什么? 挂钩的唯一参数是初始状态。与类不同,状态不必是对象。如

  • 我有一个对象的状态数组: 我有一个添加按钮,用于将对象添加到数组中,这是onclick事件的主体:

  • 我想用React useState钩子设置多个状态值,这样我就可以用useEffect钩子分别更新它们。我有以下代码: 但是当我用React DevTools检查应用程序时,我会看到钩子的多个“状态”值,而不是“订单”、“支付”、“提交”等。

  • 问题内容: 在React中,这两种实现之间有什么真正的区别?一些朋友告诉我,FirstComponent是模式,但是我不明白为什么。SecondComponent看起来更简单,因为渲染仅被调用一次。 第一: 第二: 更新:我将setState()更改为this.state = {}(感谢joews),但是,我仍然看不到区别。一个比另一个好吗? 问题答案: 应该注意的是,复制永远不会更改为状态的属性

  • 我目前正在处理一个注册表单,以下是我的代码片段: 每个状态都用于表单的受控输入。 基本上,我想做的是在用户成功注册后,我希望状态返回到初始状态,并清除字段。 在中手动将每个状态设置回空字符串是非常必要的。我想知道React是否有一个方法或函数可以将状态重置回初始值?

  • 问题内容: 我发现React Hooks文档的这两部分有些令人困惑。使用状态挂钩更新状态对象的最佳实践是哪一种? 想象一下要进行以下状态更新: 选项1 从使用React Hook的文章中,我们可以做到: 所以我可以做: 然后: 选项2 从钩子参考中我们可以得出: 与类组件中的setState方法不同,useState不会自动合并更新对象。您可以通过将函数更新程序形式与对象传播语法结合使用来复制此行