简体   繁体   English

如何在功能组件中像在类组件中一样制作 onChange 跟踪功能

[英]How to make onChange tracking function in functional component as in class component

Here is my class component这是我的类组件

handleChange =(e) => {
   this.setState({
       [e.target.id]: e.target.value
   })
}

<div className="input-field">
            <label htmlFor="email">Email</label>
            <input type="email" id="email" onChange={this.handleChange}/>
 </div>
 <div className="input-field">
            <label htmlFor="password">Password</label>
            <input type="password" id="password" onChange={this.handleChange}/>
 </div>

As you can see we can track all the input with one function component.如您所见,我们可以使用一个功能组件跟踪所有输入。

But how to get the same result as that inside the functional component?但是如何得到与函数组件内部相同的结果呢? Now I am setting state for each element.现在我正在为每个元素设置状态。

<div className="input-field">
          <label htmlFor="email">Email</label>
          <input type="email" id="email" onChange={e =>setEmail(e.target.value)}/>
       </div>
 <div className="input-field">
          <label htmlFor="password">Password</label>
          <input type="password" id="password" onChange={e => setPassword(e.target.value)}/>
 </div>

The update is similar.更新类似。 Given some state, data for example, then a handler may look like:给定一些状态,例如data ,处理程序可能如下所示:

const handleChange = (e) => {
  const { id, value } = e.target;
  setData((data) => ({
    ...data,
    [id]: value
  }));
};

Use a functional state update to spread in the existing state and use the input's id and value from the onChange event to update that section of state.使用功能状态更新在现有状态中传播,并使用来自onChange事件的输入的 id 和值来更新该部分状态。

编辑 how-to-make-onchange-tracking-function-in-functional-component-as-in-class-compo

Full code example完整代码示例

function App() {
  const [data, setData] = useState({});

  const handleChange = (e) => {
    const { id, value } = e.target;
    setData((data) => ({
      ...data,
      [id]: value
    }));
  };

  return (
    <div className="App">
      <div className="input-field">
        <label htmlFor="email">Email</label>
        <input type="email" id="email" onChange={handleChange} />
      </div>
      <div className="input-field">
        <label htmlFor="password">Password</label>
        <input type="password" id="password" onChange={handleChange} />
      </div>

      <div>Email: {data.email}</div>
      <div>Password: {data.password}</div>
    </div>
  );
}
const [input, setInput] = useState({email:"", password:""})

<div className="input-field">
            <label htmlFor="email">Email</label>
            <input type="email" id="email" value={input.email} 
            onChange={e => setInput({...input,[e.target.id]: e.target.value}}/>
 </div>
 <div className="input-field">
            <label htmlFor="password">Password</label>
            <input type="password" id="password" value={input.password} 
             onChange={e => setInput({...input,[e.target.id]: e.target.value}}/>
 </div>

You can try this code.你可以试试这个代码。 In this way you can handle both inputs using same state without handler通过这种方式,您可以在没有处理程序的情况下使用相同的状态处理两个输入

declare one state containing both email and pasword for your functional component as below :为您的功能组件声明一种包含电子邮件和密码的状态,如下所示:

let [loginInfo, setLoginInfo] = useState({email:'',password:''})

handleChange =(e) => {
    setLoginInfo({
       ...loginInfo,
       [e.target.id]: e.target.value
    })    

}

you form你形成

<div className="input-field">
    <label htmlFor="email">Email</label>
    <input type="email" id="email" onChange={handleChange}/>
     </div>
<div className="input-field">
    <label htmlFor="password">Password</label>
    <input type="password" id="password" onChange={handleChange}/>
</div>

You can create object of form input and assign it to a state like below您可以创建表单输入的对象并将其分配给如下状态

const [formInput, setFormInput] = useState({
    email: "",
    password: ""
  });

And set it like this并像这样设置

const handleChange = (e) => {
    setFormInput((prevState) => ({
      ...prevState,
      [e.target.id]: e.target.value
    }));
  };

See this codesandbox code查看此代码和代码

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM