2017-10-08 15 views
0

setStateが非同期アクションであることがわかっているので、componentWillReceivePropsがトリガーされる前に状態値が更新されていることを確認するために同期呼び出しを行いました。このコードは私の子要素に書かれています。私は親要素で何かすることがあるのだろうか?それとも他の理由があるのだろう?私はあなたのsetState呼び出しで誤った;を前提とした場合、以下の問題のタイプミスであり、実際のコードではないが、問題はここにある私のコードsetStateが反応した後に状態値が変更されない

constructor(props) { 
    super(props); 
    this.state = { 

     loading: false, 
     yearValue:Number(localStorage.getItem('year'))//this is 2019 

    }; 
    } 
    componentDidMount() { 

    } 
    componentWillReceiveProps(nextProps) { 
    console.log(
     'before if condition...', 
     nextProps, 
     Number(localStorage.getItem('year')) 
    ); 
    if (
     this.state.yearValue === 
     Number(localStorage.getItem('year')) //this condition satisfied twice before it changed the value 
    ) { 
     console.log('inside if condition.....', nextProps); 
     this.setSstate = { 

     loading: false 
     }; 
    } else this.setState({ loading: false }); 
    } 
    updatePrograValues = year => {//year = 2017 
    if (year === Number(localStorage.getItem('year'))) { 
     this.props.showPlanYearValues(year); 
    } else { 


     this.setState({ 

     loading: true 
     },this.props.tooltipRefresher()); 
    } 
    }; 

答えて

2

です:

this.setState({ 
    loading: true 
},this.props.tooltipRefresher()); 

ことthis.props.tooltipRefresher()を呼び出し、戻り値をsetStateに渡します。正確にはfoo(bar())を呼び出してbarを呼び出し、その戻り値をfooに渡します。

状態値を更新した後に、それが呼ばれるようにするために、あなたが意図した場合は、それを呼び出しじゃないので、それから()を削除するには、状態があるときにsetStateがそれを呼び出しますsetStateにそれを渡していますセット:

this.setState({ 
    loading: true 
},this.props.tooltipRefresher); 
// No() --------------------^ 

それは(tooltipRefresherthisthis.propsことを期待し、例えば)thisの値に敏感だ場合は、bindが必要な場合があります

this.setState({ 
    loading: true 
},this.props.tooltipRefresher.bind(this.props)); 

...または矢印機能:

this.setState({ 
    loading: true 
},() => this.props.tooltipRefresher()); 
+0

申し訳ありませんが、あなたはより多くのことを詳しく説明してくださいすることができます。私は 'tooltipRefresher'から戻ってきたものがすべて州に戻ると言っていましたか? – LowCool

+1

setStateに関数を渡す必要があります。この関数は、状態が更新され、コンポーネントが再レンダリングされた後に呼び出されます。現在、実際に呼び出すので、関数tooltipRefresherから返される値を渡しています。カッコを削除した場合は、実際の関数を渡すことになり、問題は解決されます。 – dostu

+0

oohh..Bindをいつ使うべきかを真剣に調べる必要があります。 – LowCool

関連する問題