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

将大型对象从孩子传递给家长的最佳方式?

鞠通
2023-03-14

我有一个巨大的表单,sumbit是从表单外部触发的

<App>
   <Form/>
   <Button/>   
</App>

问题是,我需要有当前表单字段对象在按钮组件。我试图通过传递setState函数来传递多个层的状态:

const [formFields, setFormFields] = useState(null);    
<App>
   <Form setData={setFormFields}/>
   <Button data={formFields}/>   
</App>

还可以使用redux分派(在表单字段更改时)和按钮组件中的Selector来获取当前数据。但当我在输入字段中编写一些文本时,这两种方法似乎都会减慢应用程序的速度。

优化it的最佳解决方案是什么?

共有1个答案

沃瑾瑜
2023-03-14

当我在输入字段中编写一些文本时,会使应用程序的速度减慢。

这是因为您将表单的数据绑定到呈现。也可以通过Redux存储整个表单(或者您想要的任何其他地方),只要您没有在组件的呈现生命周期和表单字段值中的那些突变之间创建依赖关系。

整个表单是否需要更新每个单独组件的事件?不是真的。然而,由于整个窗体聚集在一个大对象中,并且该对象的引用在更新后更改,因此整个组件树被重新渲染。

为了减少重新呈现的需要,您可以在React之外同步数据(注意:数据,而不是验证等),并且仅在提交时获取数据。

import React, { useState } from "react";

const externalFormData = {};

function Form() {
  return (
    <input
      onChange={function(ev) {
        externalFormData.input = ev.target.value;
      }}
    />
  );
}

export default function App() {
  const [formData, setFormData] = useState();
  return (
    <div>
      <Form />
      <input
        type={"button"}
        onClick={function() {
          setFormData(externalFormData);
        }}
        value="Submit form"
      />
      <p>{`Submitted form is: ${JSON.stringify(formData)}`}</p>
    </div>
  );
}

如果这是您的选择,我建议您寻找一些现有的表单库来为您处理(包括验证等)。

另一个想法是将你提到的这个“大对象”解耦为单独更新的单个对象,因此只触发受值影响的组件的重新渲染。

 类似资料:
  • 我想在React中将数据从子组件发送到父组件。查找数据时,只有类类型,没有功能文档。您可以使用什么语法传递数据?

  • 问题内容: 在组件中,我需要将函数的返回值传递给属性。然后从属性需要被传递到的组件。新来的反应。不确定如何将属性从子级传递到组件。 问题答案: 您可以将函数从父级传递给子级,子级可以使用颜色调用该函数(很多操作都类似于事件处理程序)。在App中收到颜色后,使用.setState()将其分配给状态值,然后将其在render()中获取

  • 我试图使用在child中的函数中生成的值。js并将其传递给父级。所以我可以使用这个值来过滤子数组。 小孩js 是生成的值,我需要在父级中访问该值。js Parent.js 我是不是错过了一些显而易见的东西?控制台。日志for返回子项的所有值。js节点,但当用作道具时返回未定义。 如何让函数运行,这样我就可以用返回的值过滤结果? 谢谢

  • 我有一张桌子,可以有相同类型的父母。在Java中,子对象可以到达父对象,但父对象没有子对象列表。 在MySQL中,我能够创建以下查询,给我父级的子级和子级,但我无法将其转换为JPAJava。 如何翻译此查询: 在java语言中,使用Criteria builder和Criteria Query,我已经尝试了以下方法: 但这只给了我直接的孩子,没有给我亚孩子。 谢谢你的帮助。 实体:

  • 问题内容: 将对象传递给方法后,我想更改其字段之一。在Java中执行此任务的最佳实践是什么? 问题答案: 简单的答案 如其他答案所述,您可以简单地调用setter方法。 更多的哲学答案 通常,在除对象创建范围之外的范围内对对象进行突变可能很危险: http://en.wikipedia.org/wiki/Functional_programming 就是说,在很多情况下,您只想在同一逻辑范围内封装

  • 问题内容: 我在这里有一个简单的设置: 我有一个父组件,该父组件有2个子组件。在第一个子组件中:用户更改输入的值。然后,该更改的值将是我想要从该孩子传递给父对象的道具,以便可以将其传递给与同一父组件相连的另一个孩子。 当前设置的这个,请查看 从用户输入到UI更改的流程:1.在“ Child 1”中:调整一个滑块,将onChange值传递给父组件;2.将此属性(新的滑块值)传递给Parent组件,以