小程序用了一段时间了,我对里面组件的用法也有了一定了解,今天就自己封装一个组件来简要演示一下组件通信问题(主要是父传子)
根据小程序官方文档的描述,组件传值主要分为:
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) },