【问题标题】:React: Updating state in parent component from multiple child componentsReact:从多个子组件更新父组件中的状态
【发布时间】:2020-08-20 14:17:02
【问题描述】:

我是新来的反应,我在尝试这个时遇到了一个问题。我在父状态中有一个二维数组,我映射到几个子组件。我在父组件中有一个复选框,单击该复选框应获取所有子组件中的值并更新二维数组。我在父组件中创建了一个函数来执行此操作,并将其作为道具发送给所有子组件,但更改并未反映在父组件中存在的二维数组中。仅更新数组中的第一个元素。请帮帮我。传递给子组件的函数是

    updateStudentScores = (
    index,
    test1,
    test2,
    exams,
    totals,
    grades,
    remks,
    SChek,
    bgrnd
  ) => {
    const elementsIndex = this.state.students.findIndex(
      (element) => element.RealIndex == index
    );

    let newArray = [...this.state.tempStudents];
    newArray[elementsIndex] = {
      ...newArray[elementsIndex],
      Cas1: test1,
      Cas2: test2,
      Exam: exams,
      Total: totals,
      Grade: grades,
      Remark: remks,
      stillChecked: SChek,
      background: bgrnd,
    };
    this.setState({ tempStudents: newArray });
  };

tempStudents 是父组件状态下的二维数组。感谢您的回复

【问题讨论】:

  • 为了清楚起见,您应该使用代码更新您的问题

标签: reactjs


【解决方案1】:

它只更新第一个元素的原因是,当第一个子组件更新 2D 数组时,它会更新父级状态 -> 将其作为更新后的道具发送给所有子级 -> 导致所有子级重新渲染并丢失任何输入的数据。

您尚未发布任何代码...但最好的方法是在每次孩子更改二维数组中的任何内容时调用一个处理程序。 (这是理想的)

要获得您想要的功能,您需要复选框来更改作为道具传递给所有子组件的状态(导致它们重新渲染),当发生这种情况时,您可以使用钩子或生命周期方法,例如"componentDidMount()" 使用更新数组所需的所有值调用父处理程序。

【讨论】:

  • 我已经包含了我的回调函数。请帮忙
  • 我认为回调函数是由每个子组件同时执行的,每个子组件都有不同的 tempStudent 数组状态来处理。有没有一种方法可以确保一个回调在子组件的下一个回调之前完成执行,以便他们始终拥有正确的 tempStudent 来使用
  • React 不是这样工作的。而且它们不是同时执行的。孩子们按照他们呈现的顺序调用回调函数。正如我提到的,一旦孩子通过回调更新父母状态,它将重新渲染所有子组件(并删除他们可能拥有的任何数据)。
  • 好的,这就是你可以做的事情。而不是更新tempStudents 创建一个名为tempStudents2 的新状态,它通过回调函数更新。您可能有复选框的处理程序,对吗?好吧,一旦选中了复选框,孩子们将调用回调函数,但因为他们更新了tempStudent2,它不会导致其他孩子重新渲染。在复选框处理程序的末尾做this.setState({tempStudents: this.state.tempStudents2})
  • 再次感谢。我已经按照您所说的做了,但我发现每个孩子的回电都在读取 tempStudents2 的初始值。例如,如果 child1 将 tepmStudents2 从 [1,2,3,4] 更新为 [5,6,7,8],而不是 child2 将 tempStudent2 读取为 [5,6,7,8],它仍将被读取为[1,2,3,4] 因此使 child1 所做的更改无效,依此类推,即使是第十个孩子也将 tempStudents2 读取为 [1,2,3,4]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 2018-07-20
  • 2021-12-27
  • 2020-05-31
  • 2018-10-09
  • 2017-09-28
  • 1970-01-01
相关资源
最近更新 更多