#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);
});
}