【发布时间】:2020-06-25 09:56:41
【问题描述】:
需要帮助~
我有两个组件,我用 React.memo 包裹了 Parent:
孩子
const Child = ()=> <div>I'm Child</div
export default Child
父母
const Parent = (props)=> <div>{props.children}</div>
export default React.memo(Parent)
在应用中使用:
const App = () => {
const [count, setCount] = useState(0)
return(
<div>
<button onClick={()=>setCount(count+1)}></button>
<Parent>
<Child></Child>
</Parent>
</div>
)
}
点击按钮,结果:
父组件将重新渲染,所以备忘录不起作用,因为它的子组件是一个函数组件
那么,如何防止重新渲染?
我知道useMemo的解决方法,但是又丑又不友好,你有更好的想法吗?
const App = () => {
const [count, setCount] = useState(0)
const children = useMemo(()=><Child></Child>,[])
return(
<div>
<button onClick={()=>setCount(count+1)}></button>
<Parent>
{children}
</Parent>
</div>
)
}
【问题讨论】:
-
Child组件由App组件渲染。因此,要么将Child的渲染移动到Parent组件中,要么将Child包装在React.memo()中。 -
不,不行,我试过了……
-
好的,所以你的
Parent仍然会重新渲染,因为当App重新渲染时,它的children属性在技术上会发生变化,这就是为什么即使React.memo()也无济于事的原因。基本上最好的解决方法似乎是你使用useMemo所做的。您必须记住作为孩子传递给Parent的内容,否则它将重新渲染。 -
谢谢,还有另一种方式 React.memo(Parent, ()=>true)。但这不安全……
标签: reactjs react-hooks react-memo