这是在组件中使用 useState 挂钩将值传递给组件的父级的好习惯吗?
Is this a good practice in using the useState hook in a component to pass values to the parent of the component?
我正在尝试创建一个 Input 组件,它可以在存储输入值的任何页面中动态使用,并具有一个 getValue 属性,该属性允许组件的父级访问它。在 App.js 中,我有一个名为“info”的对象,用于存储从 Input 组件获取的值。下面的代码是解决这个问题的好方法吗?
Input.js
const Input = ({placeholder, getValue}) => (
<input
placeholder={placeholder}
onChange={({target}) => getValue(target.placeholder, target.value)}
/>
)
Input.defaultProps = {
getValue: (key, value) => {}
}
export default Input;
App.js
import { useState } from "react";
import Input from "./Input.js";
const App = () => {
const [info, setInfo] = useState({});
const addToInfo = (name, val) => {
let keyWord = (name.charAt(0).toLowerCase() + name.slice(1)).replace(/\s/g, "");
setInfo(prev => ({...prev, [keyWord]: val}))
}
return (
<div>
<h1>Hello {info.firstName && info.firstName} {info.lastName && info.lastName}</h1>
<Input placeholder="First Name" getValue={(name, val) => addToInfo(name, val)}/>
<br/>
<Input placeholder="Last Name" getValue={(name, val) => addToInfo(name, val)}/>
<br/>
<Input placeholder="Email" getValue={(name, val) => addToInfo(name, val)}/>
<br/>
<Input placeholder="Phone Number" getValue={(name, val) => addToInfo(name, val)}/>
<br/>
<button onClick={() => console.log(info)}>Console Log the Info</button>
</div>
);
}
export default App;
我建议你可以看看 Formik,他们的方法正是解决你问题的方法,即向上父级传递值,这是他们使用的基本结构:
<Formik>
{(props) => (
<Form> // This is from Formik
// your basic form stuff
</Form>
)}
</Formik>
关于如何使 <Form></Form>
可重用,上次我问了他们的一位贡献者,请随意看一看:Make Formik a custom component
这是Formik official website
希望能对您有所启发!
我正在尝试创建一个 Input 组件,它可以在存储输入值的任何页面中动态使用,并具有一个 getValue 属性,该属性允许组件的父级访问它。在 App.js 中,我有一个名为“info”的对象,用于存储从 Input 组件获取的值。下面的代码是解决这个问题的好方法吗?
Input.js
const Input = ({placeholder, getValue}) => (
<input
placeholder={placeholder}
onChange={({target}) => getValue(target.placeholder, target.value)}
/>
)
Input.defaultProps = {
getValue: (key, value) => {}
}
export default Input;
App.js
import { useState } from "react";
import Input from "./Input.js";
const App = () => {
const [info, setInfo] = useState({});
const addToInfo = (name, val) => {
let keyWord = (name.charAt(0).toLowerCase() + name.slice(1)).replace(/\s/g, "");
setInfo(prev => ({...prev, [keyWord]: val}))
}
return (
<div>
<h1>Hello {info.firstName && info.firstName} {info.lastName && info.lastName}</h1>
<Input placeholder="First Name" getValue={(name, val) => addToInfo(name, val)}/>
<br/>
<Input placeholder="Last Name" getValue={(name, val) => addToInfo(name, val)}/>
<br/>
<Input placeholder="Email" getValue={(name, val) => addToInfo(name, val)}/>
<br/>
<Input placeholder="Phone Number" getValue={(name, val) => addToInfo(name, val)}/>
<br/>
<button onClick={() => console.log(info)}>Console Log the Info</button>
</div>
);
}
export default App;
我建议你可以看看 Formik,他们的方法正是解决你问题的方法,即向上父级传递值,这是他们使用的基本结构:
<Formik>
{(props) => (
<Form> // This is from Formik
// your basic form stuff
</Form>
)}
</Formik>
关于如何使 <Form></Form>
可重用,上次我问了他们的一位贡献者,请随意看一看:Make Formik a custom component
这是Formik official website 希望能对您有所启发!