#reactjs
#reactjs
Вопрос:
Мое состояние не задано вовремя или не задано вообще. Вот функция, предназначенная для его изменения:
onChangeHandler(event){
this.setState({
selectedFile: event.target.files[0],
loaded: 0,
}
console.log(`this is the state ${this.state.selectedFile}`)
})
Комментарии:
1. какую версию react вы используете? я бы порекомендовал вам ознакомиться с документацией по реализации «новых» хуков reactjs.org/docs/hooks-intro.html 👌
2. Вам не хватает
}
послеloaded: 0,
?3.
setState
является асинхронным. Есть много других вопросов по stack overflow, которые задают именно об этом.4. Другие комментаторы, я думаю, что это может быть опечаткой, и
function
предполагается, что это часть[callback]
подписиsetState
вызова.5. Извините, мне придется обновить функцию. На самом деле, я видел решение в stackoverflow, и оно тоже не сработало. Я установлю его в исходный код, который, к сожалению, тоже вызывает те же проблемы.
Ответ №1:
setState
является асинхронным, как сказал комментатор. Предоставьте ему обратный вызов, и это сработает:
onChangeHandler(event){
this.setState(
{
selectedFile: event.target.files[0],
loaded: 0,
},
() => console.log(`this is the state ${this.state.selectedFile}`)
)
}
Но у меня такое чувство, что вы задали этот вопрос, потому что у вас другая проблема…
Комментарии:
1. По сути, это часть проблемы. Я пытаюсь отправить файл setState, предназначенный для обновления в api, но он ничего не отправляет. Моя консоль. журнал, очевидно, показывает, что он тоже не обновляется; так как он всегда отображает начальное значение null.
2. @MarvelousIkechi
I'm trying to send the file setState is meant to update to an api, but it doesn't send anything
— не ошибитесь, ваше состояние обновляется. Но теперь вы говорите об отдельной проблеме — вы не опубликовали никакого кода, который выполняет запрос API при изменении состояния.
Ответ №2:
У вас была опечатка в вашем коде. Вы пытались использовать сигнатуру обратного вызова setState
, но фактически делали функцию частью объекта, который вы установили в новое состояние (что в любом случае должно было вызвать ошибку).
const {
Component,
createElement
} = React;
const {
render
} = ReactDOM;
class MyComponent extends Component {
constructor(props) {
super(props);
}
/* yours
onChangeHandler(event){
this.setState({
selectedFile: event.target.files[0],
loaded: 0,
},
console.log(`this is the state ${this.state.selectedFile}`)
}),
*/
/* mine */
onClickHandler() {
this.setState(
{
count: Date.now()
},
() => console.log(`State has been set: ${this.state.count}`)
);
}
render() {
return createElement("button", {
onClick: () => {
this.onClickHandler();
}
}, "Click Me");
}
}
const App = () => {
return createElement("div", null,
createElement(MyComponent)
);
};
render(
createElement(App),
document.getElementById('app')
);
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="app"></div>
Ответ №3:
Используйте функцию обратного вызова для регистрации сообщения. ` //setState(средство обновления, [обратный вызов])
onChangeHandler(event){
this.setState({
selectedFile: event.target.files[0],
loaded: 0
},
console.log(`this is the state ${this.state.selectedFile}`));
}