前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >React Native的state

React Native的state

作者头像
Oceanlong
发布2018-07-03 13:09:48
8170
发布2018-07-03 13:09:48
举报

前言

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

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

  1. AppRegistry.registerComponent调用时,会调用render方法。
  2. 就是state变化时,会调用render方法。

因此,当我们数据改变,需要重新调用render时,我们应该将数据存入state中,这时控件会调用render方法,此时,我们再从state中取出最新的数据,重新渲染界面。

一个例子

需求

创建一个会时隐时现的<Text>,显示半秒,再隐藏半秒。

实现

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

如有问题,欢迎指正。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.05.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一个例子
    • 需求
      • 实现
      • 一些思考
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档