【问题标题】:React - componentWillReceiveProps alternative [duplicate]React - componentWillReceiveProps 替代方案 [重复]
【发布时间】:2018-11-14 11:20:24
【问题描述】:

我将 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>             
        );
    }
}

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

【问题讨论】:

  • componentWillReceiveProps 将被弃用?你在使用 React17 吗?上面的脚本中没有导致无限循环的代码
  • @RIYAJKHAN 正如我所说,它将被弃用。这个组件也工作得很好。我正在寻找替代品
  • @DenisTsoi getDerivedStateFromProps 是静态的。我不能打电话给setState
  • 您可以查看下面的答案以查看如何使用getDerivedState设置状态-

标签: reactjs nextjs


【解决方案1】:

从 react blog,16.3 引入了 componentWillRecieveProps 的弃用通知。

作为一种解决方法,您可以使用该方法

static getDerivedStateFromProps(nextProps, prevState)

所以

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});
}

变成

static getDerivedStateFromProps(nextProps, prevState) {
  if (nextProps.total !== prevState.total) {
    return ({ total: nextProps.total }) // <- this is setState equivalent
  }
  return null
}

【讨论】:

  • React 的建议是使用 componentDidUpdate 而不是 getDerivedStateFromProps,如果您需要执行副作用(例如,数据获取或动画)以响应道具的变化。 reactjs.org/docs/…, reactjs.org/blog/2018/03/27/…
  • @user1912383 不需要使用componentDidUpdate,这取决于具体情况,react 也推荐 getDerivedStateFromProps 替代方案:reactjs.org/blog/2018/06/07/…
  • 并添加:否则返回null
  • 是的,忘记 else 会导致一些错误
  • 如果是异步的,如何在 getDerivedStateFromProps 方法中设置状态
猜你喜欢
  • 2021-03-21
  • 2020-09-20
  • 2020-04-08
  • 2020-01-09
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
相关资源
最近更新 更多