Component 构造器可用于定义组件,调用 Component 构造器时可以指定组件的属性、数据、方法等
属性 | 类型 | 默认值 | 必填 | 说明 |
|---|---|---|---|---|
| options | object | 组件的选项 | ||
| externalClasses | array | 组件接受的外部样式类 | ||
| data | object | 组件的内部数据,和 properties 一同用于组件的模板渲染 | ||
| observers | object | 组件数据字段监听器,用于监听 properties 和 data 的变化 | ||
| methods | object | 组件的方法,包括事件响应函数和任意的自定义方法 | ||
| behaviors | array | 类似于mixins和traits的组件间代码复用机制 | ||
| created | object | 组件生命周期函数-在组件实例刚刚被创建时执行,注意此时不能调用 setData | ||
| attached | object | 组件生命周期函数-在组件实例进入页面节点树时执行 | ||
| ready | object | 组件生命周期函数-在组件布局完成后执行 | ||
| detached | object | 组件生命周期函数-在组件实例被从页面节点树移除时执行 |
// component.js
Component({
behaviors: [],
properties: {
myProperty: { // 属性名
type: String,
value: ''
},
myProperty2: String // 简化的定义方式
},
data: {}, // 私有数据,可用于模板渲染
lifetimes: {
// 生命周期函数,可以为函数,或一个在methods段中定义的方法名
attached: function () { },
detached: function () { },
},
// 生命周期函数,可以为函数,或一个在methods段中定义的方法名
attached: function () { }, // 此处attached的声明会被lifetimes字段中的声明覆盖
ready: function() { },
methods: {
onMyButtonTap: function(){
this.setData({
// 更新属性和数据的方法与更新页面数据的方法类似
})
},
// 内部方法建议以下划线开头
_myPrivateMethod: function(){
// 这里将 data.A[0].B 设为 'myPrivateData'
this.setData({
'A[0].B': 'myPrivateData'
})
},
_propertyChange: function(newVal, oldVal) {
}
}
})
定义段 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| type | - | 是 | 属性的类型 |
| value | - | 否 | Object |
| observer | Function | 否 | 属性值变化时的回调函数 |
示例代码:
Component({
properties: {
min: {
type: Number,
value: 0
},
min: {
type: Number,
value: 0,
observer: function(newVal, oldVal) {
// 属性值变化时执行
}
}
}
})
data 是页面第一次渲染使用的初始数据。 组件的数据有两个来源,内部的状态
示例代码:
<view>{{name}}</view>
<view>{{parentName}}</view>
Component({
properties: {
parentName: {
type: String,
value: 0
}
},
data: {
name: 'hello',
},
methods: {
changeName() {
this.setData({
name: "world"
})
}
}
})
自定义组件提供了四个生命周期函数:
生命周期 | 类型 | 描述 |
|---|---|---|
| created | object | 在组件实例刚刚被创建时执行(注意此时不能调用 setData?) |
| attached | object | 在组件实例进入页面节点树时执行 |
| ready | object | 在组件布局完成后执行 |
| detached | object | 在组件实例被从页面节点树移除时执行 |
示例代码:
Component({
properties: {
parentName: {
type: String,
value: 0
}
},
lifetimes: {
created: function () {
console.log("this is created");
},
attached: function () {
console.log("this is attached");
},
detached: function () {
console.log("this is detached");
},
ready() {
this.fetchData()
}
},
// 生命周期函数,可以为函数,或一个在methods段中定义的方法名
attached: function () { }, // 此处attached的声明会被lifetimes字段中的声明覆盖
ready: function() { },
data: {
name: 'hello',
},
methods: {
fetchData() {
xhs.myRequest('***')
},
changeName() {
this.setData({
name: "world"
})
}
}
})
插槽最简单的用法就是默认插槽,它允许你像这样拓展组件的模板能力:
<your-component name="{{ parentName }}">
<h1>hello, i am slot1</h1>
<h1>hello, i am slot2</h1>
<h1>hello, i am slot3</h1>
<h1>hello, i am slot4</h1>
</your-component>
your-component 组件模板:
// your-component.xhsml
<view>
子组件模板,接收到父组件的 parentName 参数: {{ name }}
<slot></slot>
<view>
有时可能会有多个插槽组合使用的场景:
<your-component name="{{ parentName }}">
<block slot="header">
<text>i am header</text>
</block>
<block slot="body">
<text>i am body</text>
</block>
<block slot="footer">
<text>i am footer</text>
</block>
</your-component>
your-component 组件模板:
// your-component.xhsml
<view>
<slot name="header"></slot>
子组件模板,接收到父组件的 parentName 参数: {{ name }}
<slot name="body"></slot>
<slot name="footer"></slot>
<view>
和页面一样,自定义组件定义的样式,会自动被引入使用组件的页面,无须手动引入