You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
2.8 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view class="tm-groupcheckbox " :class="[customClass]">
<slot></slot>
</view>
</template>
<script>
/**
* 复选框组
* @description 此组件必须配合tm-checkbox组件使用不可单独使用。
* @property {Number} max = [999] 最大选择数量
* @property {String} name = [] 默认:'',提交表单时的的字段名称标识
* @property {String} customClass = [] 默认:''自定义class
* @property {Function} change 任何一个checkekBox改变将会触发此事件并携带选中的数组数据。
* @property {Function} error 如果超过最大选择数量将会触发此事件。
* @example <tm-groupcheckbox><tm-checkbox v-model="checked" label="苹果"></tm-checkbox></tm-groupcheckbox>
*
*/
export default {
name:'tm-groupcheckbox',
props:{
// 最大选择数量
max:{
type:Number,
default:9999
},
//提交表单时的的字段名称
name:{
type:String,
default:''
},
customClass:{
type:String,
default:''
}
},
data() {
return {
};
},
mounted() {
this.$nextTick(function(){
this.$emit('change',this.getVal())
})
},
methods: {
change(e) {
this.$emit('change',e)
},
// 获取选中的结果 。
getVal(){
let box = [];
function findchild(p,index){
let preat = p;
if(preat.$options?.name==='tm-checkbox'){
if(preat.changValue){
box.push({index:index,value:preat.name,checked:preat.changValue})
}
}else{
if(preat.$children.length>0){
preat.$children.forEach(item=>{
findchild(item,index++);
})
}
}
};
findchild(this,0);
return box;
},
// 反选。如果一个都没选择。反选就相当于全选。如果是全选,则结果是全部不选。
// 执行完毕后。不能立即使用getVal获取结果需要this.$nextTick
reverseVal(){
function findchild(p,index){
let preat = p;
if(preat.$options?.name==='tm-checkbox'){
preat.changValue = !preat.changValue;
}else{
if(preat.$children.length>0){
preat.$children.forEach(item=>{
findchild(item,index++);
})
}
}
};
findchild(this,0);
},
// 清除选中。
clear(){
function findchild(p,index){
let preat = p;
if(preat.$options?.name==='tm-checkbox'){
preat.changValue = false;
}else{
if(preat.$children.length>0){
preat.$children.forEach(item=>{
findchild(item,index++);
})
}
}
};
findchild(this,0);
},
// 只有当超过最选选项时才会发出错误。
error(){
uni.showToast({
title:"超过选择限制",icon:'none'
})
this.$emit('error',"超过选择限制")
}
},
}
</script>
<style lang="scss">
</style>