提问者:小点点

在React中重新渲染道具更改上的子组件的最佳解决方案是什么?


我有一个在componentDidMount()钩子中获取数据的父组件。此数据的状态为setState()-d。然后我将数据作为道具传递给子组件,并基于这些道具设置它们的状态。在第一次渲染时,由于componentDidMount()尚未执行,因此道具将未定义。因此,子组件获得未定义的道具,并使用它们创建状态。在componentDidMount()中获取数据时,会将新的props传递给子组件,但状态已使用未定义的props创建,并且没有任何更改。因此,我现在知道两种解决方案:

>

  • 使用ComponentWillReceiveProps()。但这一点现在已被弃用。

    使用无状态子组件。将数据作为来自父组件的道具传递给他们,而不设置状态(使用来自道具的数据),当父组件在组件中执行setState()时,这将导致用新道具重新渲染到子组件,一切正常。

    现在,如果我想要有状态的子组件呢?我不能使用第二种方法,第一种方法已被弃用。实现这一目标的最佳解决方案是什么?


  • 共3个答案

    匿名用户

    static getDerivedStateFromProps(props, state)
    

    在调用render方法之前调用,无论是在初始装载时还是在后续更新时。它应该返回一个对象来更新状态,或者返回null来不更新任何内容。这种方法适用于状态取决于道具随时间变化的罕见用例。

      static getDerivedStateFromProps(nextProps, prevState){
       if(nextProps.someValue!==prevState.someValue){
         return { someState: nextProps.someValue};
       }
        else return null;
      }
    

    有关更多详细信息,请在此处输入链接说明

    匿名用户

    你可以阅读这篇博文。简言之,更好的方法是使用带钥匙的完全不受控部件。

    1. 基于数据向子组件添加键。如果数据更改,则密钥更改,子组件将重新装载
    2. 将数据作为道具提供给子组件,使用此道具作为子组件的默认状态

    这里有一个沙盒的例子

    匿名用户

    考虑使用替换为<代码>组件DealDevsPrps<代码>,<代码> GETPrimeStestEndoPrps<代码>,如果组件中的状态由它接收的道具的值通知的话。

    https://reactjs.org/docs/react-component.html#static-getderivedstatefromprops