【发布时间】:2020-12-29 22:47:17
【问题描述】:
this example 的问题。
我有一个Input 组件。这个输入组件有一个onChange 属性来处理内部的任何数据变化。
应该如此,如果我从 outside 更新 value,则不会触发 onChange 属性,因为输入组件内部没有任何变化。如果你开始输入 onChange 属性,我也可以从外部更新状态。
但是如果满足某些条件(在我的示例中只是一个布尔状态),我想从内部预填充输入字段,因此我必须调用 onChange 事件,以便应用程序可以更新状态外面。
问题/悖论是 useEffect 检查条件现在需要 onChange 属性作为依赖项,并且由于此属性是一种方法,因此每次渲染都会更改。这意味着现在输入元素总是在发生任何更改时重置为 useEffect 的值,因为 useEffect 再次被触发。
如果允许我从 useEffect 依赖项中删除 onChange 属性,我的问题就不会存在,但这当然违反了 useEffect 挂钩的规则。
我想到的唯一“解决方案”:
- 我可以将 Input 元素之外的条件移到 App 组件中。这对我的示例有意义,但在实际场景中,每次使用组件时都应该相同,并且我不想每次都从外部重复条件,因为条件也不仅仅是真实的布尔值当然是场景。
- 我可以添加一个额外的状态,判断条件是否已经被检查,并且只有当它还没有被触发时才触发 useEffect。但这会很快变得非常复杂,如果条件需要在某个时候再次检查等等等等。
我在不同形状的场景中遇到过这个问题,所以我真的希望得到一个可以应用于一般类似场景的答案。也许我的代码中有一个反模式,说明我如何使用事件处理程序?
提前感谢您的所有回答^^。
【问题讨论】:
标签: javascript reactjs react-hooks use-effect