久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

聊聊Ant Design Vue中怎么實(shí)現(xiàn)省市穿梭框

本篇文章帶大家了解一下利用Ant Design Vue實(shí)現(xiàn)省市穿梭框的方法,希望對(duì)大家有所幫助!

聊聊Ant Design Vue中怎么實(shí)現(xiàn)省市穿梭框

樹(shù)形穿梭框

官方樹(shù)穿梭框如下,左右是樹(shù)結(jié)構(gòu),右邊是列表。

本質(zhì)上是有兩套數(shù)據(jù)源,tree 使用的是樹(shù)狀數(shù)據(jù)源,transfer 使用的是列表數(shù)據(jù)源,將多維的樹(shù)狀數(shù)據(jù)源轉(zhuǎn)為一維的,就是列表數(shù)據(jù)了。

具體使用可以查看官方文檔之 帶搜索框的穿梭框(https://antdv.com/components/transfer-cn/)

聊聊Ant Design Vue中怎么實(shí)現(xiàn)省市穿梭框

城市穿梭框

改造穿梭框的原因:

  • targetKeys只需要城市數(shù)據(jù),不需要省份數(shù)據(jù)

  • 源穿梭框中,子節(jié)點(diǎn)和父節(jié)點(diǎn)沒(méi)有關(guān)聯(lián)選中關(guān)系,需要處理,畢竟省市級(jí)是需要聯(lián)動(dòng)的

  • 目標(biāo)穿梭框,也要支持樹(shù)狀結(jié)構(gòu)

主要實(shí)現(xiàn)功能點(diǎn):

  • 樹(shù)形結(jié)構(gòu)數(shù)據(jù)處理:關(guān)鍵詞過(guò)濾;已選數(shù)據(jù)禁用狀態(tài);

  • 實(shí)現(xiàn)父節(jié)點(diǎn)和節(jié)點(diǎn)的關(guān)聯(lián)選中

  • 穿梭框右側(cè)僅展示城市數(shù)據(jù),不顯示省份數(shù)據(jù)

  • 選中城市數(shù)據(jù):帶省級(jí)信息返回,滿(mǎn)足接口要求,即返回樹(shù)狀結(jié)構(gòu)

聊聊Ant Design Vue中怎么實(shí)現(xiàn)省市穿梭框

改造的本質(zhì):基于transfer的二次改造,主要是對(duì)數(shù)據(jù)的處理,組件基本沒(méi)啥改變

組件參數(shù)和事件

自定義參數(shù):考慮對(duì)外暴露的參數(shù),參數(shù)的作用,屬性等 自定義事件:考慮暴露出去的回調(diào)事件

// 自定義參數(shù) export default {   props: {     dataSource: {       // 數(shù)據(jù)源       type: Array,       default: () => [],     },     targetKey: {       // 右側(cè)框數(shù)據(jù)的 key 集合       type: Array,       default: () => [],     },   }, };  // handleChange回調(diào)函數(shù):treeData-左側(cè)樹(shù)結(jié)構(gòu)數(shù)據(jù),toArray-右側(cè)樹(shù)結(jié)構(gòu)數(shù)據(jù),targetKeys-選中城市key集合 this.$emit("handleChange", this.treeData, toArray, this.targetKeys);

穿梭框處理

<template>   <!-- 穿梭框組件,數(shù)據(jù)源為列表形式 -->   <a-transfer     class="mcd-transfer"     ref="singleTreeTransfer"     show-search     :locale="localeConfig"     :titles="['所有城市', '已選城市']"     :data-source="transferDataSource"     :target-keys="targetKeys"     :render="(item) => item.label"     :show-select-all="true"     @change="handleTransferChange"     @search="handleTransferSearch"   >     <template       slot="children"       slot-scope="{         props: { direction, selectedKeys },         on: { itemSelect, itemSelectAll },       }"     >       <!-- 左邊源數(shù)據(jù)框:樹(shù)形控件 -->       <a-tree         v-if="direction === 'left'"         class="mcd-tree"         blockNode         checkable         :checked-keys="[...selectedKeys, ...targetKeys]"         :expanded-keys="expandedKeys"         :tree-data="treeData"         @expand="handleTreeExpanded"         @check="           (_, props) => {             handleTreeChecked(               _,               props,               [...selectedKeys, ...targetKeys],               itemSelect,               itemSelectAll             );           }         "         @select="           (_, props) => {             handleTreeChecked(               _,               props,               [...selectedKeys, ...targetKeys],               itemSelect,               itemSelectAll             );           }         "       />     </template>   </a-transfer> </template>

數(shù)據(jù)源處理

  • 穿梭框數(shù)據(jù)處理(transferDataSource):多維數(shù)據(jù)轉(zhuǎn)為一維數(shù)據(jù)

  • 樹(shù)數(shù)據(jù)處理(treeData):數(shù)據(jù)源過(guò)濾處理,數(shù)據(jù)禁止操作處理

// 數(shù)據(jù)源示例 const dataSource = [   {     pid: "0",     key: "1000",     label: "黑龍江省",     title: "黑龍江省",     children: [       {         pid: "1000",         key: "1028",         label: "大興安嶺地區(qū)",         title: "大興安嶺地區(qū)",       },     ],   }, ];  // ant-transfer穿梭框數(shù)據(jù)源 transferDataSource() {   // 穿梭框數(shù)據(jù)源   let transferDataSource = [];   // 穿梭框數(shù)據(jù)轉(zhuǎn)換,多維轉(zhuǎn)為一維   function flatten(list = []) {     list.forEach((item) => {       transferDataSource.push(item);       // 子數(shù)據(jù)處理       if (item.children && item.children.length) {         flatten(item.children);       }     });   }   if (this.dataSource && this.dataSource.length) {     flatten(JSON.parse(JSON.stringify(this.dataSource)));   }   return transferDataSource; }  // ant-tree樹(shù)數(shù)據(jù)源 treeData() {   // 樹(shù)形控件數(shù)據(jù)源   const validate = (node, map) => {     // 數(shù)據(jù)過(guò)濾處理 includes     return node.title.includes(this.keyword);   };   const result = filterTree(     this.dataSource,     this.targetKeys,     validate,     this.keyword   );   return result; }  // 樹(shù)形結(jié)構(gòu)數(shù)據(jù)過(guò)濾 const filterTree = (tree = [], targetKeys = [], validate = () => {}) => {   if (!tree.length) {     return [];   }   const result = [];   for (let item of tree) {     if (item.children && item.children.length) {       let node = {         ...item,         children: [],         disabled: targetKeys.includes(item.key), // 禁用屬性       };       // 子級(jí)處理       for (let o of item.children) {         if (!validate.apply(null, [o, targetKeys])) continue;         node.children.push({ ...o, disabled: targetKeys.includes(o.key) });       }       if (node.children.length) {         result.push(node);       }     }   }   return result; };

穿梭框事件處理

  • change 事件,回調(diào)數(shù)據(jù)(handleTransferChange)

  • search 搜索事件(handleTransferSearch)

// 穿梭框:change事件 handleTransferChange(targetKeys, direction, moveKeys) {   // 過(guò)濾:避免頭部操作欄“全選”將省級(jí)key選中至右邊   this.targetKeys = targetKeys.filter((o) => !this.pidKeys.includes(o));   // 選中城市數(shù)據(jù):帶省級(jí)信息返回,滿(mǎn)足接口要求   const validate = (node, map) => {     return map.includes(node.key) && node.title.includes(this.keyword);   };   let toArray = filterTree(this.dataSource, this.targetKeys, validate);   // handleChange回調(diào)函數(shù):treeData-左側(cè)樹(shù)結(jié)構(gòu)數(shù)據(jù),toArray-右側(cè)樹(shù)結(jié)構(gòu)數(shù)據(jù),targetKeys-選中城市key集合   this.$emit("handleChange", this.treeData, toArray, this.targetKeys); },  // 穿梭框:搜索事件 handleTransferSearch(dir, value) {   if (dir === "left") {     this.keyword = value;   } },

樹(shù)事件

  • change 事件,處理父節(jié)點(diǎn)和子節(jié)點(diǎn)的聯(lián)動(dòng)關(guān)系(handleTreeChecked)

  • expand 事件:樹(shù)的展開(kāi)和收縮(handleTreeExpanded)

// 樹(shù)形控件:change事件 handleTreeChecked(keys, e, checkedKeys, itemSelect, itemSelectAll) {   const {     eventKey,     checked,     dataRef: { children },   } = e.node;   if (this.pidKeys && this.pidKeys.includes(eventKey)) {     // 父節(jié)點(diǎn)選中:將所有子節(jié)點(diǎn)也選中     let childKeys = children ? children.map((item) => item.key) : [];     if (childKeys.length) itemSelectAll(childKeys, !checked);   }   itemSelect(eventKey, !isChecked(checkedKeys, eventKey)); // 子節(jié)點(diǎn)選中 }, // 樹(shù)形控件:expand事件 handleTreeExpanded(expandedKeys) {   this.expandedKeys = expandedKeys; },

清除事件

重新打開(kāi)時(shí),需要還原組件狀態(tài),例如滾動(dòng)條位置,搜索框關(guān)鍵字等

handleReset() {   this.keyword = "";   this.$nextTick(() => {     // 搜索框關(guān)鍵字清除     const ele = this.$refs.singleTreeTransfer.$el.getElementsByClassName(       "anticon-close-circle"     );     if (ele && ele.length) {       ele[0] && ele[0].click();       ele[1] && ele[1].click();     }     // 滾動(dòng)條回到頂部     if (this.$el.querySelector(".mcd-tree")) {       this.$el.querySelector(".mcd-tree").scrollTop = 0;     }     // 展開(kāi)數(shù)據(jù)還原     this.expandedKeys = [];   }); }

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
亚洲综合五月| 日韩av中文字幕一区二区 | 久久久久伊人| 一本一道久久a久久| aⅴ色国产欧美| 久久大逼视频| 亚洲免费毛片| 日韩精品导航| 九九久久电影| 免费在线欧美视频| 天海翼亚洲一区二区三区| 亚洲人亚洲人色久| 国产色99精品9i| 国产精久久久| 99在线观看免费视频精品观看| 国产精品不卡| 欧美亚洲日本精品| 群体交乱之放荡娇妻一区二区| 免费看的黄色欧美网站| 国产午夜精品一区二区三区欧美| 国产精品分类| 精品久久影院| 成人在线超碰| 日韩一区欧美| 麻豆精品蜜桃视频网站| 99久久www免费| 91精品啪在线观看国产18| 午夜在线视频观看日韩17c| 日韩三区在线| 亚洲视频综合| 男女男精品网站| 国产精品高清一区二区| 欧美国产另类| 日韩久久一区二区三区| 在线成人直播| 国产精品久久久亚洲一区| 国产成人精品三级高清久久91| 日韩不卡一区| 欧美激情aⅴ一区二区三区| 久久精品伊人| 欧产日产国产精品视频| 国精品一区二区三区| 欧美日韩在线二区| 91精品国产一区二区在线观看| 国产精品第一国产精品| 成人污污视频| 国产91久久精品一区二区| 中文字幕av一区二区三区四区| 欧美日韩va| 亚洲黄色网址| 欧美在线观看天堂一区二区三区| 国产精品毛片aⅴ一区二区三区| 日韩av网站在线观看| 97精品资源在线观看| 日韩中文视频| 蜜桃精品视频| 午夜久久av| 先锋影音久久久| 欧美成人基地| 欧美国产另类| 青青国产精品| 青青青国产精品| 在线手机中文字幕| 青青草国产精品亚洲专区无| 天堂va欧美ⅴa亚洲va一国产| 日韩精彩视频在线观看| 九一成人免费视频| 欧美日韩国产高清| 91高清一区| 视频一区欧美日韩| 日本欧美在线看| 久久国产婷婷国产香蕉| 欧美1区2区3| 97视频热人人精品免费| 伊伊综合在线| 视频一区二区三区入口| 久久国产婷婷国产香蕉| 国产一区二区三区视频在线| 日本欧美不卡| 中文精品电影| 麻豆久久久久久| 精品一区电影| 亚洲精品成人一区| 国产精东传媒成人av电影| 久久av资源| 国产亚洲综合精品| 奇米狠狠一区二区三区| 麻豆视频观看网址久久| 日韩电影二区| 欧美粗暴jizz性欧美20| 免费日韩视频| 日韩精品首页| 香蕉成人av| 天堂日韩电影| 欧美黄页在线免费观看| 久久亚洲色图| 偷拍精品精品一区二区三区| 成人精品国产亚洲| 91亚洲精品视频在线观看| 日韩中文字幕无砖| 亚洲一区欧美激情| 国产不卡人人| 久久国产精品色av免费看| 国产精品普通话对白| 久久国产日本精品| 欧美一区二区三区高清视频| 伊人久久亚洲美女图片| 欧美一区二区三区激情视频| 红桃视频欧美| 日韩av不卡在线观看| 日韩av黄色在线| 日本成人在线一区| 亚洲精品影院在线观看| 日韩精品免费一区二区在线观看| 国产精品密蕾丝视频下载| 久久精品亚洲人成影院| 另类专区亚洲| 亚洲二区精品| 狠狠爱成人网| 国产二区精品| 亚洲激情中文在线| 999在线观看精品免费不卡网站| 亚洲一区二区动漫| 日韩三级精品| 成人欧美一区二区三区的电影| 国产精品中文字幕制服诱惑| 成人综合一区| 巨乳诱惑日韩免费av| 精品一区视频| 国产精品av一区二区| 欧美另类综合| 91麻豆精品| 色爱综合av| 国产欧美日韩一区二区三区四区| 成人午夜国产| 红杏一区二区三区| av不卡在线| 少妇精品在线| 鲁鲁在线中文| 亚洲一区欧美| xxxxx性欧美特大| 红桃视频国产一区| 欧美成人aaa| 亚洲电影在线| 免费欧美一区| 国产一区亚洲| 日本视频一区二区| 蜜臀久久99精品久久一区二区| 青草综合视频| 国产精品不卡| 天堂久久av| 国产精品99免费看| 群体交乱之放荡娇妻一区二区| 国产一二在线播放| 青青青国产精品| 日韩精品一二三区| 色爱综合av| 91欧美在线| 狠狠干综合网| 日韩不卡视频在线观看| 欧美a在线观看| 麻豆国产精品| 久久免费福利| 婷婷激情一区| 麻豆精品91| 国产精品亚洲欧美| 99久久九九| 亚州精品视频| 欧美一区二区三区高清视频| 成人在线视频区| 日韩不卡在线观看日韩不卡视频| 亚洲欧洲美洲av| 蜜桃一区二区三区在线观看| 999久久久91| 韩国三级一区| 亚洲人成在线网站| 伊人成人网在线看| 国产视频网站一区二区三区| 成人看片网站| 久久久噜噜噜| 免费观看亚洲| 欧美aa在线观看| 亚洲欧美日本国产专区一区| 国产黄色精品| 亚洲一级黄色| 日韩理论视频| 免播放器亚洲一区| 日韩在线网址| 丝袜国产日韩另类美女| 日本中文字幕视频一区| 日韩久久视频| 欧美一区不卡| 狠狠色狠狠色综合日日tαg| 日韩一区精品视频| 麻豆精品一区二区综合av| 国产成人黄色| 久久国产日韩| 中文在线日韩| 麻豆国产一区| 免播放器亚洲|