2015-12-22 32 views
-2

請看看在這個非常簡單的例子爲什麼RN使用的setState時,它的功能就像forceUpdate

'use strict'; 
var React = require('react-native'); 
var { 
    AppRegistry, Text, TextInput, View 
} = React; 
var bString = 'b init'; 
var Example = React.createClass({ 
    getInitialState: function() { 
     return { 
      aString: 'a init', 
      cString: 'c init' 
     }; 
    }, 
    changedString: function(aEvent) { 
     bString = 'b changed'; 
     this.state.cString = 'c changed'; 
     this.setState((state) => { 
      return { 
       aString: 'a changed' 
      }; 
     }); 
    }, 
    render: function() { 
     return (
      <View style={{flex: 1}}> 
       <Text> 
        {this.state.aString}{'\r\n'}{bString}{'\r\n'}{this.state.cString} 
       </Text> 
       <Text onPress={this.changedString}> 
        Ppppppppppppppppppppp......press me 
       </Text> 
      </View> 
     ); 
    }, 
}); 
AppRegistry.registerComponent('Project16N',() => Example); 

我以爲只有aString移動屏幕上時changedString叫而被改變。但是當changedString被調用時,aString,bString,CString都發生了變化。那麼我們爲什麼要使用this.setState(balabala...)

爲什麼我們不使用this.forceUpdate呢?

setStateforceUpdate之間的區別是什麼?

回答

1

因爲您正在修改changedString函數中的cString對象。

作爲一個經驗法則,你永遠不應該在this.state直接修改什麼,你應該把它當作一成不變的,而是使用this.setState()修改,因爲你只是做可能會在以後的階段使用this.setState時,可以覆蓋突變狀態,並當你直接改變狀態時,通常會讓你更難以推斷你的應用。

docs有很好的解釋方法。

+0

爲什麼我不應該直接在this.state上修改任何內容? – tennist

相關問題