形式作为功能组件与反应
Forms as functional components with react
如果我想制作一个包含表单的功能组件,例如登录,并且我想在 App 组件中包含状态,而 Login 将是它的子组件,我可以使用在登录子表单中?
是的。从 App
传递两个道具一个对象 data
和一个方法 onChange
到 Login
。
data
将为 Login
中的表单设置值。
如果 Login
表单有任何变化,则使用更新后的表单值触发 onChange
。
在 App
中处理它并更新其状态,然后它会向下流到 Login
作为 data
。
要从子组件修改父组件状态中的属性,您可以将函数作为 Prop 发送到子组件。
父组件:
class Parent extends React.Component {
// Parent state
this.state = {
someState: false
}
// This method will be sent to the child
handler = () => {
this.setState({ someState: true });
}
// Set the action property with the handler as value
render() {
return <Child action={this.handler} />
}
}
子组件:
// onClick executes the handler function set by the parent component
const Child = ({ action }) => (
<Button onClick={action} />
);
是的,这是可能的。您只需要将道具传递给您的子组件。以下是如何操作的示例:
// in parent component
handleChange(updatedData) {
this.setstate({
data: updatedData
})
}
// in render method
<Login handleChange={this.handleChange}/>
// in child component
// calling the handleChange function
this.props.handleChange(newData)
import React, {useState} from 'react';
function Submit() {
const [inputField , setInputField] = useState({
first_name: '',
last_name: '',
gmail: ''
})
const inputsHandler = (e) =>{
setInputField( {[e.target.name]: e.target.value} )
}
const submitButton = () =>{
alert(inputField.first_name)
}
return (
<div>
<input
type="text"
name="first_name"
onChange={inputsHandler}
placeholder="First Name"
value={inputField.first_name}/>
<br/>
<input
type="text"
name="last_name"
onChange={inputsHandler}
placeholder="First Name"
value={inputField.last_name}/>
<br/>
<input
type="gmail"
name="gmail"
onChange={inputsHandler}
placeholder="Gmail"
value={inputField.gmail}/>
<br/>
<button onClick={submitButton}>Submit Now</button>
</div>
)
}
export default Submit
使用类似
的东西
const payloadHandler = (e) => {
setPayload({ ...inputField, [e.target.name]: e.target.value });
};
Mehedi Setu
给出的解决方案会给出警告:组件正在将文本类型的受控输入更改为不受控制。
我updating the code
会remove
这个Warning
。
import React, {useState} from 'react';
function Submit() {
const [inputField , setInputField] = useState({
first_name: '',
last_name: '',
gmail: ''
})
const inputsHandler = (e) =>{
const { name, value } = e.target;
setInputField((prevState) => ({
...prevState,
[name]: value,
}));
}
const submitButton = () =>{
alert(inputField.first_name)
}
return (
<div>
<input
type="text"
name="first_name"
onChange={inputsHandler}
placeholder="First Name"
value={inputField.first_name}/>
<br/>
<input
type="text"
name="last_name"
onChange={inputsHandler}
placeholder="First Name"
value={inputField.last_name}/>
<br/>
<input
type="gmail"
name="gmail"
onChange={inputsHandler}
placeholder="Gmail"
value={inputField.gmail}/>
<br/>
<button onClick={submitButton}>Submit Now</button>
</div>
)
}
export default Submit
React中设置状态的过程是一个异步过程。因此即使函数被调用,values 也没有更新之前的状态。
要解决此问题,您可以使用 setState 的功能版本,其中 returns 前一个状态作为第一个参数。
使用下面的 代码 以从状态
中获取所有对象值
const inputsHandler = (e) => {
setInputField((inputField) => ({
...inputField,
[e.target.name]: e.target.value,
}));
};
如果我想制作一个包含表单的功能组件,例如登录,并且我想在 App 组件中包含状态,而 Login 将是它的子组件,我可以使用在登录子表单中?
是的。从 App
传递两个道具一个对象 data
和一个方法 onChange
到 Login
。
data
将为 Login
中的表单设置值。
如果 Login
表单有任何变化,则使用更新后的表单值触发 onChange
。
在 App
中处理它并更新其状态,然后它会向下流到 Login
作为 data
。
要从子组件修改父组件状态中的属性,您可以将函数作为 Prop 发送到子组件。
父组件:
class Parent extends React.Component {
// Parent state
this.state = {
someState: false
}
// This method will be sent to the child
handler = () => {
this.setState({ someState: true });
}
// Set the action property with the handler as value
render() {
return <Child action={this.handler} />
}
}
子组件:
// onClick executes the handler function set by the parent component
const Child = ({ action }) => (
<Button onClick={action} />
);
是的,这是可能的。您只需要将道具传递给您的子组件。以下是如何操作的示例:
// in parent component
handleChange(updatedData) {
this.setstate({
data: updatedData
})
}
// in render method
<Login handleChange={this.handleChange}/>
// in child component
// calling the handleChange function
this.props.handleChange(newData)
import React, {useState} from 'react';
function Submit() {
const [inputField , setInputField] = useState({
first_name: '',
last_name: '',
gmail: ''
})
const inputsHandler = (e) =>{
setInputField( {[e.target.name]: e.target.value} )
}
const submitButton = () =>{
alert(inputField.first_name)
}
return (
<div>
<input
type="text"
name="first_name"
onChange={inputsHandler}
placeholder="First Name"
value={inputField.first_name}/>
<br/>
<input
type="text"
name="last_name"
onChange={inputsHandler}
placeholder="First Name"
value={inputField.last_name}/>
<br/>
<input
type="gmail"
name="gmail"
onChange={inputsHandler}
placeholder="Gmail"
value={inputField.gmail}/>
<br/>
<button onClick={submitButton}>Submit Now</button>
</div>
)
}
export default Submit
使用类似
的东西const payloadHandler = (e) => {
setPayload({ ...inputField, [e.target.name]: e.target.value });
};
Mehedi Setu
给出的解决方案会给出警告:组件正在将文本类型的受控输入更改为不受控制。
我updating the code
会remove
这个Warning
。
import React, {useState} from 'react';
function Submit() {
const [inputField , setInputField] = useState({
first_name: '',
last_name: '',
gmail: ''
})
const inputsHandler = (e) =>{
const { name, value } = e.target;
setInputField((prevState) => ({
...prevState,
[name]: value,
}));
}
const submitButton = () =>{
alert(inputField.first_name)
}
return (
<div>
<input
type="text"
name="first_name"
onChange={inputsHandler}
placeholder="First Name"
value={inputField.first_name}/>
<br/>
<input
type="text"
name="last_name"
onChange={inputsHandler}
placeholder="First Name"
value={inputField.last_name}/>
<br/>
<input
type="gmail"
name="gmail"
onChange={inputsHandler}
placeholder="Gmail"
value={inputField.gmail}/>
<br/>
<button onClick={submitButton}>Submit Now</button>
</div>
)
}
export default Submit
React中设置状态的过程是一个异步过程。因此即使函数被调用,values 也没有更新之前的状态。 要解决此问题,您可以使用 setState 的功能版本,其中 returns 前一个状态作为第一个参数。
使用下面的 代码 以从状态
中获取所有对象值const inputsHandler = (e) => {
setInputField((inputField) => ({
...inputField,
[e.target.name]: e.target.value,
}));
};