美文网首页
React Native的state

React Native的state

作者: oceanLong | 来源:发表于2017-05-21 22:21 被阅读59次

    前言

    在React的世界里,界面是由一个个Component拼出来的。当我们需要渲染一个界面时,以<View>为父控件。<Text>或自定义的<CustomText>为子控件。我们通过重写Compenent的render方法,来实现控件的渲染。

    那么,Compenent的render方法何时调用呢?

    1. AppRegistry.registerComponent调用时,会调用render方法。
    2. 就是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传给子级.有状态的组件封装了所有的用户交互逻辑,而这些无状态组件只负责声明式地渲染数据。

    如有问题,欢迎指正。

    相关文章

      网友评论

          本文标题:React Native的state

          本文链接:https://www.haomeiwen.com/subject/gcpvxxtx.html