形式作为功能组件与反应

Forms as functional components with react

如果我想制作一个包含表单的功能组件,例如登录,并且我想在 App 组件中包含状态,而 Login 将是它的子组件,我可以使用在登录子表单中?

是的。从 App 传递两个道具一个对象 data 和一个方法 onChangeLogindata 将为 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 coderemove这个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,
    }));
  };