前言
在React的世界里,界面是由一个个Component拼出来的。当我们需要渲染一个界面时,以<View>为父控件。<Text>或自定义的<CustomText>为子控件。我们通过重写Compenent的render方法,来实现控件的渲染。
那么,Compenent的render方法何时调用呢?
- AppRegistry.registerComponent调用时,会调用render方法。
- 就是state变化时,会调用render方法。
因此,当我们数据改变,需要重新调用render时,我们应该将数据存入state中,这时控件会调用render方法,此时,我们再从state中取出最新的数据,重新渲染界面。
一个例子
需求
创建一个会时隐时现的<Text>,显示半秒,再隐藏半秒。
实现
import React, { Component } from 'react';
import {
Text,
} from 'react-native';
class BlinkText extends Component {
constructor(props) {
super(props);
this.state = { showText: true };
// 每500毫秒对showText状态做一次取反操作
setInterval(() => {
this.setState(previousState => {
return { showText: !previousState.showText };
});
}, 500);
}
render() {
// 根据当前showText的值决定是否显示text内容
let display = this.state.showText ? this.props.text : ' ';
return (
<Text>{display}</Text>
);
}
}
export default BlinkText;
我们先看BlinkText的constructor方法,这个类似类的构造方法。我们在构建方法中,创建了一个定时方法,定时方法中对previousState.showText的状态进行了取反,时间为500ms。
然后在render方法中,先判断previousState.showText状态。为true时,显示从外界传入的props的值,如果状态为false,则不显示。
最终,我们就可以看到一个闪动的<Text>。
一些思考
state的机制,提供了一个很方便的更新UI的方法。但它同时也带来了一个问题。
组件应该尽量无状态化。一个有状态的组件是难以维护的。在运行中,如果每个组件都有状态变化,那父组件的更新与子组件的更新会产生冲突。从而导致,组件的状态变得难以琢磨。
因此,常用的作法是,常用的模式就是创建多个只负责渲染数据的无状态(stateless)组件,在他们的上层创建一个有状态(stateful)组件并把它的状态通过props传给子级.有状态的组件封装了所有的用户交互逻辑,而这些无状态组件只负责声明式地渲染数据。
如有问题,欢迎指正。