#组件封装
#组件代码
隐去了部分业务代码
html// index.wxml <view class="order__item"> <view class="header"> <view class="order__id">{{orderInfo.id}}</view> <view class="actions"> <view class="desc">回单审核</view> <view wx:if="{{!isSelected}}" class="checkbox" bind:tap="toggleSelect"></view> <view wx:else class="checkbox checked" bind:tap="toggleSelect"></view> </view> </view> <view class="list" bind:tap="goPage"> <view class="row"> <view class="desc">姓名</view> <view class="content">{{orderInfo.name}}</view> </view> <view class="row"> <view class="desc">地址</view> <view class="content">{{orderInfo.age}}</view> </view> </view> <view class="footer"> <view class="action primary" bind:tap="notifyOrderItem">确认</view> </view> </view>
js// index.js Component({ properties: { orderInfo: Object, isAllSelected: Boolean, }, data: { isSelected: false, }, observers: { isAllSelected: function (newValue) { if (newValue === true) this.setData({ isSelected: true, }); }, }, methods: { notifyOrderItem() { this.triggerEvent("notifyOrderList", this.properties.orderInfo.id); }, goPage(){ this.triggerEvent("goOrderDetailPage"); }, toggleSelect() { // 当前选中,进行取消 if (this.data.isSelected) { this.setData({ isSelected: false }); this.triggerEvent("toggleSelect", { id: this.properties.orderInfo.id, type: "remove", }); } // 当前未选 else { this.setData({ isSelected: true }); this.triggerEvent("toggleSelect", { id: this.properties.orderInfo.id, type: "add", }); } }, }, });
#使用组件
html<OrderItem class="custom-item" isAllSelected="{{isAllSelected}}" orderInfo="{{item}}" wx:for="{{orderList}}" wx:key="id" bind:toggleSelect="toggleSelect" bind:notifyOrderList="notifyOrderList" bind:goOrderDetailPage="goOrderDetailPage" />
#代码分析
item组件很简单
- props有orderInfo和isAllSelected
- data有isSelected
- methods有toggleSelect方法
- isSelected作为组件自身的属性进行维护
- 触发toggleSelect时,切换isSelected,并且向外emit事件,通知父组件修改外部维护的选中的ids
- 外部接收到子组件的切换事件时,判断是add还是remove
- 如果收到的是add,ids增加本次选中的id,并且判断ids的长度是否等于全部id的长度,如果相等就认为全选处于选中状态
- 如果收到的是remove,ids移除id,并把全选状态取消
- 如果在外部点击全选,那么把外部的isSelected状态修改,item组件用observers监听器监听isAllSelected props的修改,如果处于全选,则把当前维护的isSelected状态也修改为选中。如果需要反选,再增加对应逻辑即可。