2016-04-11 2 views
-1

Я новичок в React.js. Пытаясь понять жизненные циклы в React, я наткнулся на componentWillReceiveProps. Несмотря на то, что я завладел другими функциями, я все еще не в состоянии вычислить componentWillReceiveProps. Я создал небольшой фрагмент, где при каждом нажатии кнопки я увеличиваю переменную «val». Когда val становится кратным 5, я хочу изменить значение «увеличение», которое я не могу сделать.React testing 'componentWillReceiveProps'

Мой код:

var Increment = React.createClass({ 
    getInitialState: function() { 
    return {val: 0, increasing: false}; 
    }, 
    componentWillMount: function() { 
    console.log("componentWillMount"); 
    }, 
    componentDidMount: function() { 
    console.log("componentDidMount"); 
    }, 
    handleClick: function() { 
    console.log("inHandleClick"); 
    console.log(this.state.val); 
    this.setState({val: (this.state.val+1)}); 
    }, 
    componentWillReceiveProps : function(nextProps) { 
    this.setState({ 
     increasing: (nextProps.val > this.props.val) 
    }); 
    }, 
    shouldComponentUpdate: function(nextProps, nextState) { 
    return (nextState.val % 5 ==0) 
    }, 

    render: function() { 
    console.log(this.state.increasing); 
    return (
     <div> 
     <button onClick={this.handleClick}>{this.state.val}</button> 
     </div> 
    ); 
    } 
}); 


ReactDOM.render(<Increment />, mountNode); 

зацепки? Заранее спасибо

+0

'componentWillReceiveProps' не вызывается в вашем случае, потому что реквизит не меняется, изменяется только состояние. Возможно, вы хотели использовать 'componentWillUpdate'? Это будет вызвано, если реквизит или изменение состояния. – Aaron

+0

Аарон ... вы можете мне помочь с примером? –

+0

@SukhmeetSingh Я считаю, что вы в замешательстве между разницей состояния и реквизита в Реактировании. Возможно, вам стоит взглянуть на [это] (http://stackoverflow.com/questions/27991366/what-is-the-difference-between-state-and-props-in-react) – Calvin

ответ

1

См this fiddle

var IncrementButton = React.createClass({ 
    componentWillReceiveProps : function(nextProps) { 
    this.setState({ 
     increasing: (nextProps.val > this.props.val) 
    }); 
    }, 
    render: function() { 
    return (<button onClick={this.props.handleClick}>{this.props.val}</button>); 
    } 
}); 

var Increment = React.createClass({ 
    getInitialState: function() { 
    return {val: 0, increasing: false}; 
    }, 
    handleClick: function() { 
    console.log("inHandleClick"); 
    console.log(this.state.val); 
    this.setState({val: (this.state.val+1)}); 
    }, 
    shouldComponentUpdate: function(nextProps, nextState) { 
    return (nextState.val % 5 ==0) 
    }, 
    render: function() { 
    console.log(this.state.increasing); 
    return (
     <div> 
     <IncrementButton handleClick={this.handleClick} val={this.state.val}/> 
     </div> 
    ); 
    } 
}); 

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

(Благодаря @Aaron для более точного описания ниже) componentWillReceiveProps называется, если реквизит вашего компонента получить набор; обратите внимание, что это можно назвать даже при том, что реквизит не изменился по значению (вы, похоже, учитываете это с большим, чем чек). Поскольку вы хотите сравнить новое значение реквизита со старым значением, вам нужно, чтобы состояние было управляемым вне вашего компонента. Поэтому в этом примере я разбил ваш компонент на две части, извлекая кнопку.

+0

Хороший пример того, как вы * должен * сделать это, но ваше описание 'componentWillReceiveProps' неверно. 'componentWillRecieveProps' * только * вызывается, когда реквизиты установлены, а не« если ваш компонент повторно отображается ». В частности, исходный опубликованный код использовал 'setState' внутри, что вызывает вызов' render', но никогда не вызывает 'componentWillReceiveProps', потому что только * внутреннее состояние * только * изменилось. – Aaron

+0

Хм; Я смущен предупреждением о том, что Facebook на странице [Lifecycle] (https://facebook.github.io/react/docs/component-specs.html#updating-componentwillreceiveprops), которая гласит: «Одна распространенная ошибка для кода выполненный в течение этого жизненного цикла, чтобы предположить, что реквизит изменился ». - это звучит так, как компонентWillReceiveProps вызывается много раз, и только подмножество этих вызовов фактически отражает измененные реквизиты. – mjohnsonengr

+0

Правильно, ошибка предполагает, что, поскольку реквизиты были * установлены *, они каким-то образом изменились *, но они могут быть точно такими же реквизитами, что и раньше. Однако, если компонент только устанавливает * состояние *, он будет повторно рендерить, но он не будет * вызывать 'componentWillReceiveProps', так как * реквизиты * никогда не были установлены, было задано только состояние. Напротив, 'componentWillUpdate' будет вызываться, если * либо * реквизит или состояние были установлены. – Aaron

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