【REACT NATIVE 系列教程之四】刷新组件RENDER(重新渲染)的三种方式详解

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/react-native/2242.html

开发过游戏的都应该很清楚,“刷屏”是多么的重要。其实开发应用也如此,当组件的数据被修改后,如何及时更新组件呈现出最新的数据与效果一样至关重要。

那么这里Himi大概讲三种常用的方式:

  1. this.setState()  【最为常用】

这是在事件处理函数中和请求回调函数中触发 UI 更新的主要方法。

一般情况下setState() 总是触发一次重绘,除非在 shouldComponentUpdate() 中实现了条件渲染逻辑。如果使用可变的对象,但是又不能在 shouldComponentUpdate() 中实现这种逻辑,仅在新 state 和之前的 state 存在差异的时候调用 setState() 可以避免不必要的重新渲染。

举例、代码段如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

constructor(props) {

super(props);

this.state = {

                myName:'I am MyName!',

};

 

}

 

testFun(){

    this.setState({myName:'组件被刷新了'});

}

 

 

render() {

        ......

        <TouchableHighlight

          underlayColor='#4169e1'

          onPress={this.testFun.bind(this)}  

          >

            <Image

            source={require('./res/himi.png')}

            style={{width: 70, height: 70}}

            />

        </TouchableHighlight>

        ......

  )}

1. 在this.state中添加了一个 字符串变量 myName 用于Text 组件的文字显示

2. 自定义了一个 testFun 函数,用于 Touchable的回调处理,其中调用了this.setState 函数并修改了myName的数据

3. 在render中添加了一个高亮触摸组件,用于演示效果。

【注】假如有 a、b、c三个组件,b 是 a 的子组件,c是 b 的子组件,那么 b 中 setState 之后,b 和 c 会 rerender,而 a 不会。 因此建议大家可以把每个组件提供一个重绘接口,然后提供给其他组件调用。

效果如下:(点击查看动态效果)

 

2.  this.forceUpdate() 【较为常用,但是不推荐】

如果 render() 方法从 this.props 或者 this.state 之外的地方读取数据,你需要通过调用 forceUpdate() 告诉 React 什么时候需要再次运行 render()。如果直接改变了 this.state,也需要调用 forceUpdate()。

调用 forceUpdate() 将会导致 render() 方法在相应的组件上被调用,并且子级组件也会调用自己的 render(),但是如果标记改变了,那么 React 仅会更新 DOM。通常情况下,应该尽量避免所有使用 forceUpdate() 的情况,在 render() 中仅从 this.props 和 this.state 中读取数据。这会使应用大大简化,并且更加高效。

举例、在上面的示例代码基础上修改,如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

  testFun(){

    this.state.myName='组件被刷新了';

  }

  testForceFun(){

    this.forceUpdate();

  }

 

render() {

         ......

         <TouchableHighlight

          underlayColor='#4169e1'

          onPress={this.testFun.bind(this)}  

          >

            <Image

            source={require('./res/himi.png')}

            style={{width: 70, height: 70}}

            />

        </TouchableHighlight>

        

        <TouchableHighlight

          underlayColor='#4169e1'

          onPress={this.testForceFun.bind(this)}  

          >

            <Image

            source={require('./res/himi.png')}

            style={{width: 40, height: 40}}

            />

        </TouchableHighlight>

       ......

改动说明:

a)  修改 testFun 函数,让其作用只是修改了 myName 的值,并没有setState!所以不重绘

b)  添加 testForceFun 函数,作用是调用强制重绘函数。

c) render中多加了一个按钮,来触发 testForceFun函数。

运行效果图如下:(注意  testForceFun 函数对应的是图片较小的那个哦~ )

 

通过示意图可以知道,Himi 调用了 testFun、接着调用testForceFun ,才能看到刷新。

 

         3. this.setProps()   【不常用】

同一个节点上再次调用 React.render() 来更新根组件是首选的方式,也可以调用 setProps() 来改变组件的属性,触发一次重新渲染。

但是!此方法仅在根组件上面调用。也就是说,仅在直接传给 React.render() 的组件上可用,在它的子级组件上不可用。如果你倾向于在子组件上使用 setProps(),不要利用响应式更新,而是当子组件在 render() 中创建的时候传入新的 prop 到子组件中。

说的通俗一点:父组件不能直接修改 prop属性,只能父类在使用传入的时候进行设置。

时间: 2024-12-27 07:05:22

【REACT NATIVE 系列教程之四】刷新组件RENDER(重新渲染)的三种方式详解的相关文章

【REACT NATIVE 系列教程之二】创建自定义组件&amp;&amp;导入与使用示例

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2219.html 在上一篇  [REACT NATIVE 系列教程之一]触摸事件的两种形式与四种TOUCHABLE组件详解 中的最后介绍了如何使用Touchable的四种组件进行监听触摸事件.  那么紧接着我们利用Touchable来包装一个带图片的Button组件,且设计成可接受很多自定义参数. 一:创建我们自定

【REACT NATIVE 系列教程之一】触摸事件的两种形式与四种TOUCHABLE组件详解

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2203.html 本文是RN(React Native)系列教程第一篇,当然也要给自己的群做个广告:   React Native @Himi :126100395  刚创建的群,欢迎一起学习.讨论.进步. 本文主要讲解两点: 1.   PanResponder:触摸事件,用以获取用户手指所在屏幕的坐标(x,y)或

【REACT NATIVE 系列教程之三】函数绑定与FLEXBOX是用好REACT的基础

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2222.html Himi在写React 时主要遇到两个知识点觉得很有必要跟大家一起回顾下. 函数绑定 FlexBox 布局    一:函数绑定 首先来看一段代码片段: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 constructor(props) {       s

Android四大组件之——Activity的生命周期(图文详解)

      转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Android四大组件学习系列Activity篇]       1.Android四大组件之--Activity(一)定义.状态和后退栈(图文详解)       2.Android四大组件之--Activity的生命周期(图文详解)      上一篇文章讲了Activity的定义.状态和后退栈,现在讲讲A

使用Net.Mail、CDO组件、JMail组件三种方式发送邮件

原文:使用Net.Mail.CDO组件.JMail组件三种方式发送邮件 一.使用Net.Mail          需要服务器认证,大部分服务器端口为25. View Code 1 /// <summary> 2 /// 用MailMessage通过需要认证的SMTP服务器发送邮件,可以发送附件 3 /// </summary> 4 /// <param name="frmAddress">发件箱地址,例:myaccount@163.com</

深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)

深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇) 上篇文章<深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)>我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根节点下面,可配置properties.typeAliases.plugins.objectFactory.objectWrapperFactory.settings.environments

React Native系列(6) - 编译安卓私有React-Native代码

  为何要自己编译React Native安卓私有代码 我们在开发中遇到一个HTTP2的问题,React Native安卓客户端在和HTTP2支持的服务器通讯的过程中会有crash,见 React-Native HTTP2 issue How to build private build 由于时间紧急,发布期限已经拖了好久了,没法等待官方解决方案,只能在本地做修复然后发布. 编译私有React-Native 针对android,React-Native有官方指导说明. 过程中遇到不少坑,记录如下

Jsp九种对象详解教程

js|教程|详解|对象 Jsp的九种对象我简述之:page application request response session config out pageContext page<%@page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" %> response<%  response.setHeader(&quo

百度竞价推广教程之关键词匹配方式详解

  SEMadmin前两篇文章撰写创意选择关键词,SEMer看了之后反映还不错,这次就讲讲<百度竞价推广教程之关键词匹配方式运用>,还是那句话SEMadmin近阶段百度竞价推广教程主要为一些刚接触SEM的新手奉献的大餐.所以文章前半部分还是从概念入手.老手们就拿出看小说的速度看完前半部分吧! 在网民在百度搜索关键词时时,百度推广凤巢系统会自动挑选所有参与竞价投放的客户广告中含有对应的与之意思相近或者完全一样的关键词的推广结果展现在网民面前.为了更好的把握推广效果客户可通过设置关键词的匹配方式,