根据反应文档:
如果您只想在 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