【问题标题】:Get data from child component on click on parent component单击父组件从子组件获取数据
【发布时间】:2021-01-18 03:41:21
【问题描述】:

React 新手,我的问题随之而来。

父组件有按钮和地图功能,它呈现了很多组件,这些组件是用户可以更改数据离开它的许多输入。

import { Form } from 'formik';
import React from 'react';
import { useForm } from 'react-hook-form';

const Wrapper : React.FC = ( props: any) => {

  const { register, handleSubmit, errors } = useForm();
  const { formData, setValues } = useFormDataValues();
   
     return (
      <Form>
          <div>
            <button>
                Save Data
            </button> 
            { 
              props.cells.map( (cell: any,ind: number) => (

              <div key={ind} >
                  <Pattern props={{ "cell": cell }} />                              
              </div>

             }
             ))
          </div>             
    </Form>)

模式组件:

const Pattern = (props:  PatternProps) => {
  const { register, handleSubmit, errors } = useForm();
  const { formData, setValues } = useFormDataValues();

      return (
        <>
        {Object.keys(props).map( (c: string) => (
            <div >
            {
             <input name={c}  ref={register} defaultValue={props[c]} />
            }
            </div>

          ))}
          </>
          )


单击父组件按钮时,我应该从子组件(模式)获取所有输入数据(来自输入组件的数据)。我尝试使用 react-hooks-forms 和 Formik 结合获取,但无法获取。

【问题讨论】:

    标签: reactjs react-hooks formik


    【解决方案1】:

    Pattern 没有理由使用 formik 挂钩,您已经在 Wrapper 使用它。从Pattern 中删除此钩子,并作为Wrapper 的道具传递。这样,Wrapper 将拥有更集中的形式。

    <Pattern data={{ "cell": cell }} // I suggest to rename here to something more semantic rather than 'props'
             formHandlers={{ register, handleSubmit, errors, formData, setValues }} 
             // pass down necessary handlers
             />
    

    在模式:

    // update PatternProps accordingly
    const Pattern = (props:  PatternProps) => {
      const { formHandlers, data } = props
    
      return (
        <>
        {Object.keys(data).map( (c: string) => (
            <div key={c}> // pass a unique key here
              <input name={c}  ref={formHandlers.register} defaultValue={data[c]} />
            </div>
    
          ))}
        </>
      )
    }
    

    【讨论】:

    • 嗨,这很好,它可以工作,但还有其他问题:提交后我只得到最后一个输入值。如何在数组中使用 ref={formHandlers.register} 获取每个值?使用上下文变量并将其作为数组填充的正确方法是什么?编辑:在 useForm() 中也没有 formData 作为参数,我使用了 formState (如果那是你所提到的)
    • 这里我有一个详细问题的沙箱,您可以看到我在表单中传递了一个 json 数据,但我仍然无法从父母。 codesandbox.io/s/nervous-goldwasser-sw65z?file=/src/components/…
    • 如果您将name 输入为name={`${data.guid}.${name}`},您将获得与其ID 相关联的每个表单片段。
    • 非常感谢!我需要学习很多关于反应的知识!
    • 不客气 :) 一点一点你就会到达那里,干杯!!
    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 2020-04-04
    • 2019-05-05
    • 2020-03-31
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多