---
title: 组件生命周期
summary: "介绍自定义组件的生命周期函数，包括 created、attached、detached、ready 及组件所在页面的生命周期。"
questions:
  - 组件最重要的三个生命周期函数是什么？
  - created 生命周期触发时可以调用 setData 吗？
  - attached 生命周期适合做什么工作？
  - detached 生命周期在什么情况下被触发？
  - 生命周期方法需要定义在哪个字段内？
  - 组件所在页面的生命周期包括哪些？
  - behavior 中同名生命周期方法是否会相互覆盖？
  - ready 生命周期在什么时候执行？
---



组件的生命周期指的是组件自身的一些函数，这些函数在特殊的时间点或遇到一些特殊的框架事件时被自动触发。

其中，最重要的生命周期是 `created`、`attached` 和 `detached`，包含一个组件实例生命流程的最主要时间点。

- 组件实例刚刚被创建时， `created` 生命周期被触发。此时，组件数据 `this.data` 就是在 `Component` 构造器中定义的数据 `data`。 此时还不能调用 `setData`。通常情况下，这个生命周期只应该用于给组件 `this` 添加一些自定义属性字段。
- 在组件完全初始化完毕、进入页面节点树后，`attached` 生命周期被触发。此时，`this.data` 已被初始化为组件的当前值。这个生命周期很有用，绝大多数初始化工作可以在这个时机进行。
- 在组件离开页面节点树后，`detached` 生命周期被触发。退出一个页面时，如果组件还在页面节点树中，则 `detached` 会被触发。

## 定义生命周期方法

生命周期方法需要定义在 `Component` 构造器的 `lifetimes` 字段内进行声明。

**示例代码：**

```js
Component({
  lifetimes: {
    attached: function () {
      // 在组件实例进入页面节点树时执行
    },
    detached: function () {
      // 在组件实例被从页面节点树移除时执行
    },
  },
  // ...
});
```

在 `behaviors` 中也可以编写生命周期方法，同时不会与其他 `behaviors` 中的同名生命周期相互覆盖。但要注意，如果一个组件多次直接或间接引用同一个 `behavior` ，这个 `behavior` 中的生命周期函数在一个执行时机内只会执行一次。

可用的全部生命周期如下表所示。

| 生命周期 | 参数 | 描述                               | 
| -------- | ---- | ---------------------------------- | 
| created  | 无   | 在组件实例刚刚被创建时执行。         | 
| attached | 无   | 在组件实例进入页面节点树时执行。     | 
| detached | 无   | 在组件实例被从页面节点树移除时执行。 | 
| ready    | 无   | 在组件在视图层布局完成后执行。       | 

## 组件所在页面的生命周期

还有一些特殊的生命周期，它们并非与组件有很强的关联，但有时组件需要获知，以便组件内部处理。这样的生命周期称为 **组件所在页面的生命周期**，在 `pageLifetimes` 定义段中定义。其中可用的生命周期包括：

| 生命周期 | 参数 | 描述                       | 最低版本 |
| -------- | ---- | -------------------------- | -------- |
| show     | 无   | 组件所在的页面被展示时执行。 |   /       |
| hide     | 无   | 组件所在的页面被隐藏时执行。 |    /      |
| resize   | 无   | 组件所在的页面尺寸发生改变。 | 2.6.2    |

**示例代码：**

```js
Component({
  pageLifetimes: {
    show: function () {
      // 页面被展示
    },
    hide: function () {
      // 页面被隐藏
    },
    resize: function () {
      // 页面尺寸发生改变
    },
  },
});
```
