详细使用见官方文档:自定义组件 / 介绍 (qq.com)
1、创建自定义组件
项目结构:
代码示例:
// WXML
<view class="box">
<view wx:for="{{list}}" wx:key="index" class="item {{current==index?'active':''}}" bind:tap="changeItem" data-index="{{index}}">
{{item}}
</view>
</view>
// WXSS
.box {
display: flex;
width: 90%;
margin: 0 auto;
flex-direction: row;
}
.item {
flex: 1;
height: 50px;
line-height: 50px;
text-align: center;
}
.active {
color: rgb(23, 148, 231);
}
// JSON
{
"component": true,
"usingComponents": {}
}
// JS
Component({
/**
* 组件的属性列表---不能在组件内部修改,由父组件传递
*/
properties: {
list:{
type:Array,
value:["TabOne","TabTwo","TabThree","TabFour"]
},
current:{
type:Number,
value:0
}
},
/**
* 组件的初始数据
*/
data: {
// dataList:["科技","娱乐","体育","教育"],
// current:0
},
/**
* 组件的方法列表
*/
methods: {
changeItem(evt) {
// 修改的是状态而非属性
// this.setData({
// current:evt.currentTarget.dataset.index
// })
// 触发父组件中的事件
this.triggerEvent("ParentEvent",evt.currentTarget.dataset.index)
}
}
})
2、页面JSON中注册组件
代码示例:
{
"usingComponents": {
"navbar":"../../components/navbar/navbar"
}
}
3、页面WXML中引入组件
<navbar bindParentEvent="handleEvent" list="{{dataList}}" current="{{currentIndex}}"></navbar>
4、父子组件间通信
父传子:
子组件定义属性:
父组件传递数据:
子传父:
父组件定义相应事件:
子组件调用父组件方法():
5、slot(插槽技术)
组件内:
<view class="box">
<slot name="left"></slot>
<slot name="right"></slot>
</view>
注意事项:
父组件使用:
6、自定义组件的生命周期
代码示例(倒计时功能):
lifetimes:{
// 进入自动触发
attached() {
this.intervalId = setInterval(()=>{
console.log(this.data.count)
if(this.data.count==0) {
// 通知父组件移除自己
this.triggerEvent("event")
}
this.setData({
count:this.data.count-1
})
},1000)
},
// 移除
detached() {
// 移除定时器
clearInterval(this.intervalId)
console.log("定时器移除")
}
}