您的位置:

uniapp组件生命周期详解:从加载到销毁完全掌握

一、组件生命周期概述

组件生命周期指的是,一个组件从创建到销毁整个过程所经历的各个阶段。Vue.js 框架、React 框架和uniapp框架都有生命周期。掌握组件生命周期是理解组件工作原理的关键。组件的生命周期可以分为四个阶段:创建、挂载、更新和销毁,每个阶段都有对应的生命周期函数,可以在特定阶段进行特定的操作。

<script>
export default {
  name: 'myComponent',
  created() {
    console.log('组件创建')
  },
  mounted() {
    console.log('组件挂载')
  },
  updated() {
    console.log('组件更新')
  },
  destroyed() {
    console.log('组件销毁')
  }
}
</script>

在上面的代码中,我们定义了一个组件名为“myComponent”,并实现了该组件的四个生命周期函数,分别是创建阶段的created、挂载阶段的mounted、更新阶段的updated和销毁阶段的destroyed。每个生命周期钩子都有相应的方法,可以在特定的阶段做出响应。

二、uni-app组件生命周期钩子函数

1. 创建阶段

在组件创建阶段,会依次调用以下函数:

  • beforeCreate:该函数在实例创建之前调用,此时实例的属性和方法均未初始化。这个阶段实例和元素都不存在。
  • created:该函数在实例创建之后调用,此时实例的属性和方法已经被创建、但是元素还没有被渲染。这个阶段实例已经存在,但是 DOM 元素还没有,也就是你通过 this 或是 $el 还无法看到 html 结构。
<template>
  <div>{{message}}</div>
</template>
<script>
export default {
  beforeCreate() {
    console.log("组件尚未创建")
  },
  created() {
    console.log("组件已创建")
  },
  data() {
    return {
      message: 'Hello World!'
    }
  }
}
</script>

在上面这个例子中,我们定义了组件的模板和脚本。在beforeCreate函数中打印出"组件尚未创建",在created函数中打印出"组件已创建"。因此,在beforeCreate函数中,组件和实例甚至此时都尚未创建,所以无法访问变量和方法。

2. 挂载阶段

在组件挂载阶段,会依次调用以下函数:

  • beforeMount: 此函数在挂载开始之前被调用,并且所有的 render 函数和渲染的子组件已被首次调用或被更新。这个阶段可以访问到运行时生成的虚拟 DOM树。但是,这时的结构还没有被渲染成真正的 DOM 结构。
  • mounted: 此函数在挂载完成后被调用,这时 DOM 元素已经挂载并渲染完毕。因此,在这个函数中可以访问到 DOM 元素,也可以进行一些 DOM 操作。
<template>
  <div ref="box"></div>
</template>
<script>
export default {
  mounted() {
    console.log(this.$refs.box instanceof HTMLElement) // true
    this.$refs.box.style.width = "100px"
  }
}
</script>

在上面的代码中,我们定义了一个空的<div>元素,并通过 $refs 获取到 DOM 节点。在 mounted 函数中,我们利用 $refs.box 修改了该元素的 width 属性。

3. 更新阶段

在组件更新阶段,会依次调用以下函数:

  • beforeUpdate: 此时组件数据已经完成更新,但是 DOM 尚未更新,因此在此阶段中可以进行更新前的数据操作。
  • updated: 在此时组件的数据和渲染的 DOM 结构都已经完成了更新。
<template>
  <button @click="counter++">{{ counter }}</button>
</template>
<script>
export default {
  data() {
    return { counter: 0 }
  },
  updated() {
    console.log('更新后的计数器值为:' + this.counter)
  }
}
</script>

在上面的代码中,我们定义了一个计数器按钮,每次点击都会让计数器的值加1.在 updated 函数中,即可得到更新后的计数器值。

4. 销毁阶段

在组件销毁阶段,会依次调用以下函数:

  • beforeDestroy: 此时组件即将被销毁,但是 DOM 结构仍然存在。
  • destroyed: 此时组件已经被销毁,并且 DOM 结构也不存在了。
<template>
  <div>{{ message }}</div>
</template>
<script>
export default {
  data() {
    return { message: 'Hello World!' }
  },
  destroyed() {
    console.log('组件已被销毁')
  }
}
</script>

在上面的代码中,我们定义了一个显示"Hello World!"的 <div> 元素。在 destroyed 函数中打印出组件已被销毁的信息。

三、uni-app组件生命周期实例

1. 创建阶段

<template>
  <div>组件创建阶段</div>
</template>
<script>
export default {
  beforeCreate() {
    console.log('组件即将创建')
  },
  created() {
    console.log('组件已经创建')
  }
}
</script>

2. 挂载阶段

<template>
  <div>组件挂载阶段</div>
</template>
<script>
export default {
  beforeMount() {
    console.log('组件即将挂载')
  },
  mounted() {
    console.log('组件已经挂载')
  }
}
</script>

3. 更新阶段

<template>
  <button @click="counter++">{{ counter }}</button>
</template>
<script>
export default {
  data() {
    return { counter: 0 }
  },
  beforeUpdate() {
    console.log("即将更新计数器")
  },
  updated() {
    console.log("计数器已经更新")
  }
}
</script>

4. 销毁阶段

<template>
  <div>{{ message }}</div>
</template>
<script>
export default {
  data() {
    return { message: 'Hello World!' }
  },
  beforeDestroy() {
    console.log('组件即将被销毁')
  },
  destroyed() {
    console.log('组件已经被销毁')
  }
}
</script>

总结

本文通过详细讲解uni-app组件的生命周期,从创建到销毁完全掌握了组件的整个生命周期。组件的钩子函数能够让我们在组件的生命周期中进行一些操作,比如在created函数中初始化数据,在mounted函数中访问DOM元素等。掌握uni-app组件的生命周期,有助于我们更好地理解组件的工作原理,并能够更好地应用uni-app框架进行开发。