【问题标题】:How to update and delete array of elements from child component and pass that to parent component in ReactJs如何从子组件中更新和删除元素数组并将其传递给 ReactJs 中的父组件
【发布时间】:2020-07-05 17:22:02
【问题描述】:

编辑:我创建了一个代码框。这是链接:

https://codesandbox.io/s/musing-rgb-ikq33?from-embed

我有一个场景,我需要从子组件更新父组件中的数组。

例如,我从表单添加数组内容,所以如果我在子组件中有 7 个项目(我从子组件添加并从表单一个接一个地将它们传递给父组件)。

如何在不改变原始数组的情况下编辑/更新单个数组行?

添加工作正常,我需要编辑单个项目并在父组件中更新它(包含来自子组件的所有数组元素),但似乎没有突变就无法完成。

父组件:

handlePlansClick = (planData) => {
        this.setState(state => ({
            lead_plans: [...state.lead_plans, planData]
        }));
    }

父组件中的子组件声明:

 <LeadPlans handlePlansClick={this.handlePlansClick} existing_lead_plans={this.state.lead_plans}
                                           must_contain_lead_plan={this.state.must_contain_lead_plan} lead_id={lead_id} updateMode={updateMode}/>

为了从我正在使用的子表单添加到父级:

this.props.handlePlansClick({
                            id: Date.now(),
                            year: year,
                            probability: probability,
                            plan2: plan2,
                            plan3: plan3,
                            fee: fee,
                            addcosts: addcosts
                        }
                    );

更新:

const {lead_id, lead_plans, year, probability, plan2, plan3, fee} = this.state;
            const new_lead = {
                id: lead_id,
                year,
                probability,
                plan2,
                plan3,
                fee,
            };
            const updated_lead_plans = lead_plans.map((lead) => lead.id === lead_id ? new_lead : lead);
            this.setState({
                lead_plans: updated_lead_plans,
                year: '',
                probability: '',
                plan2: '',
                plan3: '',
                fee: '',
                addcosts: '',
                newFieldsEditMode: false,
                LeadPlanSaveUpdateDialogOpen: false
            });

现在,它按预期工作,但问题是它没有更新我需要更新数组项的父数组。它只更新我不想更新的子组件中的所有内容。

下面的代码需要修复,因为我想删除现有项目并再次更新父数组中包含所有元素数组的更新项目:

const updated_lead_plans = lead_plans.map((lead) => lead.id === lead_id ? new_lead : lead);
            this.setState({
                lead_plans: updated_lead_plans,
                year: '',
                probability: '',
                plan2: '',
                plan3: '',
                fee: '',
                addcosts: '',
                newFieldsEditMode: false,
                LeadPlanSaveUpdateDialogOpen: false
            });

同样,我正在使用删除:

this.setState(prevState => ({lead_plans: prevState.lead_plans.filter(lead_offer_rec => lead_offer_rec !== lead_plan_row)}));

但它只在子组件中工作,因为我想删除项目并使用已删除的项目更新我的父数组。

如何从子级获取编辑/更新/删除并将更新后的数组再次传递给父级?

【问题讨论】:

  • IIUC 更新lead_plans 的函数当前驻留在您的子组件中,它的setState 调用更新子组件内部的本地状态?如果是这种情况,您可以执行与handlePlansClick 相同的操作。在你的父组件中声明它,将函数传递给你的子组件并在那里调用它。您可以使用本地子状态的参数调用它,这些值将到达您的父组件
  • 是的,我正在处理相同的案例,并且它的工作没有任何问题,唯一的问题是我只想从子元素更新一个元素并将更新的元素传递给父元素,以便更新特定的元素的任何其他元素。删除也是如此。
  • 可能只有我一个人,但我不清楚您的函数驻留在哪里以及使用什么参数调用它们。如果您确实在父级中声明了它,那么该函数体内的setState 不可能更新子状态。你能准备一个codesandbox吗?您可以简化数据结构,因为这不会真正影响手头的问题。
  • 我已经创建了一个代码沙箱。这是链接:codesandbox.io/s/musing-rgb-ikq33?from-embed

标签: javascript reactjs


【解决方案1】:

在 React 中,数据流应始终从父组件流向子组件,反之亦然。您可以使用 “全局状态管理工具”,例如 Redux,从一个组件传递数据组件到任何其他组件并更新根状态对象。 Redux 在实现时也有很多样板,所以如果应用程序很简单,您可以使用 MobX

【讨论】:

  • 你能举个例子吗?我的模块相当简单,但我想尽可能多地使用反应方式!我已经在使用 Redux。
  • 您可以将新数组传递给全局状态和boolean.. 所以当您想要更新父数组时,将boolean 设置为true 并更新它。您也可以在codesandbox 上发布您的代码吗?会更容易理解和回答。
  • 我创建了一个代码沙箱。这是链接:codesandbox.io/s/musing-rgb-ikq33?from-embed
  • 基本上你想要做的是将更新后的数组从LeadPlan 传递给LeadsSearchResults。你可以做的是在 redux 状态下设置一个AllLeadArrays 键。因此,在您添加了Modal 中的所有引导框后,当您单击abort 按钮时,在LeadPlandispatch an action 到将新的前导数组保存到 redux 状态键 - AllLeadArrays。在此之后,在 LeadsSearchResults 组件中使用 connectmapStateToProps 从 Redux-state 获取数据并将其作为 props 传递给组件。
  • 同样将 prop 放入 Lifecycle 方法中,以便在数组更新时重新渲染组件。
猜你喜欢
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多