emis-app/components/tpx-checkitems/tpx-checkitems.vue

160 lines
3.1 KiB
Vue
Raw Normal View History

2023-12-18 16:30:33 +00:00
<template>
2024-05-22 16:32:47 +00:00
<view v-for="(item, index) in filDataList" :style="itemStyle"
2023-12-18 16:30:33 +00:00
@click="handleCheckBoxClick(item, index)"
>
<slot :item="item" :index="index" :checked="checkedVal.indexOf(item.val)>-1" :handleCheckFun="()=> { handleCheckBoxClick(item, index) }"
></slot>
</view>
</template>
<script>
2024-05-22 16:32:47 +00:00
import { transListKeyTitle } from "@/common/util"
2023-12-18 16:30:33 +00:00
const typeEnum = {
single: 'single',
multiple: 'multiple'
}
2024-05-22 16:32:47 +00:00
const vdataTypeEnum = {
string: 'string',
array: 'array'
}
2023-12-18 16:30:33 +00:00
export default {
computed: {
2024-05-22 16:32:47 +00:00
filDataList() {
let list = this.list || []
if(this.transKeyVal) {
list = transListKeyTitle({ ...this.transKeyVal, list: list })
}
2024-05-22 17:06:55 +00:00
list.map(t=> {
t.val = t.val + ''
})
2024-05-22 16:32:47 +00:00
return list
},
2023-12-18 16:30:33 +00:00
checkedVal() {
let val = this.value
let res = []
2024-05-07 13:44:17 +00:00
if (Array.isArray(val)) {
2023-12-18 16:30:33 +00:00
res = val
}
if (typeof val == 'string' && val !== '') {
res = val.split(",")
}
if (typeof val == 'number') {
2024-05-22 17:06:55 +00:00
res = [val + '']
2023-12-18 16:30:33 +00:00
}
return res
},
},
props: {
list: {
default () {
return []
}
},
2024-05-19 05:56:23 +00:00
checkedList: {
default () {
return []
}
},
2023-12-18 16:30:33 +00:00
value: {
default () {
2024-05-22 16:32:47 +00:00
return ''
}
},
text: {
default () {
return ''
}
},
vdataType: {
default () {
return vdataTypeEnum.string
2023-12-18 16:30:33 +00:00
}
},
minChecked: {
default () {
return 0
}
},
type: {
default () {
return typeEnum.multiple // typeEnum | ''; 为空代表不做切换选中功能
}
},
itemStyle: {
default () {
return ''
}
2024-05-22 16:32:47 +00:00
},
transKeyVal: {
default () {
return null
// {
// // valKey: '',
// // titleKey: ''
// }
}
},
2023-12-18 16:30:33 +00:00
},
data() {
return {
}
},
created() {
},
onHide() {
},
2024-01-30 03:09:14 +00:00
unmounted() {},
2023-12-18 16:30:33 +00:00
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) {
2024-05-19 05:56:23 +00:00
let value = checkedVal
2024-05-22 16:32:47 +00:00
let allList = this.filDataList.concat(this.checkedList)
2024-05-19 05:56:23 +00:00
let checkedList = []
checkedVal.map(val=> {
let item = allList.filter(t=> t.val == val)[0]
2024-06-12 02:45:57 +00:00
item && checkedList.push(item)
2024-05-19 05:56:23 +00:00
})
2024-05-22 16:32:47 +00:00
let text = checkedList.map(t=> t.title)
if(this.vdataType == vdataTypeEnum.string) {
value = value.join(',')
text = text.join(',')
2023-12-18 16:30:33 +00:00
}
2024-05-22 16:32:47 +00:00
this.$emit('onChange', value, text, checkedList)
2024-05-19 05:56:23 +00:00
this.$emit('update:value', value)
2024-05-22 16:32:47 +00:00
this.$emit('update:text', text)
this.$emit('update:checkedList', checkedList)
2023-12-18 16:30:33 +00:00
}
}
}
</script>
<style scoped lang="scss">
</style>