【发布时间】:2019-08-22 18:30:42
【问题描述】:
当向PureComponent 或功能组件发送道具时,您可以通过使用不会在每次渲染时更改的道具来优化性能,这将防止组件重新渲染。
当使用类组件时,这很简单:
class Component extends React.Component {
render() {
return <List createRows={this.createRows}/>;
}
createRows = () => this.props.data.map(dataToRow);
}
鉴于List 是PureCompoment 或功能组件,createRows 属性永远不会导致List 的重新渲染。
但如果Component 是一个功能组件,那就不可能了:
function Component(props) {
return <List createRows={createRows}/>;
function createRows() {
return props.data.map(dataToRow);
}
}
由于每次Component 渲染时都会创建createRows,所以prop 会发生变化,导致每次Component 重新渲染时都会重新渲染List。这可能会导致性能大幅下降。另请注意,createRows 不能放在功能组件之外,因为它依赖于 List 的 data 属性。
现在,随着 Hooks 的介绍,可以将 createRows 保存在 useState 钩子中:
function Component(props) {
const [ createRows ] = useState(() => () =>
props.data.map(dataToRow);
);
return <List createRows={createRows}/>;
}
由于createRows 保存在状态挂钩中,它不会随着每次渲染而改变,并且不会像我们想要的那样重新渲染List。
但是,这似乎更像是一种 hack 而不是解决方案。
在不导致子组件不必要的重新渲染的情况下,将功能道具从功能组件发送到子组件的最佳做法是什么?
【问题讨论】:
标签: javascript reactjs react-hooks