У меня очень странная проблема с функцией setState от Reactjs. Кажется, я хочу, чтобы я структурировал фрагменты своего кода очень определенным образом, иначе это не сработает. Я понятия не имею, почему это вызывает проблему, поскольку обе структуры выглядят одинаково для меня, но ведут себя по-разному.Strange Reactjs setState поведение
Я использую Browserify и Babelify для пересылки и gulp-uuglify, чтобы минимизировать мой код. Может быть, что одна или комбинация этих шагов здания вызывает проблему, но я не могу сказать, какой (и, следовательно, я также не знаю, если и где подать вопрос)
Вот соответствующий раздел моего код:
export default class VideoAppScreen extends React.Component {
constructor(props) {
super(props);
this.state = {
playing: 0,
playlist: []
};
}
addVideo(video) {
this.setState((previousState) => {
return {playlist: previousState.playlist.push(video)};
});
}
onEnd(event) {
console.log("onEnd", event, this.state);
this.setState((previousState) => {
return {playing: previousState.playing + 1};
});
}
render() {
// stuff
}
}
Как вы можете видеть SetState блоки отформатированный как это:
this.setState((previousState) => {
return {item: value};
});
Как это метод addVideo вызывает ошибку: Uncaught TypeError: t.playlist.push is not a function
.
Если я изменяю блоки, чтобы быть похожим на это:
this.setState((previousState) => {item: value});
addVideo метод работает, но метод OnEnd перестает работать (не вызывая ошибку, она просто не обновляет состояние)
Я не могу понять, почему они не работают одинаково ... Для форматирования я бы хотел, чтобы оба они были одинакового стиля, но кажется, что они работают только при форматировании в любом стиле.
Как вы можете видеть в [документации setState] (https://facebook.github.io/react /docs/component-api.html), вы можете использовать функцию (или объект nextState) в качестве параметра для setState, эта функция вызывается с «предыдущей версией» (или currentState) и должна возвращать nextState. Также при форматировании одна и та же только одна из функций испытывает проблему, другая будет работать нормально, это говорит мне, что я должен правильно ее использовать (в противном случае оба не будут работать), но есть проблема в другом месте. –
Вы правы. Пропустил это. Другая возможная проблема: путем вызова 'previousState.playlist.push()' Я думаю, что вы непосредственно также обновляете предыдущий элемент, который реагирует не нравится. Это может быть проблема? – wintvelt
Mhhh это может быть ... но это ** делает ** работать, когда я строю свой код как этот 'this.setState ((previousState) => {плейлист: previousState.playlist.push (видео)});' I ' m собираюсь попробовать и удалить шаг uglify из моего процесса сборки и отладить файл пакета –