Почему в этом случае мне нужно вызывать функцию со стрелкой для состояния обновления?

#reactjs #react-hooks

#reactjs #реагирующие хуки

Вопрос:

У меня есть этот код для проверки пароля и электронной почты:

  const [register, setRegister] = useState({
        email: '',
        password: '',
        error: '',
        validation: []
    })

    function validate (e) {
        let valid = true
    
        setRegister((register) => ({ ...register, validation: [] }))
    
        if (register.email === '') {
          setRegister((register) => ({ ...register, validation: register.validation.concat('E-mail is required') }))
          valid = false
        }
    
        if (register.password === '') {
          setRegister((register) => ({ ...register, validation: register.validation.concat('Password is required') }))
          valid = false
        }
    
        return valid
      }
 

Почему мне нужно использовать

 setRegister((register) => ({ ...register, validation: register.validation.concat('E-mail is required') }))
 

вместо

 setRegister({ ...register, validation: register.validation.concat('E-mail is required') })
 

чтобы добавить проверку электронной почты и пароля в проверку массива?

Ответ №1:

setRegister это асинхронный метод, поэтому вы не можете сразу получить обновленное значение register after setRegister . Итак, вместо того, чтобы передавать параметр непосредственно в setRegister, вам нужно передать параметр обратного вызова с prevstate .

Давайте предположим, что оба register.email и register.password пусты, поэтому мы должны настроить register для проверки электронной почты и пароля. После первого setRegister, содержащего только параметры, register не будет обновляться немедленно, поэтому второе setRegister будет основано на начальном register значении, а не на значении проверки, требуемом по электронной почте register .

Если мы используем обратный вызов с предыдущим состоянием, он основан не на register значении во время вызова setRegister , а на предыдущем register состоянии. Таким образом, в конечном итоге register будет обновлен как адрес электронной почты, так и требуемый пароль.

Обратитесь к ссылке на API Hooks