小程序用了一段时间了,我对里面组件的用法也有了一定了解,今天就自己封装一个组件来简要演示一下组件通信问题(主要是父传子)
根据小程序官方文档的描述,组件传值主要分为:
- WXML 数据绑定:用于父组件向子组件的指定属性设置数据
- 事件:用于子组件向父组件传递数据,可以传递任意数据。
- 父组件通过 this.selectComponent方法获取子组件实例对象,这样就可以直接访问组件的任意数据和方法。
比如 父子属性数据传递:
list.wxml 父组件
<view class="tabs">
<z-tabs tabnames="{{item}}" currentIndex="{{currentIndex}}" index="{{index}}" data-index="{{index}}" wx:for="{{tabnames}}" wx:key="index" ></z-tabs>
</view>
子组件z-tab.js
properties: {
tabnames: {
type: String,
value: ""
},
currentIndex: {
type: Number,
value: 0,
},
index: {
type: Number,
value: 0
}
},
//z-tabs.wxml
<view class="tab {{currentIndex==index ? 'active' :''}}" > {{tabnames}} </view>
currentIndex
、index
、tabnames
为父组件向子组件传递的两个参数,子组件通过properties属性接收,并从里面取值应用到页面即可
同样,若子组件想要向父组件传递参数,则需要通过触发事件的方式( triggerEvent),作用类似vue中的 emit,提交需要传递的值
子组件:
//z-tabs.wxml
<view bindtap="changeIndex"></view>
//z-tabs.js
properties: {
tabnames: {
type: String,
value: ""
},
currentIndex: {
type: Number,
value: 0,
},
index: {
type: Number,
value: 0
}
},
/**
* 组件的初始数据
*/
data: {
isactive: false,
},
/**
* 组件的方法列表
*/
methods: {
changeIndex() {
var myEventDetail = {params:1} // detail对象,提供给事件监听函数
var myEventOption = {} // 触发事件的选项
this.triggerEvent('myevent',myEventDetail ,myEventOption
}, {})
}
}
父组件:
<z-tabs bindmyevent="myevent"></z-tabs>
myevent(e) {
console.log(e)
},