How to add new elements without re-rendering whole list with React

前端 未结 1 1142
误落风尘
误落风尘 2021-01-11 13:01

I\'m working on simple stream app. I have list of posts and this list can receive updates, which will display on top of it.

The problem is on each new post receive R

相关标签:
1条回答
  • 2021-01-11 13:18

    Work that needs to be done only once should be done in a lifecycle method that is guaranteed to run only once, like componentDidMount. As the docs suggest:

    If you want to integrate with other JavaScript frameworks, set timers using setTimeout or setInterval, or send AJAX requests, perform those operations in this method.

    I added logging to componentDidMount in your snippet to show rendering happens many times, but componentDidMount is called only once per instance.

    class Post extends React.Component {
      componentDidMount() {
        console.log('mounted post', this.props.id);
      }
    
      render() {
        console.log('rerendered post', this.props.id);
        return (
          <li>{this.props.post.text}</li>
        );
      }
    }
    
    class App extends React.Component {
    
      constructor(props) {
        super(props);
        this.nextId = 4;
        this.state = {
          posts: [
            {id: 1, text: 'First one'},
            {id: 2,text: 'Second one'},
            {id: 3,text: 'Third one'},
          ],
        };
      }
    
      addPost() {
        const posts = this.state.posts;
        posts.unshift({id: this.nextId, text: 'Post ' + this.nextId});
        this.nextId++;
        this.setState({posts: posts});
      }
    
      render() {
        return (
          <div>
            <button onClick={this.addPost.bind(this)}>Add Post</button>
            <ul>
              {this.state.posts.map((post, index) => {
                return (<Post post={post} key={post.id} id={post.id} />);
              })}
            </ul>
          </div>
        );
      }
    }
    
    
    ReactDOM.render(<App />, document.getElementById('root'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <body>
      <div id="root"></div>
    </body>

    0 讨论(0)
提交回复
热议问题