состояние не обновляется внутри указанной функции

#react-native

#react-native

Вопрос:

Итак, я пытаюсь изменить свое состояние следующим образом

 export default function RegisterScreen({navigation}) {
  const {register, control, handleSubmit, errors} = useForm({
    resolver: yupResolver(schema),
  });
  const [state, setState] = useState({current_state: 'initial'});

  const onSubmit = (data) => {
    console.log(state.current_state);
    setState({current_state: 'login_process'});
    console.log(state.current_state);
  });
}
  

внутри при отправке. но состояние не меняется, оно застряло initial

затем я пытаюсь сделать это

    console.log(this.state.current_state);
    this.setState({current_state: 'login_process'}, () => {
      console.log(this.state.current_state);
    });
  

но я получаю эту ошибку

Возможное отклонение необработанного обещания (id: 0): ошибка типа: неопределенный не является объектом (вычисление ‘_this.state.current_state’)

как я могу это исправить? и правильно ли это управлять состоянием в react native?

Ответ №1:

Вы не можете выполнять асинхронные действия с помощью useState hook. Если вы хотите инициировать изменения, попробуйте что-то вроде этого:

 export default function RegisterScreen({navigation}) {
  const {register, control, handleSubmit, errors} = useForm({
    resolver: yupResolver(schema),
  });
  const [state, setState] = useState({current_state: 'initial'});

  useEffect(() => {
    console.log(`state.current_state has been changed to: ${state.current_state}`)
  }, [state.current_state])

  const onSubmit = (data) => {
    console.log(state.current_state);
    setState({current_state: 'login_process'});
    console.log(state.current_state);
  });
}
  

Ошибка, которую вы получаете, заключается в том, что вы не можете использовать this в функциональных компонентах.

Вы можете пойти дальше со своим useEffect хуком и сделать что-то вроде этого:

 useEffect(() => {
  if(state.current_state === 'login_process') {
    // add some logic that should happen when login is processing
  }
}, [state.current_state])
  

Комментарии:

1. благодаря вам это работает. Но у меня есть дополнительный вопрос, почему я не могу получить значение state.current_state напрямую? Я хочу сделать это, если состояние загружается, я хочу отключить кнопку, я сделал неправильный подход?

Ответ №2:

Я думаю, что проблема не в коде, а в том, что не ставится e.preventDefault()

попробуйте выполнить следующее:

      const onSubmit = (e,data) => {
        e.preventDefault()
      console.log(state.current_state);
      setState({current_state: 'login_process'});
      console.log(state.current_state);
    });
  }