javascript - 如何使用useState钩子(Hook)同时设置多个状态?

标签 javascript reactjs

我想组合多个状态并使用 useState Hook 同时处理它们,请检查以下示例,该示例更新用户输入上的一些文本:

const {useState} = React;

const Example = ({title}) => {
  const initialState = {
    name: 'John',
    age: 25
  };
  const [{name, age}, setFormState] = useState(initialState);
  const handleNameChange = (e) => {
    setFormState({
      name: e.target.value,
      age
    });
  };
  const handleAgeChange = (e) => {
    setFormState({
      name,
      age: e.target.value
    })
  };
  return (
    <form onSubmit={e=>e.preventDefault()}>
      <input type='text' id='name' name='name' placeholder={name} onChange={handleNameChange} />
                <p>The person's name is {name}.</p>
                <br />
                <label htmlFor='age'>Age: </label>
                <input type='text' id='age' name='age' placeholder={age} onChange={handleAgeChange} />
                <p>His/her age is {age}.</p>
    </form>
  );
};

// Render it
ReactDOM.render(
  <Example />,
  document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react"></div>

代码运行良好,但正如你所看到的,我使用了 2 个函数来分别处理姓名和年龄,这违背了我保存一些代码的意图。是否可以仅使用 1 个函数分别更改姓名和年龄?尝试过这个,但显然它会用相同的值更新两者。

const {useState} = React;

const Example = ({title}) => {
  const initialState = {
    name: 'John',
    age: 25
  };
  const [{name, age}, setFormState] = useState(initialState);
  const handleChange = (e) => {
    setFormState({
      name: e.target.value,
      age: e.target.value
    });
  };
  return (
    <form onSubmit={e=>e.preventDefault()}>
      <input type='text' id='name' name='name' placeholder={name} onChange={handleChange} />
                <p>The person's name is {name}.</p>
                <br />
                <label htmlFor='age'>Age: </label>
                <input type='text' id='age' name='age' placeholder={age} onChange={handleChange} />
                <p>His/her age is {age}.</p>
    </form>
  );
};

// Render it
ReactDOM.render(
  <Example />,
  document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react"></div>

最佳答案

不可能使用单个 useState Hook 同时设置多个不同的状态。您可以单独设置它们, 示例:

const [userName, setUserName] = useState('');
const [password, setPassword] = useState('');

或者将所有状态放入一个对象中,并使用 useState Hook 更新该对象。 来源:https://daveceddia.com/usestate-hook-examples/ 示例:

const [form, setState] = useState({
  username: '',
  password: ''
});

const updateField = e => {
    setState({
      ...form,
      [e.target.name]: e.target.value
    });
  };

return (
    <form onSubmit={printValues}>
      <label>
        Username:
        <input
          value={form.username}
          name="username"
          onChange={updateField}
        />
      </label>
      <br />
      <label>
        Password:
        <input
          value={form.password}
          name="password"
          type="password"
          onChange={updateField}
        />
      </label>
      <br />
      <button>Submit</button>
    </form>
  );

关于javascript - 如何使用useState钩子(Hook)同时设置多个状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64805893/

相关文章:

javascript - 合并具有相同 "key"的 JSON 对象并使用 JavaScript 添加它们的 "value"

javascript - 使用 Javascript 调整图像大小而不在 DOM 上渲染 Canvas

html - 如何缩小 "spinkit"微调器以更好地融入我的文本大小?

javascript - 未定义 React 元素

reactjs - 添加 CSS 来响应创建的元素,例如 data-reactroot

javascript - 如果输入为空,请不要提交表单

javascript - 如何创建和读取 javascript 对象以保存以下数据结构?

javascript - 使用 Angular 将 Google 分析 ID 插入到脚本中

javascript - NextJS 中的状态管理

reactjs - 使用 Selenium 识别 ReactJS 网页上的元素,这是更好的方法吗?