ShouldComponentUpdate 设置为 false 如果 props 改变,子组件不更新
ShouldComponentUpdate is set to false child components do not update if props change
我的目标是渲染一个子组件而不重新渲染它的父组件。
因此,例如,App 的状态作为道具直接传递给 Column 组件,但 Column 是 Table 的子项并且 Table 已将 ShouldComponentUpdate
设置为 false(例如, table 数据没有改变..)。
问题..如果 Apps 状态改变,Column 组件不会更新.. 除非 ShouldComponentUpdate
在 Table 组件上设置为 true
.. 有没有关于这个?
文档确实说
Returning false does not prevent child components from re-rendering
when their state changes.
但没有提及他们的道具是否改变..
出于测试目的,我在这里创建了一个演示 https://codesandbox.io/s/k2072rkp7o
代码预览:
const Column = ({ isSelected, onClick, children }) => (
<div
style={{
backgroundColor: isSelected ? 'green' : 'red',
padding: '10px',
}}
onClick={onClick}
>
Column: {children}
</div>
);
const Row = ({children }) => (
<div
style={{
backgroundColor: 'teal',
padding: '10px'
}}
>
Row {children}
</div>
)
class Table extends React.Component {
shouldComponentUpdate() {
// There will be logic here to compare table data to see if its changed..
return false
}
render() {
return (
<div
style={{
backgroundColor: '#ccc',
padding: '10px'
}}>
Table {this.props.children}
</div>
)
}
}
class App extends React.Component {
constructor() {
super();
this.state = {
isSelected: false
};
}
render() {
return (
<Table>
<Row>
<Column
isSelected={this.state.isSelected}
onClick={() => this.setState({
isSelected: !this.state.isSelected
})}
/>
</Row>
</Table>
)
}
}
考虑一个解决方案,在该解决方案中,您设置默认状态加载并更新状态,其中与您的 table 交互,将 'color-whateveryoulike' class 附加到您的列。在这种情况下道具不会帮助你,因为我们永远不想更新道具,你想要听状态更新。
您可以使用 Table 组件作为 PureComponent,并且 PureComponent 内部会检查更改。
只需将 class Table extends React.Component
更改为 class Table extends React.PureComponent
,然后删除
shouldComponentUpdate() {
// There will be logic here to compare table data to see if its changed..
return false
}
因为,正如我所说,PureComponent 在内部执行此操作。
阅读更多信息:PureComponent
但不要总是使用它,因为如果过度使用不必要的东西,它可能会产生副作用,使您的应用程序变慢。
好吧,经过更多的阅读,这是不可能的......当你在玩 tables 并且想要将样式应用于单元格组件而不导致重新渲染时,这是不好的整个 table... 将不得不研究替代方案...
这里是任何有同样问题的人的组件生命周期..
我的目标是渲染一个子组件而不重新渲染它的父组件。
因此,例如,App 的状态作为道具直接传递给 Column 组件,但 Column 是 Table 的子项并且 Table 已将 ShouldComponentUpdate
设置为 false(例如, table 数据没有改变..)。
问题..如果 Apps 状态改变,Column 组件不会更新.. 除非 ShouldComponentUpdate
在 Table 组件上设置为 true
.. 有没有关于这个?
文档确实说
Returning false does not prevent child components from re-rendering when their state changes.
但没有提及他们的道具是否改变..
出于测试目的,我在这里创建了一个演示 https://codesandbox.io/s/k2072rkp7o
代码预览:
const Column = ({ isSelected, onClick, children }) => (
<div
style={{
backgroundColor: isSelected ? 'green' : 'red',
padding: '10px',
}}
onClick={onClick}
>
Column: {children}
</div>
);
const Row = ({children }) => (
<div
style={{
backgroundColor: 'teal',
padding: '10px'
}}
>
Row {children}
</div>
)
class Table extends React.Component {
shouldComponentUpdate() {
// There will be logic here to compare table data to see if its changed..
return false
}
render() {
return (
<div
style={{
backgroundColor: '#ccc',
padding: '10px'
}}>
Table {this.props.children}
</div>
)
}
}
class App extends React.Component {
constructor() {
super();
this.state = {
isSelected: false
};
}
render() {
return (
<Table>
<Row>
<Column
isSelected={this.state.isSelected}
onClick={() => this.setState({
isSelected: !this.state.isSelected
})}
/>
</Row>
</Table>
)
}
}
考虑一个解决方案,在该解决方案中,您设置默认状态加载并更新状态,其中与您的 table 交互,将 'color-whateveryoulike' class 附加到您的列。在这种情况下道具不会帮助你,因为我们永远不想更新道具,你想要听状态更新。
您可以使用 Table 组件作为 PureComponent,并且 PureComponent 内部会检查更改。
只需将 class Table extends React.Component
更改为 class Table extends React.PureComponent
,然后删除
shouldComponentUpdate() {
// There will be logic here to compare table data to see if its changed..
return false
}
因为,正如我所说,PureComponent 在内部执行此操作。 阅读更多信息:PureComponent 但不要总是使用它,因为如果过度使用不必要的东西,它可能会产生副作用,使您的应用程序变慢。
好吧,经过更多的阅读,这是不可能的......当你在玩 tables 并且想要将样式应用于单元格组件而不导致重新渲染时,这是不好的整个 table... 将不得不研究替代方案...
这里是任何有同样问题的人的组件生命周期..