【问题标题】:How to make useEffect rerun only on change of a single dependency?如何使 useEffect 仅在更改单个依赖项时重新运行?
【发布时间】:2020-01-03 15:28:51
【问题描述】:

我创建了一个带有附加“编辑/提交”按钮的自定义输入组件,如下所示:

.......................

我希望传递给它的 onChange 处理程序仅在用户点击提交按钮时触发,即 (✓) 而不是在每次按键时触发。所以,在 useEffect 我做了:

    useEffect(() => {
      if (!editMode) { // only on submit
        onChange(value) // "value" is a state of my component
      }
    }, [editMode])

    return (
     <div className='my-input'>
      <input value={value} onChange={({target}) => setValue(target.value)}/>
      <Icon 
        name={editMode ? 'tick' : 'pencil'}
        onClick={() => setEditMode(editMode => !editMode)}
      />
     </div>
    )

但是 linter 开始爆炸:

useEffect 缺少依赖项:'onChange' 和 'value'...

如何解决这个问题,还是我在这里使用了不正确的钩子?

【问题讨论】:

    标签: javascript reactjs react-hooks


    【解决方案1】:

    您看到的警告是因为您的useEffect 函数取决于按键,它取决于onChangevalue 的值。完成此操作的更好方法可能是在 onChange 处理程序本身内部发送事件:

    const onClick = React.useCallback(() => {
      const nextEditMode = !editMode
      setEditMode(nextEditMode)
      // If we're flipping editMode on, fire the event.
      if (nextEditMode) {
        onChange(value)
      }
    }, [value, onChange])
    

    useEffect 应该在你只能将你想要的东西表示为副作用时使用,但在这种情况下没有必要这样做;这可以在事件处理程序中处理,这样做更容易阅读。

    【讨论】:

    • 我希望props.onChange 仅在提交图标点击时触发,但这会在每次按键时触发props.onChange,还是不会?
    • 是的。抱歉,我在您修改问题之前写了这个答案。
    • 更新后的答案应该可以满足您的需求。如果editModefalse 变为true,它只会在单击图标时触发onChange。这将防止父组件在单击图标之前“知道”输入值的更改:)。
    猜你喜欢
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2012-08-18
    相关资源
    最近更新 更多