2017-09-24 3 views
0

私は状態を設定しようとしていますし、設定した直後に現在の状態で別の関数を呼び出しています。this.setState not working

は、私がコード私はちょうど更新された状態でthis.createDataSource(this.state)を呼び出したい

this.setState({ 
     candidates : diCandi 
    },()=>{ 
     this.createDataSource(this.state) 
     console.log("The state is=>",this.state); 
    }); 

のこの種を持っています。 それは働かない私はなぜ思う。私が間違っていることは何ですか?

私は状態をログアウトするときにInfact。ログにコードが表示されることはありません。

+1

_not working_では情報が不十分です。あなたの問題にもっと文脈を与えてください。何かエラーや奇妙な動作が発生した場合は、質問に追加してください。 – bennygenel

+1

これはうまくいくはずですが、コールバックのポイントは、状態が更新されるまで(非同期になる可能性があるため)、トリガーされないということです。スタックスニペット( '[<]]'ツールバーボタン)を使用して、問題を示す**実行可能** [mcve]で質問を更新してください。スタックスニペットはJSXを含むReactをサポートします。 [これを行う方法はこちら](http://meta.stackoverflow.com/questions/338537/)。 –

+0

は、「動作していない」ものを明確にします。 'createDataSource'の中からログインして、状態が新しいかどうかを調べることができます。だからあなたは働いていないものを見つける必要があります。 – Panther

答えて

1

class App extends React.Component{ 
 
    constructor(props){ 
 
    super(props) 
 
    this.state = { candidates: "no candidates" } 
 
    } 
 
    
 
    shouldComponentUpdate(){ 
 
    return false; 
 
    } 
 
    
 
    buttonClick(e){ 
 
    this.setState({candidates: "diCandi"},() => console.log("updated")) 
 
    } 
 
    
 
    render(){ 
 
    return(
 
    <div> 
 
     <button onClick={this.buttonClick.bind(this)}>set candidates</button> 
 
     <b>{this.state.candidates}</b> 
 

 
     </div> 
 
    ) 
 
    } 
 
} 
 

 
const MOUNT_NODE = document.getElementById('container') 
 
ReactDOM.render(<App />, MOUNT_NODE)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="container">

サーガル、this.setStateにコールバック(によって前述のようにコードが動作するはず)状態が設定された後のみにキック。コールバックは、あなたがcreateDataSourceにすべての状態を送信shouldComponentUpdateが偽

-2

はこれを試してみてください。

this.setState({ 
    candidates : diCandi 
}).then(()=>{ 
    this.createDataSource(this.state) 
    console.log("The state is=>",this.state); 
}); 

this.setState()は非同期関数です。

+0

ありがとうございました – henrybbosa

1

を返している場合でも動作します、あなたはまた、

this.setState({ 
    candidates : diCandi 
},()=>{ 
    this.createDataSource() 
    console.log("The state is=>",this.state.candidates); 
}); 
のparamsとしてそれを送信しない createDataSource方法から状態にアクセスすることをお勧めします

this.setState({ 
    candidates : diCandi 
},()=>{ 
    this.createDataSource(this.state.candidates) 
    console.log("The state is=>",this.state.candidates); 
}); 

を行うことができますcreateDataSource

createDataSource() { 
    this.state.candidates 
    .... rest of code 
} 
で、その後