提交 db1c71b2 authored 作者: lidongxu's avatar lidongxu

feat(xlselect): 封装带全选功能的下拉菜单

同上
上级 5e4df757
...@@ -2,57 +2,75 @@ ...@@ -2,57 +2,75 @@
<el-select v-bind="$attrs" <el-select v-bind="$attrs"
v-model="selectedOptions" v-model="selectedOptions"
@change="handleChange"> @change="handleChange">
<el-option v-if="allOption" <li class="el-select-dropdown__item all_item "
:key="allSelectLabel" :class="{ 'is-selected': isAll }"
:label="allSelectLabel" @click="selectAll">
:value="allSelectValue"></el-option> <span>全选</span>
<slot></slot> </li>
<el-option v-for="str in options"
:label="str"
:value="str">
</el-option>
</el-select> </el-select>
</template> </template>
<script setup> <script setup>
const selectedOptions = ref([]) const selectedOptions = ref([]) // 当前选中的值集合
const isAll = ref(false) // 全选状态
const emits = defineEmits(['update:modelValue']);
const props = defineProps({ const props = defineProps({
allOption: { // 开启全选选项 options: {
type: Boolean, type: Array,
default: false, default: () => [],
},
allSelectLabel: { // 全选文案
type: String,
default: '全选',
},
allSelectValue: { // 全选绑定值
type: [String, Number],
default: 'ALL',
}, },
allSingleValue: { // 全选模式(false:返回 option 组,true:返回 allSelectValue 值) modelValue: {
type: Boolean, type: Array,
default: false, default: () => []
}, }
modelValue: [String, Object, Array] })
});
watch(() => props.modelValue, val => { watch(() => props.modelValue, val => {
// if (props.allOption) { selectedOptions.value = val;
// // 判断不是数组则转成数组 isAll.value = val.length === props.options.length
// if (!Array.isArray(val)) {
// emits('update:modelValue', [val]);
// selectedOptions.value = [val];
// }
// }
}, { }, {
deep: true, deep: true,
immediate: true immediate: true
}) })
const handleChange = (val) => { // 全选点击
if (val.includes(props.allSelectValue)) { const selectAll = () => {
selectedOptions.value = [props.allSelectValue]; isAll.value = !isAll.value
if (isAll.value) {
selectedOptions.value = [...props.options];
emits('update:modelValue', selectedOptions.value);
} else { } else {
selectedOptions.value = val; selectedOptions.value = [];
emits('update:modelValue', selectedOptions.value);
} }
// emit('update:modelValue', selectedOptions.value);
} }
const handleChange = (val) => {
isAll.value = val.length === props.options.length
emits('update:modelValue', val)
}
</script> </script>
<style scoped
lang="scss">
.all_item {
cursor: pointer;
}
.all_item:hover {
background-color: var(--el-fill-color-light);
}
.all_item:hover+.is-hovering {
background-color: transparent;
}
</style>
...@@ -6,18 +6,14 @@ ...@@ -6,18 +6,14 @@
label-position="right" label-position="right"
label-width="68px" label-width="68px"
inline> inline>
<el-form-item label="直播间"> <el-form-item label="直播间" ref="ab">
<xl-select v-model="queryParams.brand" <xl-select v-model="queryParams.brand"
allOption :options="brandList"
multiple multiple
clearable clearable
collapse-tags collapse-tags
collapse-tags-tooltip collapse-tags-tooltip
@change="getList"> @change="getList">
<el-option v-for="str in brandList"
:label="str"
:value="str">
</el-option>
</xl-select> </xl-select>
</el-form-item> </el-form-item>
<el-form-item label="口味"> <el-form-item label="口味">
...@@ -131,7 +127,7 @@ const goodsList = ref([]) // 商品 ...@@ -131,7 +127,7 @@ const goodsList = ref([]) // 商品
const data = reactive({ const data = reactive({
queryParams: { queryParams: {
brand: 'a', // 直播间 brand: ['a', 'b', 'c'], // 直播间
taste: '', // 口味 taste: '', // 口味
spec: '', // 规格 spec: '', // 规格
series: '', // 系列 series: '', // 系列
...@@ -277,7 +273,7 @@ const detailColumns = ref([ ...@@ -277,7 +273,7 @@ const detailColumns = ref([
prop: '' prop: ''
} }
]) ])
const ab = ref(null)
</script> </script>
<style scoped <style scoped
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论