React Native的state

前言

在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传给子级.有状态的组件封装了所有的用户交互逻辑,而这些无状态组件只负责声明式地渲染数据。

如有问题,欢迎指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,242评论 25 708
  • 最近看了一本关于学习方法论的书,强调了记笔记和坚持的重要性。这几天也刚好在学习React,所以我打算每天坚持一篇R...
    gaoer1938阅读 1,719评论 0 5
  • 写作与看书 阿自 最近迷上了写东西,乱七八糟的写,写乱七八糟的东西,想着写作是排不上的,可是又不知道写成什么好,姑...
    舟⼀阅读 428评论 3 2
  • 彩虹钻进了豆荚 小鱼吞下一朵白云 毛茸茸的小鸡 从裂开的壳里 探出两只小眼睛 蚯蚓把身子打了个结 在小花丛中打滚 ...
    一颗行走的碳阅读 348评论 0 0
  • 若把感情比作食物,也有好坏之分。 喜欢一样食物,也需要天时地利,人和。 家。 寒风凛凛的冬夜,赶了很远的路,钥匙转...
    秦小破po阅读 174评论 0 0