当前位置: 首页 > 知识库问答 >
问题:

父级状态更改后不更新子级组件

公羊安怡
2023-03-14

我正在尝试制作一个很好的ApiWrapper组件来填充各种子组件中的数据。从我读到的所有内容来看,这应该是可行的:https://jsfidle.net/vinniejames/m1mesp6z/1/

class ApiWrapper extends React.Component {

  constructor(props) {
    super(props);

    this.state = {
      response: {
        "title": 'nothing fetched yet'
      }
    };
  }

  componentDidMount() {
    this._makeApiCall(this.props.endpoint);
  }

  _makeApiCall(endpoint) {
    fetch(endpoint).then(function(response) {
      this.setState({
        response: response
      });
    }.bind(this))
  }

  render() {
    return <Child data = {
      this.state.response
    }
    />;
  }
}

class Child extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: props.data
    };
  }

  render() {
    console.log(this.state.data, 'new data');
    return ( < span > {
      this.state.data.title
    } < /span>);
  };
}

var element = < ApiWrapper endpoint = "https://jsonplaceholder.typicode.com/posts/1" / > ;

ReactDOM.render(
  element,
  document.getElementById('container')
);

但由于某种原因,当父状态更改时,子组件似乎没有更新。

我是不是漏了什么?

共有2个答案

宇文德明
2023-03-14

有些事情你需要改变。

fetch获得响应时,它不是一个JSON。我正在寻找如何获得这个json,我发现了这个链接。

另一方面,您需要认为constructor函数只被调用一次。

因此,您需要更改在 组件中检索数据的方式。

在这里,我留下了一个示例代码:https://jsfidle.net/emq1ztqj/

希望这能帮上忙。

凌宏大
2023-03-14

您的代码有两个问题。

子组件的初始状态是从props设置的。

this.state = {
  data: props.data
};

引用这个SO回答:

将初始状态作为prop传递给组件是一种反模式,因为getInitialState(在本例中是constuctor)方法只在组件第一次呈现时才被调用。再也不会了。这意味着,如果您将传递不同值的组件作为prop重新呈现,组件将不会做出相应的反应,因为组件将保持第一次呈现时的状态。很容易出错。

因此,如果无法避免这种情况,理想的解决方案是使用componentwillreceiveprops方法来侦听新的props。

向子组件添加下面的代码将解决子组件重新呈现的问题。

componentWillReceiveProps(nextProps) {
  this.setState({ data: nextProps.data });  
}

第二个问题是fetch

_makeApiCall(endpoint) {
  fetch(endpoint)
    .then((response) => response.json())   // ----> you missed this part
    .then((response) => this.setState({ response }));
}

下面是一个工作小提琴:https://jsfidle.net/o8b04mly/

 类似资料:
  • 这个问题在这里已经得到了回答,但事情总是在变化。 基本上,父组件获取一些数据,子组件需要这些数据。 这是子组件。

  • 问题内容: 我正在尝试制作一个不错的ApiWrapper组件,以填充各种子组件中的数据。从我阅读的所有内容来看,这应该可以正常工作:https : //jsfiddle.net/vinniejames/m1mesp6z/1/ 但是由于某种原因,当父状态更改时,子组件似乎没有更新。 我在这里想念什么吗? 问题答案: 您的代码有两个问题。 您的子组件的初始状态是通过props设置的。 引用此SO答案:

  • 我的反应结构是 在中有一个按钮,单击该按钮可通过家长向其兄弟姐妹发送消息。第一个孩子- 应用程序 选择研究 参与者表-这需要接收某个变量,例如在其状态中的

  • 我有一个父状态,它有一个“主题”状态。 尝试将子元素的样式内联到 但问题是,当父组件状态更改时,子组件不会更新。当按下切换按钮在亮/暗之间改变状态时,我控制台记录父状态。父状态更新良好,但内联样式不变。指示子组件在加载页时被锁定为当前的任何状态。 这有什么原因吗? 我是新反应,所以很抱歉,如果这是一个愚蠢的问题! 家长 儿童

  • 我正在使用 VUE JS,我想有一组复选框,如下所示。当有人单击主复选框时,应选中该复选框下的所有复选框。请找到附图供您参考 为了实现这个场景,我使用了两个主要组件。当有人单击某个组件时,我将该组件添加到selectedStreams数组。所选流数组结构类似于下面的结构 当我单击标题复选框时,我正在触发功能 单击全部并尝试更改选定的流[keyv]。 但此操作不会触发子组件,并自动选中该复选框。 我

  • 假设我有三个UI控制器(A、B、C)。 A是我的根控制器,在ShouldAutoRotate方法中我返回YES。我确实将ModalView从A介绍给B(B= 现在在C中,我可以将模拟器旋转到任何方向,整个视图都可以完美旋转。这就是问题所在,当C是横向的,而我将其忽略时,B中的所有对象都将变得一团糟!!同样的事情也发生在A身上。 我只需要在C上旋转!! 免费。