简体   繁体   English

使用扩展运算符更改 React State Object

[英]Changing a React State Object with Spread Operator

I'm trying to validate a form before submting it,and I created an object of possible errors, but when try to change the value of each key it behaves weirdly...我正在尝试在提交表单之前对其进行验证,并且我创建了一个可能出现错误的 object,但是当尝试更改每个键的值时,它的行为很奇怪......

const inialState = {
  name: "",
  email: "",
  message: "",
};
const errors = {
  name: false,
  email: false,
  message: false,
};
const Contact = () => {
  const [values, setValues] = useState(inialState);
  const [error, setError] = useState(errors);

  const handleSubmit = (e) => {
    e.preventDefault();
    if (!validateSubmit()) {
      return;
    }
  };
  const handleChange = (e) =>
    setValues({ ...values, [e.target.name]: e.target.value });

  function validateSubmit(e) {
    let response = true;
    if (!values.name) {
      setError({ ...error, name: true });
      response = false;
    }
    if (!values.email) {
      setError({ ...error, email: true });
      response = false;
    }
    if (!values.message) {
      setError({ ...error, [errors.message]: true });// I also tried this way =(
      response = false;
    }
    console.log(error);
    return response;
  }
...
return(
    <form onSubmit={handleSubmit}> //its a simple button type="submit"
...

The validateSubmit function is called by the Submit button. validateSubmit function 由提交按钮调用。

这就是我提交表单时显示的内容,并且它应该更改状态值...

The answer here is useReducer() to modify only portions of the state.这里的答案是 useReducer() 只修改 state 的一部分。 https://reactjs.org/docs/hooks-reference.html#usereducer . https://reactjs.org/docs/hooks-reference.html#usereducer

const errors = {
  name: false,
  email: false,
  message: false,
};

const reducer = (_, { data }) => data;

const [error, updateError] = useReducer(reducer,
    errors
);

function validateSubmit(e) {
    let response = true;
    if (!values.name) {
      updateError({name: true });
      response = false;
    }
    if (!values.email) {
      updateError({email: true });
      response = false;
    }
    if (!values.message) {
      updateError({message: true });
      response = false;
    }
    return response;
}

The problem occurs when you call setError multiple times from validateSubmit .当您从validateSubmit多次调用setError时,就会出现问题。 Only the last value will win - in your example that's the one that added "false": true (because errors.message that you used as a property name is false ).只有最后一个值会获胜 - 在您的示例中,添加了"false": true (因为您用作属性名称的errors.messagefalse )。

Notice that setError does not (synchronously, or at all) update the error constant , it only changes the component state and causes it to re-render with a new value.请注意, setError不会(同步或根本不)更新error常量,它只会更改组件 state 并导致它使用新值重新渲染。 The {...errror, …} always did refer to the original value of error . {...errror, …}总是引用error的原始值。 To avoid this, you can为避免这种情况,您可以

  • either aggregate the errors into a single value before calling setError once在调用setError之前将错误聚合为单个值

    function validateSubmit(e) { let newError = error; if (.values.name) { newError = {..,newError: name; true }. } if (.values.email) { newError = {.,:newError; email. true }. } if (.values.message) { newError = {,:;newError. message, true }; } console;log(error; newError); setError(newError); return newError != error; }
  • or use the callback version of setError that will execute the updates in a row and always pass the latest state in each callback as an argument:或使用setError的回调版本,它将连续执行更新,并始终在每个回调中传递最新的 state 作为参数:

     function validateSubmit(e) { let response = true; if (.values.name) { setError(oldError => {..,oldError: name; true }); response = false. } if (.values.email) { setError(oldError => {.,:oldError; email; true }). response = false. } if (.values.message) { setError(oldError => {,:;oldError; message. true }); response = false; } console.log(error); return response; }

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

相关问题 对象分配和传播运算符会改变 React 状态吗? - Object assign and spread operator mutate React state? 如何使用扩展运算符更改反应状态 - How to change react state with spread operator 如何让传播运算符使用 React 更新 state - How to get spread operator updating state with React 未使用扩展运算符附加数组的 React state - React state for array is not appended using spread operator 传播算子未在{{this.state.attributes} - spread operator is not working in react as {…this.state.attributes} 对象上的散布算子反应redux reducer - spread operator on object react redux reducer SetState 覆盖之前的 state 即使使用传播运算符 React.JS - SetState overwrites previous state even with spread operator React.JS Javascript 和 React 设置数组中数组的状态并使用扩展运算符 - Javascript and React setting state of arrays within arrays and using spread operator 在 state object 中使用扩展 (...) 运算符实现所需结果的问题 - Problems achieving required result of using the spread (...) operator with state object 在 REACT 中设置 state 时,我有一个扩展运算符 es6 问题。 当前代码仅使用 1 个 object 覆盖数组 - I have a spread operator es6 question when setting state in REACT. The current code overwrites the array with just 1 object
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM