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)