2015-10-16 2 views
0

У меня очень странная проблема с функцией 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 перестает работать (не вызывая ошибку, она просто не обновляет состояние)

Я не могу понять, почему они не работают одинаково ... Для форматирования я бы хотел, чтобы оба они были одинакового стиля, но кажется, что они работают только при форматировании в любом стиле.

ответ

0

Так как он поворачивается, наш Array.prototype.push() ведет себя иначе, чем я ожидал, он возвращает длину массива с добавленным к нему новым элементом see mdn documentation.

Я был в основном сбросить мой список воспроизведения из [] в 1 и, конечно, числа не имеют функции толчок ...

Я не могу сказать, почему другой стиль форматирования сделал функцию, как и ожидалось ... The код, похожий на babelified, кажется, что он не должен работать (и не работал, когда я изменил другую функцию, чтобы выглядеть одинаково)

0

Я предполагаю, что previousState - это undefined, и что ваша проблема не вызвана расстоянием.

Как указано в react's component lifecycle doc, предыдущее состояние доступно только в определенных функциях:

  • shouldComponentUpdate(nextProps, nextState),
  • componentWillUpdate(nextProps, nextState) и
  • componentDidUpdate(prevProps, prevState)

Так что, если вы звоните ваши функции в других раз, previousState будет неопределенным.

+0

Как вы можете видеть в [документации setState] (https://facebook.github.io/react /docs/component-api.html), вы можете использовать функцию (или объект nextState) в качестве параметра для setState, эта функция вызывается с «предыдущей версией» (или currentState) и должна возвращать nextState. Также при форматировании одна и та же только одна из функций испытывает проблему, другая будет работать нормально, это говорит мне, что я должен правильно ее использовать (в противном случае оба не будут работать), но есть проблема в другом месте. –

+0

Вы правы. Пропустил это. Другая возможная проблема: путем вызова 'previousState.playlist.push()' Я думаю, что вы непосредственно также обновляете предыдущий элемент, который реагирует не нравится. Это может быть проблема? – wintvelt

+0

Mhhh это может быть ... но это ** делает ** работать, когда я строю свой код как этот 'this.setState ((previousState) => {плейлист: previousState.playlist.push (видео)});' I ' m собираюсь попробовать и удалить шаг uglify из моего процесса сборки и отладить файл пакета –

Смежные вопросы