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

如何使用回调从React组件传递数据?

酆勇
2023-03-14

我是React的新手,我的第一个项目涉及创建一个包含日期选择器(使用React Datepicker)的表单(使用react-Hook-form创建)。到目前为止,一切正常,除了我的日期选择器,当单击时,它不会用新选择的日期更新表单字段。

该项目的结构如下:

index.js 
   V
Form.js
   V
ChooseInputType.js (this is looking at a json file of the form questions and choosing what form input to display)
   V
FormDate.js (A date picker will be shown if the json file says it's a date field).

FormDate。js

import React, { useState } from 'react';
import DatePicker from 'react-datepicker';
import 'react-datepicker/dist/react-datepicker.css';
import { Controller } from 'react-hook-form';
function FormDate({ name, question, register, control, type }) {
  const [startDate, setStartDate] = useState(new Date());
  return (
    <div className="form-group">
      <label htmlFor={name}>{question}</label>
      <div className="input-group date col-xs-5">
        <Controller
          as={
            <DatePicker
              selected={startDate}
              onChange={date => setStartDate(date)}
              selectsStart
              startDate={startDate}
            />
          }
          control={control}
          name={name}
          ref={register}
          id={name}
        />
      </div>
    </div>
  );
}
export default FormDate;

我已经按照react hook form Controller文档使用了控制器组件,因为我最终需要使用条件逻辑,并且认为这样做是正确的?但除此之外,它似乎与日期范围示例代码相同。我从其他地方收到一个提示,问题如下:

问题是您将日期选择器包装在其中的Controller组件。它们正在使用onChange回调,而不允许它传播子组件。

通过阅读文档,您只能在其中使用不受控制的组件,如html标记,任何需要React直接操作其状态的组件都将在此处运行。

您必须考虑从表单元素传递所需的数据,如您的日期选择器,备份到您的主表单,并编译您需要手动提交的内容。您可以使用回调、React.context或其他全局状态管理系统(如Redux)将数据从组件传递回来。就我个人而言,我建议在应用程序的复杂性仍然可以管理的情况下坚持回调,只有在事情开始变得非常复杂时才考虑其他选项。

有人能帮我吗(作为一个傻瓜!)了解如何做到这一点,或许可以举个例子?或者是否有任何文档可以帮助我?

非常感谢,,

凯蒂

共有1个答案

萧嘉禧
2023-03-14

根据比尔在我最初问题的评论中的回答,我已经修改了我的代码,看起来像这样,现在它更新了控制器中的日期字段!谢谢比尔。Bill还举例说明了如何将控制器用于许多不同类型的输入,所以如果您觉得有用,请向他致谢。

import React from 'react';
import ReactDatePicker from 'react-datepicker'; 
import 'react-datepicker/dist/react-datepicker.css';
import { Controller } from 'react-hook-form';
function FormDate({ name, question, register, control}) {
  return (
    <div className="form-group">
      <label htmlFor={name}>{question}</label>
      <div className="input-group date col-xs-5">
        <Controller
          as={
            <DatePicker
              dateFormat="dd/MM/yyyy"
              placeHolderText="Select date"
              className="input"
            />
          }
          control={control}
          name={name}
          ref={register}
          id={name}
          valueName="selected" //This is key!
          onChange={([selected]) => selected} //This is key!
        />
      </div>
    </div>
  );
}
export default FormDate;

我想格式化日期,这是一个有用的道具列表,可以传递到日期选择器组件中

再次感谢比尔-你的例子是一个了不起的帮助!

 类似资料:
  • 在本教程中,他们将一个回调函数从父组件传递到子组件,并从子组件传递到子组件。我的问题是如何设置参数?我的猜测是,起点是在组件中调用。从那以后,我就不知道是如何进入的了。它是否存储在“on click方块板”中?

  • 我在索引中创建了新的PublicClientApplication。tsx。现在我想把这个传递给我的withAuthHOC。该应用程序正在使用此HOC。tsx。所以我想在HOC中使用PublicClientApplication(pca道具)。我怎么做? 我的AppProps。tsx: 我的索引。tsx: 我的App.tsx: 我的名字是withAuthHOC。tsx:

  • 我有三个文件(完整的项目是https://github.com/enginyilmaz/kpbduser) mapscreen.js fetchdata.js showdata.js

  • 问题内容: 我想将回调传递给加倍嵌套的组件,并且尽管我能够有效地传递属性,但我不知道如何将回调绑定到正确的组件上才能被触发。我的结构如下所示: 单击列表项时应触发一个回调,这是OutermostComponents方法“ onUserInput”,但相反,我得到“未捕获的错误:未定义不是函数”。我怀疑问题出在我如何在第一个内部渲染SecondNestedComponent并将其传递给回调函数。代码

  • 问题内容: 这是我制作的屏幕,我在该屏幕上导入了三个文件,这些文件将在单击单选按钮时显示。另外还有一个相关的移动屏幕,例如,我现在导入了,如您看到的BigText,它包含表格,现在我想在BigTextMobile组件中打印其输入值 问题答案: 为了简化解决方案,您可以执行以下操作: 然后,在 BigText 组件中,您可以通过此回调添加一些数据,如下所示: 并将数据从状态传输到您的 BigText

  • 我在TypeScript中有一个React组件,看起来像这样: 我希望能够指定我的propTypes()中的函数使用对象,但我不知道怎么做。