element 的 Cascader 級聯選擇器設定默認值


Cascader 級聯選擇器

發現在很多的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),因為什么呢?!因為什么呢?!因為什么呢?!因為后端大大是不會再幫你整合結構的,除非一開始他給你的結構就是對稱的。

轉載請注明出處: wuxiexy (博客園)

聲明:嚴禁抄襲,歡迎轉載!不過請帶上博文鏈接!

或者你有更好的實現方式、或者你覺得有可以優化的地方,不妨評論討論下!覺得得到幫助的可以點個推薦,讓更多人也可以得到幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM