React - componentWillReceiveProps替代方案

Kit*_*son 23 reactjs nextjs

我将React与NextJS一起使用.

我有一个组件,基本上是一个表格,给出了一些摘要.根据一些UI选择,该组件应显示适当的摘要.

以下代码完美无缺.

class Summary extends Component{

    state = {
        total: 0,
        pass: 0,
        fail: 0,
        passp: 0,
        failp: 0
    }

    componentWillReceiveProps(props){
        let total = props.results.length;
        let pass  = props.results.filter(r => r.status == 'pass').length;
        let fail  = total - pass;
        let passp = (pass/(total || 1) *100).toFixed(2);
        let failp = (fail/(total || 1) *100).toFixed(2);
        this.setState({total, pass, fail, passp, failp});
    }

    render() {
        return(
          <Table color="teal" >
                <Table.Header>
                  <Table.Row textAlign="center">
                    <Table.HeaderCell>TOTAL</Table.HeaderCell>
                    <Table.HeaderCell>PASS</Table.HeaderCell>
                    <Table.HeaderCell>FAIL</Table.HeaderCell>
                    <Table.HeaderCell>PASS %</Table.HeaderCell>
                    <Table.HeaderCell>FAIL %</Table.HeaderCell>                                 
                  </Table.Row>
                </Table.Header>
                <Table.Body>
                  <Table.Row textAlign="center">
                    <Table.Cell>{this.state.total}</Table.Cell>
                    <Table.Cell >{this.state.pass}</Table.Cell>
                    <Table.Cell >{this.state.fail}</Table.Cell>                                     
                    <Table.Cell >{this.state.passp}</Table.Cell>
                    <Table.Cell >{this.state.failp}</Table.Cell>                                      
                  </Table.Row>
                </Table.Body>
           </Table>             
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来componentWillReceiveProps会被弃用.我尝试了其他选项,比如shouldComponentUpdate等等.他们都导致无限循环.从props更新状态以重新渲染此组件的最佳方法是什么?

Den*_*soi 32

来自react 博客,16.3引入了折旧通知componentWillRecieveProps.

作为解决方法,您将使用该方法

static getDerivedStateFromProps(nextProps, prevState)
Run Code Online (Sandbox Code Playgroud)

因此

componentWillReceiveProps(props){
    let total = props.results.length;
    let pass  = props.results.filter(r => r.status == 'pass').length;
    let fail  = total - pass;
    let passp = (pass/(total || 1) *100).toFixed(2);
    let failp = (fail/(total || 1) *100).toFixed(2);
    this.setState({total, pass, fail, passp, failp});
}
Run Code Online (Sandbox Code Playgroud)

static getDerivedStateFromProps(nextProps, prevState) {
  if (nextProps.total !== prevState.total) {
    return ({ total: nextProps.total }) // <- this is setState equivalent
  }
  etc...
}
Run Code Online (Sandbox Code Playgroud)

  • React的建议是使用componentDidUpdate而不是getDerivedStateFromProps,如果你需要执行副作用(例如,数据提取或动画)以响应props中的更改.https://reactjs.org/docs/react-component.html#static-getderivedstatefromprops,https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#fetching-external-数据时,道具变 (16认同)
  • @user1912383没有必要使用componentDidUpdate,这取决于具体情况,react也建议使用getDerivedStateFromProps替代方案:https://reactjs.org/blog/2018/06/07/you-probously-dont-need-driven-state .html#alternative-1-reset-uncontrol-component-with-an-id-prop (3认同)
  • 并添加:否则返回 null (2认同)