项目中的el-select
开始设计为多选,所以后端属性对应是集合类型,但是现在需要改为单选
,但是后端不愿意改,因为涉及到的地方多,所以像知道能不能单纯前端处理,就是前后端对应的属性还是集合类型,但是当用户选中一项时,覆盖掉之前选中的,这不就变成单选了吗?能否做到呢?
项目中的el-select
开始设计为多选,所以后端属性对应是集合类型,但是现在需要改为单选
,但是后端不愿意改,因为涉及到的地方多,所以像知道能不能单纯前端处理,就是前后端对应的属性还是集合类型,但是当用户选中一项时,覆盖掉之前选中的,这不就变成单选了吗?能否做到呢?
可以做到。通过@change
事件强制覆盖数组即可,实现效果如下:
<el-select
v-model="selectedArray"
multiple
@change="handleSingleSelect"
>
<!-- options -->
</el-select>
<script>
export default {
methods: {
handleSingleSelect(val) {
// 强制保留最后一个选中项
if (val.length > 1) {
this.selectedArray = [val[val.length - 1]]
}
}
}
}
</script>
原理说明:
v-model
绑定数组类型注意:如果允许清空,需要额外处理空数组的情况。若需要默认选中项,初始化时给数组设置一个元素即可。
去掉 multiple,直接用单选模式
如果后端不介意接收单值(比如 ["1"] 而不是 "1"),可以直接去掉 multiple,让 el-select 工作在单选模式下,但仍然将值包装成数组提交。
<template>
<el-select v-model="selectedValue" @change="handleChange">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</template>
<script>
export default {
data() {
return {
selectedValue: null, // 单选模式下是单个值
options: [
{ value: '1', label: '选项1' },
{ value: '2', label: '选项2' },
{ value: '3', label: '选项3' },
],
};
},
methods: {
handleChange(value) {
// 将单值转为数组提交给后端
this.$emit('update', [value]); // 假设你通过事件将数据传给父组件或后端
},
},
};
</script>
<template>
<el-select v-model="state"
clearable>
<el-option value="1"></el-option>
<el-option value="2"></el-option>
<el-option value="3"></el-option>
</el-select>
</template>
<script lang="ts">
import { defineComponent, computed, ref } from 'vue';
export default defineComponent({
setup() {
const model = ref({
list: [],
});
const state = computed({
get() {
const value = model.value.list || [];
return value.length > 0 ? value[0] : null;
},
set(value) {
model.value.list = value ? [value] : [];
},
});
return {
model,
state,
};
},
});
</script>
4 回答1.9k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
1 回答1.3k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
2 回答704 阅读✓ 已解决
2 回答838 阅读