el-cascader組件根據最後一級向上找到父級並設置預設值

来源:https://www.cnblogs.com/coder--wang/archive/2022/10/24/16821287.html
-Advertisement-
Play Games

vue + elementUI項目中,el-cascader級聯選擇器使用頻率非常高,一些基本使用方法可以參考elementUI官方文檔,本文主要研究當介面只返回最後一級id時,如何向上找出所有父級數據,並設置組件el-cascader的預設值! 準備測試數據:方位、省、市區級聯選擇。 var li ...


vue + elementUI項目中,el-cascader級聯選擇器使用頻率非常高,一些基本使用方法可以參考elementUI官方文檔,本文主要研究當介面只返回最後一級id時,如何向上找出所有父級數據,並設置組件el-cascader的預設值!

準備測試數據:方位、省、市區級聯選擇。

var list = [
  {
    parent: 0,
    value: 1,
    label: '東南',
    children: [
      {
        parent: 1,
        value: 2,
        label: '上海',
        children: [
          {parent: 2, value: 3, label: '普陀'},
          {parent: 2, value: 4, label: '黃埔'},
          {parent: 2, value: 5, label: '徐匯'}
        ]
      },
      {
        parent: 1,
        value: 7,
        label: '江蘇',
        children: [
          {parent: 7, value: 8, label: '南京'},
          {parent: 7, value: 9, label: '蘇州'},
          {parent: 7, value: 10, label: '無錫'}
        ]
      },
      {
        parent: 1,
        value: 12,
        label: '浙江',
        children: [
          {parent: 12, value: 13, label: '杭州'},
          {parent: 12, value: 14, label: '寧波'},
          {parent: 12, value: 15, label: '嘉興'}
        ]
      }
    ]
  },
  {
    parent: 0,
    value: 17,
    label: '西北',
    children: [
      {
        parent: 17,
        value: 18,
        label: '陝西',
        children: [
          {parent: 18, value: 19, label: '西安'},
          {parent: 18, value: 20, label: '延安'}
        ]
      },
      {
        parent: 17,
        value: 21,
        label: '新疆維吾爾自治區',
        children: [
          {parent: 21, value: 22, label: '烏魯木齊'},
          {parent: 21, value: 23, label: '克拉瑪依'}
        ]
      }
    ]
  }]

假設現在介面返回最後一級id數組是[13],表示選中杭州,需要根據id:13,找到所有父級id並組成數組 -> [1,12,13],(上面測試數據的value即id),具體方法如下:

/**
 * 針對樹形數據結構的級聯選擇器組件,後臺數據返回最後一級數據id
 * 封裝處理方法,返回樹形結構(註意此方法根據id返回對應結構的原始數據,根據不同場景,需再二次處理獲得所需數據)
 *
 * @param list 級聯選擇器全部數據
 * @param flagAttr 欄位標識(id)
 * @param values 介面最後一級id數組
 * @param parentKey 樹形數據中的父級id欄位
 * @param childrenKey 父級的子數據數組
 *
 * @return [treeData, ...]
 * */
export function findParentLevel(list, flagAttr, values, parentKey = 'parent', childrenKey = 'children') {
  if (!list || !list.length || !flagAttr || !Array.isArray(values)) return []
  const longList = extractTree(list, childrenKey) // 展開樹形數據
  values = values.map(value => longList.find(item => item[flagAttr] === value)).filter(Boolean)
  return makeTree(longList, parentKey, childrenKey, flagAttr, values) // 返回樹形結構數據
}

extractTree:

/**
 *
 * @param {Array} arrs 樹形數據
 * @param {string} childs 樹形數據子數據的屬性名,常用'children'
 * @param {Array} attrArr 需要提取的公共屬性數組(預設是除了childs的全部屬性)
 * @returns
 */
export function extractTree(arrs, childs, attrArr) {
  let attrList = []
  if (!Array.isArray(arrs) && !arrs.length) return []
  if (typeof childs !== 'string') return []
  if (!Array.isArray(attrArr) || Array.isArray(attrArr) && !attrArr.length) {
    attrList = Object.keys(arrs[0])
    attrList.splice(attrList.indexOf(childs), 1)
  } else {
    attrList = attrArr
  }
  const list = []
  const getObj = (arr) => {
    arr.forEach(function(row) {
      const obj = {}
      attrList.forEach(item => {
        obj[item] = row[item]
      })
      list.push(obj)
      if (row[childs]) {
        getObj(row[childs]) // 遞歸
      }
    })
    return list
  }
  return getObj(arrs)
}

makeTree:

/**
 * 組合樹形數據結構
 * @param data 平鋪後的所有樹形數據
 * @param pid 父級id
 * @param child 子數據數組欄位
 * @param id 子級id
 * @param childrenArray 介面返回的子級數據
 *
 * @return [tree, ...]
 * */
export function makeTree(data, pid, child, id, childrenArray) {
  const parents = data.filter(p => p[pid] === 0)
  childrenArray.forEach(item => {
    makeLongList(item, item)
  })
  dataToTree(parents, childrenArray.map(i => i.longList || [i]).flat(1))
  return parents.filter(item => item[child])

  /**
   * 遞歸向上尋找每一個子級數據對應的父級數據,並將所有父級數據放進介面返回子級數據的longList欄位
   * @param item1 介面返回的子級數據
   * @param item2 向上尋找的父級數據, 頂級父級除外,上面已經獲取到頂級數據
   *
   * */
  function makeLongList(item1, item2) {
    if (data.find(p => p[id] === item2[pid]) && data.find(p => p[id] === item2[pid])[pid]) {
      if (item1.longList) {
        item1.longList.push(data.find(p => p[id] === item2[pid]))
      } else {
        const it = JSON.parse(JSON.stringify(item1))
        item1.longList = [it, data.find(p => p[id] === item2[pid])]
      }
      // 除去頂級數據
      data.find(p => p[id] === item2[pid])[pid] && makeLongList(item1, data.find(p => p[id] === item2[pid]))
    }
  }

  function dataToTree(parents, children) {
    parents.map(p => {
      children.map((c, i) => {
        if (c[pid] === p[id]) {
          const _children = JSON.parse(JSON.stringify(children))
          _children.splice(i, 1)
          dataToTree([c], _children) // 遞歸
          if (p[child]) {
            p[child].push(c)
          } else {
            p[child] = [c]
          }
        }
      })
    })
  }
}

效果展示:

 

 

 圖中未處理的數據就是根據最後一級id向上查找父級數據,處理後的數據是將找到的樹形數據繼續平鋪處理成組件需要的各級id組成的數組(若業務場景固定,只需要id數據,那麼在findParentLevel方法中可以直接返回處理後的數據)。

以上便是對el-cascader設置預設值的全部內容啦,希望對你有幫助~

腳踏實地行,海闊天空飛~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Android 13(API 33)於 2022年8月15日 正式發佈(發佈時間較往年早了一些),正式版Release源代碼也於當日被推送到AOSP Android開源項目。 截止到筆者撰寫這篇文章時,國內部分應用軟體開發廠商已逐步接到手機廠商(華米OV等)的新版本適配要求。當前,對於Android... ...
  • 隨著互聯網的不斷普及,越來越多老百姓使用智能設備觸達互聯網。但用戶經常發現自己無意間提到的東西,打開App就收到相關產品的廣告推送,甚至有人懷疑手機App是通過麥克風來竊取自己平時聊天信息中的關鍵詞進行定向的廣告推送。 這種懷疑不無道理,與傳統廣告相比,如今的媒體廣告主投放的廣告定位更準確、形式更豐 ...
  • javascript編程單線程之同步模式 主流的js 環境都是單線程嗎模式執行js 代碼, js採用為單線程的原因與最開始設計初衷有關,最早是運行在瀏覽器端的腳本語言,目的是為了實現頁面上的動態交互,實現頁面交互的核心就是dom操作,這也就決定了js必須使用單線程的模式來處理,不然就會造成嚴重的線程 ...
  • 好家伙,JS基礎接著學, 1.事件流 頁面哪個部分擁有特定的事件? 可以把頁面想象成一個同心圓, 當你戳了其中的一點,其實你同時戳中了很多個圓 當你點擊一個頁面中的按鈕,實際上你同時點擊了這個按鈕,這個按鈕的容器,以及整個頁面 於是有了這麼個概念,事件流, 我們用事件流描述頁面接受事件的順序, 舉個 ...
  • 原博客地址 01. 如何開啟js嚴格模式?js嚴格模式有什麼特點? 參考點:js基礎知識 參考答案: // 全局開啟 'use stcict' // 局部開啟 function fu(){ 'use strict' } /* 1.全局變數必須先聲明 2.禁止使用with 3.創建eval作用域 4. ...
  • 01,如何開啟JS嚴格模式?JS嚴格模式有什麼特點? 兩種方式 全局開啟在js開頭加上 'use strict' 局部開啟,在作用域開頭加上 function fn(){ 'use strict' } 特點: 1,全局變數必須先聲明 2,禁止使用with 3,創建eval作用域 有單獨的作用域 4, ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 在 Vue,除了核心功能預設內置的指令 ( v-model 和 v-show ),Vue 也允許註冊自定義指令。它的作用價值在於當開發人員在某些場景下需要對普通 DOM 元素進行操作。 Vue 自定義指令有全局註冊和局部註冊兩種方式。先來 ...
  • 1 <!-- ! 廢話不多說,直接看代碼吧 ! --> 2 <template> 3 <div class=""> 4 <div class="chart" ref="ref_chart" style="width:370px;height:250px;"> </div> 5 </div> 6 </ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...