2015-02-11 3 views
2

Я пытаюсь понять, как отправить новую переменную, если я использую состояние.Отправить реквизиты в состоянии - React

Это пример из React урока:

var Timer = React.createClass({ 
    getInitialState: function() { 
    return {secondsElapsed: 0}; 
    }, 
    tick: function() { 
    this.setState({secondsElapsed: this.state.secondsElapsed + 1}); 
    }, 
    componentDidMount: function() { 
    this.interval = setInterval(this.tick, 1000); 
    }, 
    componentWillUnmount: function() { 
    clearInterval(this.interval); 
    }, 
    render: function() { 
    return (
     <div>Seconds Elapsed: {this.state.secondsElapsed}</div> 
    ); 
    } 
}); 

React.render(<Timer />, mountNode); 

Он работает. Но если я хочу отправить secondsElapsed, что мне делать?

<Timer sec={this.props.sec}> и:

getInitialState: function() { 
    return {secondsElapsed: this.props.sec}; 
    } 

Это не работает.

JSFIDDLE - Я должен начать таймерную форму 10000 сек.

ответ

1

code ниже работает должным образом. Помимо того, что всегда есть значение по умолчанию для свойства initialTime, вы можете инициализировать состояние secondsElapsed в пределах getInitialState. Хотя это можно считать anti-pattern, в этом случае это не так, как это просто выполняется инициализация внутреннего состояния.

Кроме того, вам необходимо реализовать componentWillReceiveProps. Эта функция вызывается (после первого раза), когда реквизиты компонента были обновлены. В этом случае значение свойства initialTime было первоначально 10, а затем изменено на 10000. Итак, аргумент nextProps будет содержать объект с свойством initialTime, установленным на 10000.

var Timer = React.createClass({ 
    getInitialState: function() { 
    return { secondsElapsed: this.props.initialTime || 0 }; 
    }, 
    tick: function() { 
    this.setState({secondsElapsed: this.state.secondsElapsed + 1}); 
    }, 
    componentWillReceiveProps: function(nextProps) { 
     this.setState({ secondsElapsed: nextProps.initialTime || 0 }); 
    }, 
    componentDidMount: function() { 
    this.interval = setInterval(this.tick, 1000); 
    }, 
    componentWillUnmount: function() { 
    clearInterval(this.interval); 
    }, 
    render: function() { 
    return (
     <div>Seconds Elapsed: {this.state.secondsElapsed}</div> 
    ); 
    } 
}); 

Если вы могли бы передача строки в initialTime, как показано выше, убедитесь, что вы используете parseInt на значение:

return { secondsElapsed: parseInt(this.props.initialTime || '0') }; 

Узнайте больше о жизненном цикле компонента here.

+0

К сожалению, в моем случае 'initialTime' имеет начальное состояние и при загрузке из JSON. И 'initialTime' всегда' 0', а 'initialTime'. – AndryName

+0

'componentWillMount: function() {this.setState ({secondsElapsed: this.props.initialTime});}' тоже не помогает. – AndryName

+0

Посмотрите мой пример, пожалуйста - http://jsfiddle.net/3fZT2/144/ В примере я установил новое время - 10000 секунд. – AndryName

1

Заканчивать componentWillMount (http://facebook.github.io/react/docs/component-specs.html)

Это, если вы звоните в SetState componentWillMount вы гарантированно будет обновляться до его удара визуализации.

+0

Я попробовал 'componentWillUpdate: function() {console.log (1) this.setState ({secondsElapsed: this.props.duration}); \t}, 'Консольные отпечатки '1' 1200 раз. – AndryName

+0

Возможно, что-то не так в моем коде. – AndryName

+0

О, я попробовал 'componentWillUpdate'. Спасибо. – AndryName

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