【发布时间】:2020-03-11 00:04:27
【问题描述】:
我很难理解 'exhaustive-deps' lint 规则。
我已经阅读了this post 和this post 但我找不到答案。
这是一个带有 lint 问题的简单 React 组件:
const MyCustomComponent = ({onChange}) => {
const [value, setValue] = useState('');
useEffect(() => {
onChange(value);
}, [value]);
return (
<input
value={value}
type='text'
onChange={(event) => setValue(event.target.value)}>
</input>
)
}
它需要我将onChange 添加到useEffect 依赖数组中。但据我了解,onChange 永远不会改变,所以它不应该存在。
通常我是这样管理的:
const MyCustomComponent = ({onChange}) => {
const [value, setValue] = useState('');
const handleChange = (event) => {
setValue(event.target.value);
onChange(event.target.value)
}
return (
<input
value={value}
type='text'
onChange={handleChange}>
</input>
)
}
为什么是棉绒?关于第一个示例的 lint 规则有什么明确的解释吗?
或者我不应该在这里使用useEffect 吗? (我是一个有钩子的菜鸟)
【问题讨论】:
-
是的,这里没有理由使用效果,
useEffect与componentWillMount、componentDidMount的组合非常相似,并且当您从useEffect返回一个函数时,该函数会被处理作为componentWillUnmount。您目前正在处理的只是一个简单的状态更改,useState钩子足以完成该操作 -
onChange 不会改变,但值会改变。
-
@MikeAbeln 他们不仅在改变状态,而且还在调用作为道具传入的点击处理程序。
-
@DaveNewton 很好,这让我逃脱了。不过,
useEffect似乎并不合适。道具onChange可以很容易地移动到input的onChange方法的主体中。虽然为了清楚起见应该重命名。基本上是OP在问题中给出的第二个示例。 -
{onChange} 是对父组件的回调,因此它会在更改时使用输入值进行更新。 (在本例中)
标签: reactjs react-hooks eslint