React Native - 状态设置setState()方法使用详解(附:最简写法)
作者:hangge | 2017-08-03 08:10
当需要 React Native 重新渲染 UI 时,我们使用最多的应该就是 setState 函数了。本文对 setState 的使用做个总结。
1,setState 介绍
React Native 框架使用 setState 函数来合并状态机变量。setState 函数的原型是:
setState(oldState, callback)
(1)setState 函数会将传入函数的返回值与当前状态机做一个合并操作:
- 名称相同的变量就用新值覆盖老的。
- 有新增加的变量则直接增加。
- 原来就有的状态机变量,但本次没有赋新值则保证不变。
(2)当我们调用 this.setState 函数要求重新渲染 UI 界面时,React Natvie 并不是立刻就开始重新渲染。而是会先想一想如何才能高效地重新渲染界面,然后尽快去渲染。
(3)setState 函数第二个参数(callback)是可选的,它将在 setState 完成并重新渲染完成后被调用。
2,setState 使用样例
下面是 setState 使用样例,当输入框文字改变时会自动修改状态机变量,同时输入框下方实时统计出输入文字的个数。

样例中 setState 函数以及方法调用都使用最完整的写法。
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
TextInput,
} from 'react-native';
//默认应用的容器组件
class App extends Component {
//构造函数
constructor(props) {
super(props);
this.state = {text: ''};
}
//输入框文字改变时会调用
updateText(newText) {
this.setState((oldState) => {
console.log(oldState);//老的状态值
return {
text: newText
}
}, this.updateTextDone)
}
//文字状态值改变,界面渲染完毕后调用
updateTextDone() {
console.log("文字状态值改变,界面渲染完毕!");
}
render() {
return (
<View style={[styles.flex, styles.topStatus]}>
<TextInput style={styles.input}
onChangeText={ (newText) => this.updateText(newText) }/>
<Text style={styles.tip}>已输入{this.state.text.length}个文字</Text>
</View>
);
}
}
//样式定义
const styles = StyleSheet.create({
flex:{
flex: 1,
},
topStatus:{
marginTop:25,
},
input:{
height:45,
borderWidth:1,
marginLeft: 5,
paddingLeft:5,
borderColor: '#ccc',
borderRadius: 4
},
tip:{
marginLeft: 5,
marginTop: 5,
color: '#C0C0C0',
}
});
AppRegistry.registerComponent('HelloWorld', () => App);
3,setState 函数简写
(1)回调是可选的,如果我们不需要回调则可以这么写:
updateText(newText) {
this.setState((oldState) => {
console.log(oldState);//老的状态值
return {
text: newText
};
})
}
(2)如果不需要用到老的状态机变量,可以简写为:
updateText(newText) {
this.setState(() => {
return {
text: newText
};
})
}
(3)我们可以把 updateText 函数的参数名直接改成状态机变量相同的名字,这样又可以进一步简化:
updateText(text) {
this.setState(() => {
return {text};
})
}
甚至可以这么写:
updateText(text) {
this.setState({text});
}
4,事件回调方法简写
上面样例中,当 onChangeText 事件触发的时候会自动调用 updateText 方法,然后在 updateText 方法中修改状态机变量 text。
onChangeText={ (newText) => this.updateText(newText) }
(1)也可以使用 bind 函数来绑定回调函数:
onChangeText={this.updateText.bind(this)}
(2)还可以不调用其它方法,直接在事件方法中改变状态机变量:
onChangeText={ (text) => this.setState({text}) }
全部评论(0)