2015-07-29 2 views
1

Я отправляю значения чисел из компонента «Числа» в «Основной компонент». Все работает нормально, пока я не установил это значение в моем основном компоненте в состояние этого компонента.Когда значение присваивается состоянию компонентов, почему console.log печатает предыдущее состояние?

var Numbers = React.createClass({ 
    handleClick: function(number){ 
     this.props.num(number) 
    }, 
    render: function(){ 
     return (
      <div> 
       <button onClick={this.handleClick.bind(null, 1)}>1</button> 
       <button onClick={this.handleClick.bind(null, 2)}>2</button> 
       <button onClick={this.handleClick.bind(null, 3)}>3</button> 
      </div> 
     ) 
    } 
}) 

var Main = React.createClass({ 
    getInitialState: function(){ 
     return { 
      number: 0 
     } 
    }, 
    handleCallback: function(num){ 
     console.log("number is right here: " + num); 
     this.setState({ 
      number: num 
     }) 
     console.log("but wrong here (previous number): " + this.state.number) 
    }, 
    render: function() { 
     return (
      <Numbers num={this.handleCallback} /> 
      //<SomeComponent number={this.state.number} /> 
     ) 
    } 
}); 

React.render(<Main />, document.getElementById('container')); 

Почему это так? Второй console.log в handleCallback функция печатает предыдущее число, а не номер, который находится в num параметр. Мне нужно, чтобы номер был в моем состоянии, потому что я отправлю его немедленно в качестве реквизита в моем SomeComponent компоненте.

https://jsfiddle.net/69z2wepo/13000/

ответ

5

От docs:

SetState() не сразу мутировать this.state но создает состояние отложенного перехода. Доступ к this.state после вызова этого метода может потенциально вернуть существующее значение. Существует нет гарантия синхронной работы вызовов на setState, и вызовы могут быть отправлены на для повышения производительности.

Если вы хотите напечатать изменения после вызова setState, используйте дополнительный параметр обратного вызова:

this.setState({ 
    number: num 
}, function() { 
    console.log(this.state.number); 
}); 
+0

Как бы вы решить вне проблема с 'SomeComponent' ? Теперь я понимаю, почему он не работает, но я понятия не имею, как передать состояние в качестве реквизита только тогда, когда this.state был обновлен. Могу ли я каким-то образом обернуть это '}' для обратного вызова или чего-то еще? – StrangeManInMask

+0

Изменение состояния компонента или реквизита заставляет повторную визуализацию, если вы не внедрили 'shouldComponentUpdate', чтобы сказать об этом иначе. Таким образом, как только состояние изменилось в '

', оно будет повторно отображать и передать новое число '' SomeComponent /> 'в качестве новой опоры. Если вы внедрили 'componentWillReceiveProps' в' ', вы увидите номер в полученных реквизитах. Имеет ли это смысл? Или вы хотите, чтобы я изменил свой ответ и углубился? –

+0

Вы можете углубиться, если у вас есть время/интерес. Я бы очень благодарен. Моя проблема с '' заключается в том, что она не ждет переопределения '

' (я полагаю ..), поэтому правильное значение из состояния не отправляется. Я не знаю, как реализовать этот обратный вызов, который вы показали для этого. Возможно, это объясняет немного лучше: https://jsfiddle.net/69z2wepo/13007/ – StrangeManInMask

1

Вероятно потому, что console.log срабатывает до того, как новое состояние было действительно установлено.

Вы должны функция:

ComponentDidUpdate: function() { 
    console.log(this.state.number); 
} 

Эта функция вызывается каждый раз, когда состояние обновляется. Надеюсь, что это помогает

1

Метод SetState асинхронный, так что новое государство пока не существует на console.log вызов. Вы можете передать обратный вызов в качестве второго параметра для setState и вызвать console.log. В этом случае значение будет правильным.

1

В документации функции setState интересное примечание:

SetState() не сразу мутировать this.state но создает отложенный переход состояния. Доступ к this.state после вызова этого метода может потенциально вернуть существующее значение.

https://facebook.github.io/react/docs/component-api.html

0

Для печати госномер в использовании консоли

this.setState({ 
     number: num 
    },function(){console.log("but wrong here (previous number): " + this.state.number)}) 

вместо

this.setState({ 
     number: num 
    }) 
    console.log("but wrong here (previous number): " + this.state.number) 

Вкратце: используйте

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