emis-sapp/components/tpx-checkitems/tpx-checkitems.vue
2024-06-12 10:46:42 +08:00

160 lines
3.1 KiB
Vue

<template>
<view v-for="(item, index) in filDataList" :style="itemStyle"
@click="handleCheckBoxClick(item, index)"
>
<slot :item="item" :index="index" :checked="checkedVal.indexOf(item.val)>-1" :handleCheckFun="()=> { handleCheckBoxClick(item, index) }"
></slot>
</view>
</template>
<script>
import { transListKeyTitle } from "@/common/util"
const typeEnum = {
single: 'single',
multiple: 'multiple'
}
const vdataTypeEnum = {
string: 'string',
array: 'array'
}
export default {
computed: {
filDataList() {
let list = this.list || []
if(this.transKeyVal) {
list = transListKeyTitle({ ...this.transKeyVal, list: list })
}
list.map(t=> {
t.val = t.val + ''
})
return list
},
checkedVal() {
let val = this.value
let res = []
if (Array.isArray(val)) {
res = val
}
if (typeof val == 'string' && val !== '') {
res = val.split(",")
}
if (typeof val == 'number') {
res = [val + '']
}
return res
},
},
props: {
list: {
default () {
return []
}
},
checkedList: {
default () {
return []
}
},
value: {
default () {
return ''
}
},
text: {
default () {
return ''
}
},
vdataType: {
default () {
return vdataTypeEnum.string
}
},
minChecked: {
default () {
return 0
}
},
type: {
default () {
return typeEnum.multiple // typeEnum | ''; 为空代表不做切换选中功能
}
},
itemStyle: {
default () {
return ''
}
},
transKeyVal: {
default () {
return null
// {
// // valKey: '',
// // titleKey: ''
// }
}
},
},
data() {
return {
}
},
created() {
},
onHide() {
},
unmounted() {},
methods: {
handleCheckBoxClick(curItem, index) {
let checkedVal = [].concat(this.checkedVal)
if (this.type) {
const curVal = curItem.val
const hasChked = checkedVal.indexOf(curVal) > -1
if (hasChked) {
// 取消选中前,校验最小选中个数
if(checkedVal.length > this.minChecked) {
checkedVal = checkedVal.filter(val => val != curVal)
}
} else {
if (this.type == typeEnum.multiple) {
checkedVal.push(curVal)
} else {
checkedVal = [curVal]
}
}
this.changeTabCheck(checkedVal)
}
this.$emit('onItemClick', { curItem, index, checked: checkedVal.indexOf(curItem.val)>-1 })
},
changeTabCheck(checkedVal) {
let value = checkedVal
let allList = this.filDataList.concat(this.checkedList)
let checkedList = []
checkedVal.map(val=> {
let item = allList.filter(t=> t.val == val)[0]
item && checkedList.push(item)
})
let text = checkedList.map(t=> t.title)
if(this.vdataType == vdataTypeEnum.string) {
value = value.join(',')
text = text.join(',')
}
this.$emit('onChange', value, text, checkedList)
this.$emit('update:value', value)
this.$emit('update:text', text)
this.$emit('update:checkedList', checkedList)
}
}
}
</script>
<style scoped lang="scss">
</style>