• 这可能是一个问题更复杂的数据结构。例如,假设你想要一个ListOfWords组件呈现一个以逗号分隔的单词,和父母WordAdder组件允许您单击一个按钮一个词添加到列表中。这段代码不能正常工作.

      问题是,PureComponent将做一个简单的对比新旧this.props.words的价值观。因为这段代码中的变异词数组 handleClick WordAdder方法,新旧this.props的价值观。的话会比较平等,即使实际的单词数组中已经改变了。 ListOfWords因此不会更新,尽管它应该呈现新单词

      1. class ListOfWords extends React.PureComponent {
      2. render() {return <div>{this.props.words.join(',')}</div>;}}
      3. class WordAdder extends React.Component {
      4. constructor(props) {super(props);
      5. this.state = {words: ['marklar']};}
      6. handleClick =()=> {// This section is bad style and causes a bug
      7. const words = this.state.words;
      8. words.push('marklar');
      9. this.setState({words: words});}
      10. render() {return (<div><button onClick={this.handleClick} />
      11. <ListOfWords words={this.state.words} /></div>);}}
      12. ReactDOM.render(<WordAdder/>,document.getElementById('root'));

    主要问题:第七行的 const words 对 this.state.words只是一个引用,并没有改变它的长度 length。因为引用了,所以会显示单词。
    具体解决办法:先将 const words引用一个空,把 this.state.words.length 进行一个 let 的循环,把的 words的 length 更新push,然后显示 length

    1. class ListOfWords extends React.PureComponent {
    2. render() {return <div>{this.props.words.join(',')}</div>;}}
    3. class WordAdder extends React.Component {
    4. constructor(props) {super(props);
    5. this.state = {words: ['marklar']};}
    6. handleClick = () => {// This section is bad style and causes a bug
    7. const words = [];
    8. for(let i = 0; i < this.state.words.length; i++){words.push(this.state.words[i])}
    9. console.log(`words length is ${words.length}`);
    10. words.push('marklar');
    11. console.log(`words length is ${words.length}`);
    12. this.setState({words: words});}
    13. render() {return (<div><button onClick={this.handleClick}>Button</button>
    14. <ListOfWords words={this.state.words} /></div>);}}
    15. ReactDOM.render(<WordAdder />, document.getElementById('root'));

    执行结果:点击六次,显示长度为6
    image.png