React Native学习笔记三组件生命周期

在React Native中使用组件来封装界面模块时,整个界面就是一个大的组件,开发过程就是不断优化和拆分界面组件、构造整个组件树的过程。
1.组件的属性

props:它是组件的不可变属性。组件自身定义了一组props作为对外提供的接口,展示一个组件时只需要指定props作为节点的属性。一般组件很少需要对外公开方法,唯一的交互途径就是props。所以说它也是父组件与子组件通信的桥梁。
下面举一个简单的例子来说明props。
有一个父组件Menu和一个子组件MyListView。

class Menu extends Component {
constructor() {
    super();
    this.state = {
      data: 'react native 组件生命周期学习',}
  }
  render() {
    /* 返回一个根组件*/
    return (
      <MyListView
        data = {this.state.data}
      />
    );
  }
}

子组件MyListView的定义如下:

class MyListView extends Component {
  props: {
    data: String,}
  render() {
    return (
      <View>
         <Text>{this.props.data} </Text>
      </View>
    );
  }
}

在上面的代码片段中,MyListView有一个props属性成员data。在父组件Menu中,通过节点属性的方式传值给子组件。

state:它是组件的内部状态属性,主要用来存储组件自身需要的数据。除了初始化时可能由props来决定,之后就完全由组件自身去维护。组件中由系统定义了setState方法,每次调用时都会更新组件的状态,触发render方法。需要注意的是render方法是被异步调用的,这可以保证同步的多个setState方法只会触发一次render,这样做是有利于提高性能的。
下面利用一个代码片段示例来说明state属性。先说一下需求:点击一下图片,实现计数的加一操作。

class ListItem extends Component {
  state: {
    /* 点赞数*/
    likeNum: number,}

  componentWillMount() {
    this.state = {
      likeNum: 0,}
  }

  render() {
    return (
        <View >
          <TouchableHighlight onPress = {() => this._onPressImage(this.state.likeNum)}>
            <Image
               source = {require('./img/hand@2x.png')}
              />
          </TouchableHighlight>
          <Text > {this.state.likeNum}</Text>
        </View>
      );
  }
  _onPressImage(likeNumd: number) {
    this.setState({
      likeNum: (likeNumd + 1),});
  }
}

在这个代码片段中,定义了一个state属性(likeNum)。当点击Image的时候,触发了_onPressImage方法。在该方法中通过调用系统的setState方法修改state的值。当修改完以后,系统就会自动触发render方法,从而完成界面的重新渲染。
2.组件的生命周期
对于自定义组件,除了必须实现的render方法,还有一些其他的可选方法可被调用。这些方法会在组件的不同时期之行,所以也可以说这些方法是组件的生命周期方法。
对于组件的生命周期来说一般分为四个阶段:分别为:创建阶段、实例化阶段、更新阶段、销毁阶段。
下面分别说一下这四个阶段。

  • 创建阶段
    该阶段主要发生在创建组件类的时候,在这个阶段中会初始化组件的属性类型和默认属性。
    在ES5中会触发getDefault这个生命周期方法,每次创建组件的时候执行且只执行一次。在ES6中可以统一使用static成员来实现。代码示例如下:
static defaultProps = {
    iconName: '',}; 
  static propTypes = {
    iconName: React.PropTypes.string.isRequired,};
  • 实例化阶段
    该阶段主要发生在组件类被调用(实例化)的时候。
    组件类被实例化的时候,触发一系列流程:
    1)getInitialState。在这里可以初始化state的值;在ES6中我们也可以将初始化state的操作放在constructor构造方法中去做;
    2)componentWillMount()。在组件渲染之前调用。在这个方法中根据业务逻辑对state进行操作;
    3)render()。根据state的值,生成对应虚拟DOM结构。并返回该结构;
    4)componentDidMount()。虚拟DOM转为真实DOM。组件内部可以通过一个this.getDOMNode()来获取当前组件节点。
  • 更新阶段
    该阶段主要发生在用户操作之后,或者父组件有更新的时候,此时会根据用户的操作行为,进行相应的界面结构调整。触发的流程如下:
    1)componentWillReceiveProps。当组件接收到新的props时,会触发该函数。在该函数中,通常可以调用setState()来完成对state的修改。
    2)shouldComponentUpdate。可以拦截新的props或state,决定要不要更新组件。
    3)componentWillUpdate。在更新之前做一些操作。
    4) render。根据diff算法,生成需要更新的虚拟DOM数据。
    5) componentDidUpdate。虚拟DOM同步到DOM中后,执行该方法,可以在这个方法中做DOM操作。
  • 销毁阶段
    该阶段主要发生组件销亡的时候,触发componentWillUnmount。当组件需要从DOM中移除的时候,通常需要做一些取消事件绑定,移除虚拟DOM中对应的组件数据结构,销毁一些无效的定时器等工作,都可以在这个方法中处理。
    下面借鉴一个说明组件生命周期的比较清晰的图

    图片来源:http://www.race604.com/react-native-component-lifecycle/?utm_source=tuicool&utm_medium=referral

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom