首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在功能组件中像在类组件中一样实现onChange跟踪功能

如何在功能组件中像在类组件中一样实现onChange跟踪功能
EN

Stack Overflow用户
提问于 2020-11-04 17:01:38
回答 4查看 53关注 0票数 0

下面是我的类组件

代码语言:javascript
复制
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>

如你所见,我们可以用一个函数组件跟踪所有的输入。

但是如何获得与功能组件内部相同的结果呢?现在我正在为每个元素设置状态。

代码语言:javascript
复制
<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>
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-11-04 17:09:29

更新也是类似的。给定某种状态,例如data,则处理程序可能如下所示:

代码语言:javascript
复制
const handleChange = (e) => {
  const { id, value } = e.target;
  setData((data) => ({
    ...data,
    [id]: value
  }));
};

使用函数状态更新来扩展现有状态,并使用来自onChange事件的输入的id和值来更新该状态部分。

完整代码示例

代码语言:javascript
复制
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>
  );
}
票数 1
EN

Stack Overflow用户

发布于 2020-11-04 17:09:34

代码语言:javascript
复制
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>

你可以试试这段代码。通过这种方式,您可以使用相同的状态来处理这两个输入,而无需处理程序

票数 1
EN

Stack Overflow用户

发布于 2020-11-04 17:09:47

为您的功能组件声明一个同时包含电子邮件和密码的状态,如下所示:

代码语言:javascript
复制
let [loginInfo, setLoginInfo] = useState({email:'',password:''})

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

}

你的表单

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64676955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档