我有一个ParentComponent
看起来像这样:
const ParentComponent = () => {
[product, setProduct] = useState({
name: "Test",
description: "Information goes here..."
})
return(
<ChildComponent product={product} updateProduct={setProduct}/>
);
}
字符串ChildComponent
如下:
const ChildComponent = ({product, updateProduct}) => {
// some code here
return(
<RichTextEditor content={product.description} update={updateProduct}/>
)
}
const isEqual = () => {
return true; // I want to force the component to never re-render
}
export default React.memo(ChildComponent, isEqual)
型
这里发生的事情是,我有一个product
对象,其描述由ChildComponent
更新。每当RichTextEditor
组件中的输入发生变化时,该描述的值通过updateProduct
进行设置。我知道,由于product
的状态改变,ChildComponent
每次都会重新渲染,这是不幸的,因为这可能会导致不必要的效果,例如使RichTextEditor
内的输入字段失去焦点。因此,我尝试使用始终返回true的isEqual
函数强制ChildComponent
永远不重新渲染。它不断地重新渲染,为什么呢?
我意识到还有其他的设计可以完全避免这个问题,我可能无论如何都会这样做,但在我这样做之前,我想了解为什么我不能强制ChildComponent
不重新渲染。
2条答案
按热度按时间snz8szmq1#
如果您使用的是
useState
、useContext
或useReducer
,则组件仍将重新渲染。这是直接从医生那里得到的。
yrefmtwq2#
子组件是否使用任何上下文?
即使组件被记忆化,当它使用的上下文发生变化时,它仍然会重新呈现。Memoization只与从其父组件传递给组件的props有关。
要解决这个问题,请通过props将上下文值传递到组件中,而不是直接在子组件中使用上下文。