Vue3 select循环多个,选项option不能重复被选
环境:vue3+ts+vite+element plus
实现目标:Vue3 select循环多个,当其中一个option值被选后,其他select里面不能再重复选择该option值。第二种,当其中一个option值被选后,其他select里面就不出现被选option的值
第一种:代码如下
<template>
<div>
<form>
<table>
<tr>
<td v-for="(option, index) in 4" :key="index">
<el-select v-model="selectedOptions[index]" placeholder="请选择" @change="handleSelectChange(index)" clearable>
<el-option v-for="item in optionList" :key="item" :label="item.label" :value="item.value" :disabled="isOptionDisabled(item.value, index)"></el-option>
</el-select>
</td>
</tr>
</table>
</form>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import { ElSelect, ElOption } from 'element-plus';
const optionList= [
{ label: '选项1', value: 'option1' },
{ label: '选项2', value: 'option2' },
{ label: '选项3', value: 'option3' },
{ label: '选项4', value: 'option4' },
]
const selectedOptions=ref(<any>['','','',''])
const handleSelectChange=(index: number)=> {
const selectedValue = selectedOptions[index];
selectedOptions.value.forEach((value:string, i:number) => {
if (i !== index && value === selectedValue) {
selectedOptions[i] = '';
}
});
}
const isOptionDisabled=(value: string, currentIndex: number)=> {
return selectedOptions.value.some((selectedValue, index) => {
return index !== currentIndex && selectedValue === value;
});
}
</script>
效果:
第二种:
<template>
<tr>
<td v-for="(option, index) in 3" :key="index">
<el-select v-model="selectedOptions[index]" placeholder="请选择" clearable>
<el-option v-for="item in filteredOptions(index)"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</td>
</tr>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
import { ElSelect, ElOption } from 'element-plus';
export default defineComponent({
components: {
ElSelect,
ElOption,
},
setup() {
const optionList = ref([
{ label: '选项1', value: 'option1' },
{ label: '选项2', value: 'option2' },
{ label: '选项3', value: 'option3' },
]);
const selectedOptions = ref([] as string[]);
function filteredOptions(index: number) {
const selectedValues = selectedOptions.value.filter((value, i) => i !== index);
return optionList.value.filter(option => !selectedValues.includes(option.value));
}
return {
optionList,
selectedOptions,
filteredOptions,
};
},
});
</script>
效果:
或者用script setup的写法
<script lang="ts" setup>
import { ref } from 'vue';
import { ElSelect, ElOption } from 'element-plus';
const optionList=[
{ label: '选项1', value: 'option1' },
{ label: '选项2', value: 'option2' },
{ label: '选项3', value: 'option3' },
]
const selectedOptions= ref([] as string[])
const filteredOptions=(index: number)=> {
const selectedValues = selectedOptions.value.filter((value, i) => i !== index);
return optionList.filter(option => !selectedValues.includes(option.value));
}
</script>
如果没有使用UI 框架,el-select 和el-option标签替换为原生HTML标签即可