Behaviors
behaviors
是用于组件间代码共享的特性,类似于一些编程语言中的 mixins
或 traits
。
每个 behavior
可以包含一组属性、数据、生命周期函数和方法。组件引用它时,它的属性、数据和方法会被合并到组件中,生命周期函数也会在对应时机被调用。每个组件可以引用多个 behavior
,behavior
也可以引用其它 behavior
。
详细的参数含义和使用参考如下:
Behavior(config: Object)
注册一个 behavior
,接受一个 Object
类型的参数。
参数
属性 | 类型 | 必填 | 描述 | 最低版本 |
---|---|---|---|---|
properties | Object Map | 否 | 同组件的属性 | |
data | Object | 否 | 同组件的数据 | |
methods | Object | 否 | 同自定义组件的方法 | |
behaviors | String Array | 否 | 引入其它的 behavior | |
lifetimes | Object | 否 | 组件生命周期声明对象,包括 created, attached, detached, 参见 组件生命周期 | |
created | Function | 否 | 生命周期函数,在 lifetimes 字段内进行声明 | |
attached | Function | 否 | 生命周期函数,在 lifetimes 字段内进行声明 | |
detached | Function | 否 | 生命周期函数,在 lifetimes 字段内进行声明 |
示例代码
// my-behavior.js
export default Behavior({
behaviors: [],
properties: {
myBehaviorProperty: {
type: String,
},
},
data: {
myBehaviorData: {},
},
lifetimes: {
attached: function () {},
},
methods: {
myBehaviorMethod: function () {},
},
});
组件中使用
组件引用时,在 behaviors
定义段中将它们逐个列出即可。
示例代码:
// my-component.js
import myBehavior from 'my-behavior';
Component({
behaviors: [myBehavior],
properties: {
myProperty: {
type: String
}
},
data: {
myData: 'my-component-data'
},
lifetimes: {
created: function () {
console.log('[my-component] created')
},
attached: function () {
console.log('[my-component] attached')
},
}
methods: {
myMethod: function () {
console.log('[my-component] log by myMethod')
},
}
})
在上例中,my-component
组件定义中加入了 my-behavior
,而 my-behavior
结构为:
- 属性:myBehaviorProperty
- 数据字段:myBehaviorData
- 方法:myBehaviorMethod
- 生命周期函数:attached、created
这将使 my-component
最终结构为:
- 属性:myBehaviorProperty、myProperty
- 数据字段:myBehaviorData、myData
- 方法:myBehaviorMethod、myMethod
- 生命周期函数:attached、created
当组件触发生命周期时,上例生命周期函数执行顺序为:
- [my-behavior] created
- [my-component] created
- [my-behavior] attached
- [my-component] attached
详细规则,参考 同名字段的覆盖和组合规则。
同名字段的覆盖和组合规则
组件和它引用的 behavior
中可以包含同名的字段,对这些字段的处理方法如下:
-
如果有同名的属性 (properties) 或方法 (methods):
- 若组件本身有这个属性或方法,则组件的属性或方法会覆盖
behavior
中的同名属性或方法。 - 若组件本身无这个属性或方法,则在组件的
behaviors
字段中定义靠后的behavior
的属性或方法会覆盖靠前的同名属性或方法。 - 在前一条规则的基础上,若存在嵌套引用
behavior
的情况,则规则为:父behavior
覆盖子behavior
中的同名属性或方法。
- 若组件本身有这个属性或方法,则组件的属性或方法会覆盖
-
如果有同名的数据字段 (data):
- 若同名的数据字段都是对象类型,会进行对象合并。
- 其余情况会进行数据覆盖,覆盖规则为:组件 > 父
behavior
> 子behavior
,靠后的behavior
> 靠前的behavior
。优先级高的覆盖优先级低的,排在最后的behavior
为behavior
中优先级最高的。
-
生命周期函数不会相互覆盖,而是在对应触发时机被逐个调用:
- 对于不同的生命周期函数之间,遵循组件生命周期函数的执行顺序。
- 对于同种生命周期函数,遵循如下规则:
behavior
优先于组件执行。- 子
behavior
优先于父behavior
执行。 - 靠前的
behavior
优先于靠后的behavior
执行。
- 如果同一个
behavior
被一个组件多次引用,它定义的生命周期函数只会被执行一次。