2017-02-03 45 views
8

同步替代根據所docs的交代:是否有的setState的()中Reactjs

的setState()不立即發生變異this.state但創建待狀態轉移。調用此方法後訪問this.state可能會返回現有值。

無法保證對setState的調用進行同步操作,並且可能會調用調用以提高性能。

因此,由於setState()是異步的並且不能保證其同步性能。是否有同步的setState()替代方案?

例如

//initial value of cnt:0 
this.setState({cnt:this.state.cnt+1}) 
alert(this.state.cnt); //alert value:0 

由於alert值前值那麼什麼是將使用setState()alert value:1替代。

有幾個關於Stackoverflow的問題,它與此問題類似,但沒有找到正確的答案。

+2

爲什麼需要它? –

回答

16

正如您從文檔中閱讀的那樣,沒有可用的替代方案,因爲所描述的原因是性能提升。

不過,我想你想執行一個動作,你已經改變了你的狀態後,你可以通過實現這一點:

class MyComponent extends React.Component { 
 
    constructor(props) { 
 
    super(props); 
 
    this.state = { 
 
    x: 1 
 
    }; 
 
    
 
    console.log('initial state', this.state); 
 
    } 
 
    
 
    updateState =() => { 
 
    console.log('changing state'); 
 
    this.setState({ 
 
     x: 2 
 
    },() => { console.log('new state', this.state); }) 
 
    } 
 
    
 
    render() { 
 
    return (
 
     <div> 
 
     <a onClick={this.updateState}>Change state</a> 
 
    </div> 
 
    ); 
 
    
 
    } 
 
} 
 

 
ReactDOM.render(
 
    <MyComponent />, 
 
    document.getElementById("react") 
 
);
<div id="react"></div> 
 
<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>

+0

你可以舉個例子 –

2

不,沒有。 React會在它認爲合適的時候更新狀態,做一些事情,比如爲了提高效率而一起調用setState。你可能會感興趣的是,你可以將一個函數傳遞給setState,它取得了之前的狀態,所以你可以選擇你熟悉前一個狀態的新狀態。

0

簡短回答你的問題是 - 沒有,反應沒有同步方法setState

0

我能夠欺騙反應生成調用setState同步將我的代碼包裝在setTimeout(() => {......this.setState({ ... });....}, 0);中。由於setTimeout將東西放在JavaScript事件隊列的末尾,我認爲React檢測到setState在其中,並且知道它不能依賴批量調用setState調用(它將被添加到隊列末尾)。

0

如果這是必需的,我會建議在你的setState函數中使用回調函數(我也建議使用函數setState)。

回調將在狀態更新後調用。

例如,您的例子是

//initial value of cnt:0 
this.setState(
    (state) => ({cnt: state.cnt+1}), 
    () => { alert(this.state.cnt)} 
) 

按照文件在這裏:https://facebook.github.io/react/docs/react-component.html#setstate

注:官方文件說,「一般來說,我們建議使用componentDidUpdate()這樣的邏輯來代替。「

1

是的,有與我們可以使我們同步的setState方法。但它的性能也許並不好,因爲通常 例如,我們有

class MyComponent extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
    data: 0 
    }; 
    } 

    changeState(){ 
    console.log('in change state',this.state.data); 
    this.state.data = 'new value here' 
    this.setState({}); 
    console.log('in change state after state change',this.state.data); 
    } 

    render() { 
    return (
     <div> 
     <p>{this.state.data}</p> 
     <a onClick={this.changeState}>Change state</a> 
    </div> 
    ); 

    } 
} 

在這個例子中,我們首先改變狀態然後渲染我們的組件。

+0

你永遠不應該發生變異狀態直接這樣。參見[該文檔(https://reactjs.org/docs/react-component。 html#state) –

+0

@ScottSilvi是的,我知道這就是爲什麼我說「性能可能不是g通常情況下「。如果你想申請,我只舉了一個例子。 –