前端業務開發中不管使用vue2~3,還是react,angular各種前端技術棧,經常會遇到這種業務。一個下拉框Select中,不僅需要需要支援遠端模糊搜尋,還需要支援多選。並且在編輯時,還能正常把已經多選好的內容回顯到Select中。
用Vue3+ElementPlus+TS舉一個簡單的案例。其他技術棧思路是一致的
新增時的邏輯
這一步和普通操作沒有什麼區別
<el-select
v-model="selectValue"
multiple
filterable
remote
reserve-keyword
placeholder="請搜尋並選擇內容"
:remote-method="remoteMethod"
style="width: 240px"
>
<el-option
v-for="item in options"
:key="item.value"
:label="`${item.value}-${item.label}`"
:value="item.value"
/>
</el-select>
let selectValue = ref([]);
let options = ref<
{
value: string;
label: string;
}[]
>([]);
const remoteMethod = (value: string) => {
// 模擬遠端介面查詢
// 一般遠端模糊搜尋的介面都帶分頁,如果資料為10萬條,模糊搜尋時肯定一次不能查10萬條,還是需要正產分頁的
setTimeout(() => {
options.value = [
{
value: "1",
label: "張三",
},
{
value: "2",
label: "李四",
},
{
value: "3",
label: "王五",
},
];
}, 200);
};
</script>
多選OK的效果
編輯需要回顯時的邏輯(關鍵點)
當這個下拉框在編輯頁時,需要把同樣已經多選的內容完整回顯到這個下拉框中,因為資料本身就是多選,介面還是是分頁的,回顯時肯定不能使用介面查詢功能來回顯資料。因此,el-select的:value繫結就不應該只繫結value了。
<el-select
v-model="selectValue"
multiple
filterable
remote
reserve-keyword
placeholder="請搜尋並選擇內容"
:remote-method="remoteMethod"
style="width: 240px"
>
<!--value直接也把label繫結上-->
<el-option
v-for="item in options"
:key="item.value"
:label="`${item.value}-${item.label}`"
:value="`${item.value}-${item.label}`"
/>
</el-select>
let selectValue = ref([]);
let options = ref<
{
value: string;
label: string;
}[]
>([]);
const remoteMethod = (value: string) => {};
onMounted(() => {
// 模擬編輯頁初始化的時候介面初始化賦值邏輯
// 編輯頁面查詢到多選的詳情資訊data
const data = [
{
value: "1",
label: "張三",
},
{
value: "2",
label: "李四",
},
];
selectValue.value = data.map(item => `${item.value}-${item.label}`); //['1-張三', '2-李四'];
});
這時候options的繫結時就不僅僅是value了,而是這樣的格式。這樣就不需要透過後端介面來實現多選內容的資料回顯了。
['1-張三', '2-李四']
編輯操作時剔除label內容
當前options的繫結值已經是“['1-張三', '2-李四']”這樣了,編輯確定操作時剔除-label就行。
const originalArray = ['1-張三', '2-李四'];
const numericArray = originalArray.map(item => {
// 使用split('-')分割字串,並取第一個元素(即數字部分)
const numberPart = item.split('-')[0];
// 將字串轉換為數字
return parseInt(numberPart, 10);
});
console.log(numericArray); // 輸出: [1, 2]。編輯確定操作時,入參給介面就行。