【发布时间】:2021-08-27 08:49:14
【问题描述】:
我正在动态生成 HOC 父级的子组件(见下文)。我将道具直接传递给其中一个孩子并将道具放入其中。我希望看到孩子在道具上重新渲染会发生变化,但事实并非如此。
代码不正确吗?
ParentComponent
...
const ParentComponent = ({children}) => {
const [state1, setState1] = useState(true);
...
const changeOpacity = event => setState1(!state1);
const renderChildren = React.useCallback(() => React.Children.toArray(children).map((child, index) => (
<div key={index} style={{opacity: `${state1 ? 0 : 1}`}}>
{child}
</div>
)), [state1]);
return (
<div>
<Button onClick={changeOpacity}>Toggle Opacity</Button>
{renderChildren()}
</div>
);
};
App.js
...
const App = () => {
const [prop1, setProp1] = useState(123);
return (
<ParentComponent>
<Child1 prop1={prop1} setProp1={setProp1} />
<Child2 />
</ParentComponent>
);
};
【问题讨论】:
-
那不是因为你的
state1没有改变,所以你得到了renderChildren的momoized?如果你跳过useCallback()会发生什么? -
子级仅在单击“切换不透明度”按钮时重新渲染。因为 renderChildren 依赖于 state1 而没有别的
-
嗯...我认为子组件的渲染与
state1突变无关,当它的道具发生变化时。但是,是的,删除useCallback钩子就可以了。
标签: reactjs react-hooks react-hoc