Component构造器
定义段与示例方法
解释:Component构造器可用于定义组件,调用Component构造器时可以指定组件的属性、数据、方法等。
字段 | 类型 | 是否必填 | 描述 | 最低版本 |
---|---|---|---|---|
properties | Object Map | 否 | 组件的对外属性,是属性名到属性设置的映射表,属性设置中可包含三个字段, type 表示属性类型、 value 表示属性初始值、 observer 表示属性值被更改时的响应函数 | |
data | Object | 否 | 组件的内部数据,和 properties 一同用于组件的模板渲染 | |
methods | Object | 否 | 组件的方法,包括事件响应函数和任意的自定义方法,关于事件响应函数的使用,参见 组件事件 | |
behaviors | Array.<string> | 否 | 类似于mixins和traits的组件间代码复用机制,参见 behaviors | |
created | Function | 否 | 组件生命周期函数,在组件实例进入页面节点树时执行,注意此时不能调用setData,参见 组件生命周期 | |
attached | Function | 否 | 组件生命周期函数,在组件实例进入页面节点树时执行,参见 组件生命周期 | |
ready | Function | 否 | 组件生命周期函数,在组件布局完成后执行,此时可以获取节点信息,参见 组件生命周期 | |
detached | Function | 否 | 组件生命周期函数,在组件实例被从页面节点树移除时执行,参见 组件生命周期 | |
externalClasses | Array.<string> | 否 | 组件接受的外部样式类,参见组件模板和样式 | 1.13.27 |
options | Object Map | 否 | 一些选项(文档中介绍相关特性时会涉及具体的选项设置,这里暂不列举) | 1.13.27 |
lifetimes | Object | 否 | 组件生命周期声明对象,组件的生命周期:created、attached、ready、detached将收归到lifetimes字段内进行声明,原有声明方式仍旧有效,如同时存在两种声明方式,则lifetimes字段内声明方式优先级最高,参见 组件生命周期 | 1.13.27 |
pageLifetimes | Object | 否 | 组件所在页面的生命周期声明对象,目前仅支持页面的show和hide两个生命周期,参见 组件生命周期 | 1.13.27 |
definitionFilter | Function | 否 | 定义段过滤器,用于自定义组件扩展,参见自定义组件扩展 | 1.13.27 |
生成的组件实例可以在组件的方法、生命周期函数和属性 observer 中通过 this 访问。组件包含一些通用属性和方法。
属性名 | 类型 | 描述 | 最低版本 |
---|---|---|---|
is | String | 组件的文件路径 | 1.13.27 |
id | String | 节点id | 1.13.27 |
dataset | String | 节点dataset | 1.13.27 |
data | Object | 组件数据,包括内部数据和属性值 | |
properties | Object | 组件数据,包括内部数据和属性值(与data一致)。 |
方法名 | 参数 | 描述 | 最低版本 |
---|---|---|---|
setData | Object newData | 设置data并执行视图层渲染 | |
hasBehavior | Object | 检查组件是否具有 behavior (检查时会递归检查被直接或间接引入的所有behavior) | 1.13.27 |
triggerEvent | String name, Object detail | 触发事件,参见 组件事件 | |
createSelectorQuery | 创建一个 SelectorQuery 对象,选择器选取范围为这个组件实例内, 与 swan.createSelectorQuery().in(this) 是等效 | 2.5.3 | |
createIntersectionObserver | Object options | 创建一个 IntersectionObserver 对象,选择器选取范围为这个组件实例内 | 2.5.3 |
selectComponent | String selector | 使用选择器选择组件实例节点,返回匹配到的第一个组件实例对象(会被 swan://component-export 影响),在生命周期 onReay 开始时生效 | |
selectAllComponents | String selector | 使用选择器选择组件实例节点,返回匹配到的全部组件实例对象组成的数组 | |
groupSetData | Function callback | 立刻执行 callback ,其中的多个 setData 之间不会触发界面进行重复绘制 | 2.10.7 |
代码示例在开发者工具中预览效果
// 自定义组件js
Component({
properties: {
propName: { // 属性名
type: String, // 类型(必填),目前接受的类型包括:String, Number, Boolean, Object, Array, null(表示任意类型)
value: 'val', // 属性初始值(必填)
observer: function(newVal, oldVal) {
// 属性被改变时执行的函数(可选)
}
}
},
data: {}, // 私有数据,可用于模板渲染
// 生命周期函数,可以为函数,或一个在methods段中定义的方法名
attached: function () {},
detached: function () {},
methods: {
onTap: function () {
this.setData({
// 更新属性和数据的方法与更新页面数据的方法类似
});
}
}
});
注意:在 properties 定义段中,属性名应该采用驼峰写法(propsName);在 swan
模板中,指定属性值时则对应使用连字符写法( component-tag-name props-name="props value"
)。
使用 Component 构造器构造页面
解释:事实上,一个自定义组件也可以视为一个页面,故页面也可以使用 Component 构造器构造,拥有与普通组件一样的定义段与实例方法,其必要配置项(json)与正常自定义组件一致,即需要有component: true
字段。
关于页面传参:从其它页面跳转到由自定义组件构造的页面时,如跳转到页面 /components/custom/custom?paramA=123¶mB=xyz ,你可以在由custom组件构造的页面onLoad生命周期中获取传递的query字段。
注意:页面的生命周期方法(即 on 开头的方法),应写在 methods 定义段中。
代码示例
{
"component": true,
"usingComponents": {}
}
/* /components/custom/custom.js */
Component({
methods: {
onLoad: function(options) {
console.log(options.paramA); // 123
console.log(options.paramB); // xyz
}
}
});
使用 Component 构造器来构造页面的一个好处是可以使用 behaviors 来提取所有页面中公用的代码段。例如,在所有页面被创建和销毁时都要执行同一段代码,就可以把这段代码提取到 behaviors 中。
代码示例在开发者工具中预览效果
// behavior.js
module.exports = Behavior({
attached: function() {
// 页面创建时执行
console.info('Page loaded!')
},
detached: function() {
// 页面销毁时执行
console.info('Page unloaded!')
}
})
// 自定义组件 A
var pageCommonBehavior = require('../behavior.js')
Component({
behaviors: [pageCommonBehavior],
data: { /* ... */ },
methods: { /* ... */ },
})
// 自定义组件 B
var pageCommonBehavior = require('../behavior.js')
Component({
behaviors: [pageCommonBehavior],
data: { /* ... */ },
methods: { /* ... */ },
})
说明:
- 使用 this.data 可以获取内部数据和属性值,但不要直接修改它们,应使用 setData 修改;
- 属性名应避免以 data- 开头,因为在 SWAN 中,
data-name='swan'
会被作为节点 dataset 来处理; - 属性名应避免以 prop- 开头 在处理过程中会将该前缀删除;
- 属性名应避免包含 “ ” 字符, 因为在渲染过程中将会以 “ ” 字符进行拆分。