请看一下这个非常简单的例子
'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
?
为什么我们不使用setState
呢?
forceUpdate
和section {
float: left;
margin-right: 5%;
margin-left: 5%;
width: 55%;
padding-top: 10px;
}
aside {
margin-right: 5%;
width: 40%;
margin-left: 5%;
padding-top: 10px;
float: right;
}
footer {
height: 30px;
background-color: #ca171b;
border-radius: 10px;
border-bottom-style: groove;
border-bottom-color: rgba(0,0,0,1);
border-bottom-width: 8px;
border-left-style: ridge;
border-left-color: rgba(0,0,0,1);
border-left-width: 3px;
border-right-width: 3px;
border-right-style: ridge;
border-right-color: rgba(0,0,0,1);
font-family: "Arial Rounded MT Bold";
font-size: 1.2em;
color: #FFFFFF;
text-align: center;
font-weight: bold;
margin: 5%;
padding-top: 5px;
padding-bottom: 5px;
z-index: 1;
}
之间的区别在哪里?
答案 0 :(得分:2)
因为您正在changedString
函数中修改this.state
对象。
根据经验,你永远不应该直接修改this.setState()
上的任何内容,你应该将它视为不可变的,而是使用this.setState
修改状态,因为你刚才使用的突变可能会被覆盖do shell script
在稍后阶段,当你直接改变状态时,通常会更难推断你的申请。
docs有一个很好的解释方法。