根据反应文档:
如果您只想在 prop 更改时重新计算某些数据,请使用 memoization helper。
文档memoizeOne
用作库,所以这将是一个不错的选择。您还可以更改keyValue
为副作用的一部分componentDidUpdate
:
componentDidMount() {
this.keyValue = uuid()()
}
componentDidUpdate(prevProps) {
if (this.props.children !== prevProps.children) {
this.keyValue = uuid()()
// alternative: store keyValue as state to trigger re-render
}
}
getDerivedStateFromProps
可以作为罕见情况的替代方案,通常首选其他选项。
为什么useMemo
不是一个好的选择uuid()
您可能依赖 useMemo 作为性能优化,而不是语义保证。将来,React 可能会选择“忘记”一些先前记忆的值并在下一次渲染时重新计算它们,例如为屏幕外组件释放内存。(文档)
尽管在 React 未来是相同的,const keyValue = useMemo(() => uuid()(), [children])
但可能会重新计算记忆值。children
这种情况可能会导致不一致,如果uuid()
返回一个新的 id,但children
没有改变。
对于功能组件,可以根据您的用例使用useRef
替代方法。useEffect