当我单击父级上的按钮时,有没有办法获取 React 组件的内部值?

Posted

技术标签:

【中文标题】当我单击父级上的按钮时,有没有办法获取 React 组件的内部值?【英文标题】:Is there a way to get a React component's internal values when I click a button on the parent? 【发布时间】:2021-08-12 01:22:47 【问题描述】:

假设我有一个这样的组件 -

const MyForm = ( formId ) => (
   <div>
      <input type="text" placeholder="Full name"></input>
      <input type="text" placeholder="Email"></input>
   </div>
)

export default MyForm;

然后我有我的App.js 就像这样 -

import React from "react";
import MyForm from "./MyForm";

const App = () => (
   <div id="app">
      <MyForm formId="formOne"></MyForm>
      <MyForm formId="formTwo"></MyForm>
      <button onClick=
         () => 
            // Here, when the user clicks the button,
            // I want to get values of both the textboxes,
            // from both the component instances
         
      >Submit</button>
   </div>
)

export default App;

所以基本上,我想要的是 - 当点击 button 时,我希望能够检索文本框的值。一种方法是从MyForm.js 内部引发一个事件,以便通过回调函数道具将每个文本更改冒泡到父级,但这感觉太麻烦了,特别是如果表单有很多字段。有没有简单或直接的方法来做到这一点?我需要使用 Redux 等全局状态管理工具吗?

【问题讨论】:

您可以利用反应上下文并使用MyForm 中的钩子来更新值,您的App 将可以访问数据 【参考方案1】:

组件内的状态仅特定于该组件,组件的父、子或兄弟不知道状态。将值从一个组件传递到另一个组件的唯一方法是通过 props 。在您的情况下,我们需要的是驻留在 App 的状态,然后可以将其作为道具传递给 MyForm 组件。

App.js

const [ formState, setFormState ] = useState( formOne: fullName: '', Email: '', formTwo: '' )

const updateFormValues = (formId, key, value) =>  
   const stateCopy = JSON.parse(JSON.stringify(formState));
   const formToUpdate = stateCopy[formId];
   formToUpdate[key] = value;
   setFormState(stateCopy)


<MyForm formId="formOne" values=formState.formOne updateFormValues=updateFormValues></MyForm>
<MyForm formId="formTwo" values=formState.formTwo updateFormValues=updateFormValues></MyForm>

MyForm.js

const MyForm = ( formId, values, updateFormValues ) => 
     const onInputChange = (e, key) => 
        updateFormValues(formId, key, e.target.value)
     

return(
       <div>
          <input type="text" onChange=(e) => onInputChange(e, 'fullName' value=values.fullName placeholder="Full name"></input>
          <input type="text" onChange=(e) => onInputChange(e, 'email' value=values.email placeholder="Email"></input>
       </div>
    )
    
    export default MyForm;

【讨论】:

【参考方案2】:

要访问子组件内的数据,您需要将状态提升到父组件。

One-way data flow

识别基于该状态呈现某些内容的每个组件。 找到一个共同的所有者组件(在层次结构中需要状态的所有组件之上的单个组件)。 共同所有者或层次结构中更高的另一个组件应该拥有该状态。 如果您找不到拥有状态有意义的组件,请创建一个仅用于保存状态的新组件,并将其添加到公共所有者组件上方的层次结构中的某个位置。

一种方法:

import React,  useState  from "react";

function MyForm(props) 
const  handleChange, values  = props;
return (
    <div>
        <label htmlFor="name">Your name</label>
        <input
            type="text"
            placeholder="Full name"
            onChange=handleChange
            value=values.name
            id="name"
            name="name"
        />
        <label htmlFor="email">Your email</label>
        <input
            type="email"
            placeholder="Email"
            onChange=handleChange
            value=values.email
            id="email"
            name="email"
        />
    </div>
        );
    



function App() 
const [values, setValues] = useState( name: "", email: "" );

const handleChange = (event) => 
    const updatedForm =  ...values, [event.target.name]: event.target.value ;
    setValues(updatedForm);
;

return (
    <div id="app">
        <MyForm
            formId="formOne"
            values=values
            handleChange=handleChange
        ></MyForm>

        <button
            onClick=() => 
                console.log(values);
            
        >
            Submit
        </button>
    </div>
);


export default App;

【讨论】:

以上是关于当我单击父级上的按钮时,有没有办法获取 React 组件的内部值?的主要内容,如果未能解决你的问题,请参考以下文章

React,是不是在父级上渲染会使子级重新渲染?

为啥当我在 grails 上删除一对多关系上的父级时,会在子级上调用 beforeInsert 事件?

如何将 MouseListener 留在 ChildComponent 上但正确跟踪鼠标在父级上的进入和退出?

悬停在子级上而对父级没有悬停效果[重复]

通过在父级上呈现新的视图控制器 viewWillDisappear 在我取消订阅事件时触发

Maven 发布:有没有办法阻止模块上传到 Nexus?