#javascript #reactjs #state
Вопрос:
У меня есть функция обработки, которая вызывается в другом компоненте. Это передает значение под названием данные, которые я хочу обновить в свой state
.
//basic code
initialState = {
wordCount:"Some Value"
text: "Some value"
}
class Home extends Component{
state = initialState;
handler(data){
console.log('Arrived',data)
this.setState({wordCount:data,text:GetText(data,this.state)});
this.validation();
}
validation(){
console.log(this.state.wordCount)
}
render(){
return (
<div><Component handlerFunc={this.handler.bind(this)}</div>
)
}
Распечатка data
в моей функции обработчика я действительно получаю правильную информацию в виде строки. Я использую setState для замены wordCount
начального значения на data
. Я делаю то же самое с text
. GetText возвращает строку.
Но когда выполняется проверка, мое состояние точно такое же. Как это могло случиться?
Ответ №1:
Примечание: setState в react является асинхронным.
Это означает, что нет никакой гарантии, что состояние изменится к следующему заявлению. Что вы можете сделать, чтобы избежать этого, так это то, что setState принимает обратный вызов, который будет вызван, когда состояние set завершится.
this.setState(
{
wordCount:data,
text:GetText(data,this.state)
},
() => {
// Gets called when setState updates the state
this.validation()
});
Комментарии:
1. ОК. Но проверка больше не вызывается (просто функция проверки). бревна
this.state.wordCount
. Я не вижу выхода, потому что я изменил это. Что я делаю не так?2. @BuddyBob У вас могут возникнуть проблемы с использованием
this
. Попробуйте получить доступ к состоянию внутри обратного вызова или используйте журнал консоли. Вы увидите, что состояние определенно изменится3. Со мной никогда не связывались
this
. Как это может быть неправильно. Кроме того, в моем обратном вызове я выполняю проверку. В котором есть console.log(). Похоже, что он никогда не запускается в первую очередь.4. @BuddyBob
Arrived
Печатается в форме консоли выше примера? Затем вы получите console.log() в коде. Если ничего нет, то вы, возможно, столкнулись с ошибкой вGetText(data,this.state)
этой функции. Попробуйте использовать обработчики ошибок и посмотрите, есть ли какие-либо ошибки5. Сумасшедшее право. Я вызываю GetText отдельно, отлично работает, когда я консолирую. запишите это в журнал. Поступившее также регистрируется. У меня болит мозг, лмао.