發現在很多的CRM管理系統里面,都有不少頁面是用到這種級聯選擇器的,確實,功能很實用,
不過要設置默認值則應該讓不少人頭痛,因為你選擇的時候 @change 事件的參數就是選中的值,一個二維數組,這個很簡單就獲得了。不過要設置默認參數,讓 el-cascader 顯示默認值的話,就得把后端返回的默認數據,在這個 層級樹 里面蹂躪一遍,並找到默認數據的對應位置。
不啰嗦,上代碼
function cascader(o, options) {
let toString = Object.prototype.toString,
k = Object.keys(o),
len = options.length,
res = [];
let current, v, child, num;
for (let i = 0; i < len; ) {
current = options[i++];
v = current.value;
child = current.children;
num = k.indexOf(v);
if (num > -1) {
res.push(k.splice(num, 1));
if (k.length === 0) {
break;
}
}
if (toString.call(child) === "[object Array]" && child.length > 0) {
cartwheel([v], child);
}
}
function cartwheel(row, c) {
let len = c.length;
let current, v, child, num;
for (let i = 0; i < len; ) {
current = c[i++];
v = current.value;
child = current.children;
num = k.indexOf(v);
if (num > -1) {
res.push([...row, ...k.splice(num, 1)]);
if (k.length === 0) {
return;
}
}
if (toString.call(child) === "[object Array]" && child.length > 0) {
cartwheel([...row, v], child);
}
}
return;
}
return res;
}
測試代碼
let o = {
zhinan: "指南",
daohang: "導航",
ziyuan: "資源",
shejiyuanze: "設計原則",
yizhi: "一致",
sketch: "sketch",
jiaohu: "組件交互文檔",
breadcrumb: "Breadcrumb 面包屑",
"message-box": "MessageBox 彈框",
cexiangdaohang: "側向導航",
dingbudaohang: "頂部導航"
};
let res = cascader(o, options);
options 主要是 Cascader 級聯選擇器 那邊貼過來的,這里也貼一下,
options
options: [
{
value: "zhinan",
label: "指南",
children: [
{
value: "shejiyuanze",
label: "設計原則",
children: [
{
value: "yizhi",
label: "一致"
},
{
value: "fankui",
label: "反饋"
},
{
value: "xiaolv",
label: "效率"
},
{
value: "kekong",
label: "可控"
}
]
},
{
value: "daohang",
label: "導航",
children: [
{
value: "cexiangdaohang",
label: "側向導航"
},
{
value: "dingbudaohang",
label: "頂部導航"
}
]
}
]
},
{
value: "zujian",
label: "組件",
children: [
{
value: "basic",
label: "Basic",
children: [
{
value: "layout",
label: "Layout 布局"
},
{
value: "color",
label: "Color 色彩"
},
{
value: "typography",
label: "Typography 字體"
},
{
value: "icon",
label: "Icon 圖標"
},
{
value: "button",
label: "Button 按鈕"
}
]
},
{
value: "form",
label: "Form",
children: [
{
value: "radio",
label: "Radio 單選框"
},
{
value: "checkbox",
label: "Checkbox 多選框"
},
{
value: "input",
label: "Input 輸入框"
},
{
value: "input-number",
label: "InputNumber 計數器"
},
{
value: "select",
label: "Select 選擇器"
},
{
value: "cascader",
label: "Cascader 級聯選擇器"
},
{
value: "switch",
label: "Switch 開關"
},
{
value: "slider",
label: "Slider 滑塊"
},
{
value: "time-picker",
label: "TimePicker 時間選擇器"
},
{
value: "date-picker",
label: "DatePicker 日期選擇器"
},
{
value: "datetime-picker",
label: "DateTimePicker 日期時間選擇器"
},
{
value: "upload",
label: "Upload 上傳"
},
{
value: "rate",
label: "Rate 評分"
},
{
value: "form",
label: "Form 表單"
}
]
},
{
value: "data",
label: "Data",
children: [
{
value: "table",
label: "Table 表格"
},
{
value: "tag",
label: "Tag 標簽"
},
{
value: "progress",
label: "Progress 進度條"
},
{
value: "tree",
label: "Tree 樹形控件"
},
{
value: "pagination",
label: "Pagination 分頁"
},
{
value: "badge",
label: "Badge 標記"
}
]
},
{
value: "notice",
label: "Notice",
children: [
{
value: "alert",
label: "Alert 警告"
},
{
value: "loading",
label: "Loading 加載"
},
{
value: "message",
label: "Message 消息提示"
},
{
value: "message-box",
label: "MessageBox 彈框"
},
{
value: "notification",
label: "Notification 通知"
}
]
},
{
value: "navigation",
label: "Navigation",
children: [
{
value: "menu",
label: "NavMenu 導航菜單"
},
{
value: "tabs",
label: "Tabs 標簽頁"
},
{
value: "breadcrumb",
label: "Breadcrumb 面包屑"
},
{
value: "dropdown",
label: "Dropdown 下拉菜單"
},
{
value: "steps",
label: "Steps 步驟條"
}
]
},
{
value: "others",
label: "Others",
children: [
{
value: "dialog",
label: "Dialog 對話框"
},
{
value: "tooltip",
label: "Tooltip 文字提示"
},
{
value: "popover",
label: "Popover 彈出框"
},
{
value: "card",
label: "Card 卡片"
},
{
value: "carousel",
label: "Carousel 走馬燈"
},
{
value: "collapse",
label: "Collapse 折疊面板"
}
]
}
]
},
{
value: "ziyuan",
label: "資源",
children: [
{
value: "axure",
label: "Axure Components"
},
{
value: "sketch",
label: "Sketch Templates"
},
{
value: "jiaohu",
label: "組件交互文檔"
}
]
}
]
測試是可以的,但是如果要用在項目的里面的話,是不能直接用的,除非你的 層級樹 和上面這個 options的結構是一致的。如果不一致的話,那就要你手動改下 cascader 方法里面的取值了(如:value,children),因為什么呢?!因為什么呢?!因為什么呢?!因為后端大大是不會再幫你整合結構的,除非一開始他給你的結構就是對稱的。

聲明:嚴禁抄襲,歡迎轉載!不過請帶上博文鏈接!
或者你有更好的實現方式、或者你覺得有可以優化的地方,不妨評論討論下!覺得得到幫助的可以點個推薦,讓更多人也可以得到幫助。
