javascript - 当我单击父级上的按钮时,有没有办法获取 React 组件的内部值?
问题描述
假设我有一个这样的组件 -
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
以便通过回调函数 prop 将每个文本更改冒泡到父级,但这感觉太麻烦了,尤其是当表单有很多字段时。有没有简单或直接的方法来做到这一点?我需要使用像 Redux 这样的全局状态管理工具吗?
解决方案
组件内部的状态仅特定于该组件,组件的父、子或兄弟不知道状态。将值从一个组件传递到另一个组件的唯一方法是通过 props 。在您的情况下,我们需要一个驻留的状态,App
然后可以将其作为道具传递给两个MyForm
组件。
应用程序.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;
推荐阅读
- javascript - 背景视频播放列表
- git - 如何管理多语言项目的位存储库
- ios - 如何通过页脚单元格在表格视图中使用委托?
- docker - 缺少高山包 py3-scipy
- jenkins - 詹金斯如何设置所有带有前缀“blah”的作业,以便在超过时间限制时停止
- ionic4 - toast.present() 在 Ionic 4 中失败
- mysql - 没有 MariaDB 引擎的 Ubuntu 19.04 上的 MySQL 服务器
- vb.net - 将 DLL 导入从 VB.NET 转换为 VB6
- python - Flask + DataTables:如何读取 DataTables 作为 JSON 发送的 AJAX 请求?
- r - 从字符串末尾删除重复编号