【发布时间】:2021-07-03 08:38:34
【问题描述】:
我有 2 个组件。在父组件中我有这个:
const Demo = () => {
const [state, setState] = useState(true);
const onChange = useCallback(
(value: string) => {
console.log(value);
},
[],
);
return (
<div className="a">
<button onClick={() => setState(!state)}>sds</button>
<div className="123">
<Bar searchHandler={onChangeSearchHandler} />
</div>
</div>
);
};
在Bar 组件中我有这个:
const Bar = ({ searchHandler }) => {
console.log('bar');
return (
<div>
<input type="text" onChange={(value) => searchHandler(value.target.value)} />
</div>
);
};
用useCallback 包装onChange 我希望缓存该函数,当我点击<button onClick={() => setState(false)}>sds</button> 时我不想渲染Bar 组件,但它被触发了。为什么会触发Bar 组件以及如何使用useCallback 防止这种情况发生?
【问题讨论】:
-
useCallback函数实例保持不变,这是正确的,但不能假设子组件的渲染函数不再运行。但是,您可以将子组件包装在React.memo中。但是您仍然不能保证不调用渲染函数。但说真的:不要尝试优化渲染函数的调用频率。 -
顺便说一句:我认为您在
onChangeSearchHandler与onChange之间存在拼写错误
标签: reactjs react-hooks