亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

vue遞歸組件實戰之簡單樹形控件實例代碼

2019-11-19 10:57:09
字體:
來源:轉載
供稿:網友

1、遞歸組件-簡單樹形控件預覽及問題

 

在編寫樹形組件時遇到的問題:

  • 組件如何才能遞歸調用?
  • 遞歸組件點擊事件如何傳遞?

2、樹形控件基本結構及樣式

<template> <ul class="vue-tree">  <li class="tree-item">   <div class="tree-content"><!--節點內容-->    <div class="expand-arrow"></div><!--展開或收縮節點按鈕-->    <div class="tree-label">小學</div><!--節點文本內容-->   </div>   <ul class="sub-tree"><!--子節點-->    <li class="tree-item expand">     <div class="tree-content">      <div class="expand-arrow"></div>      <div class="tree-label">語文</div>     </div>    </li>    <li class="tree-item">     <div class="tree-content">      <div class="expand-arrow"></div>      <div class="tree-label">數學</div>     </div>    </li>   </ul>  </li> </ul></template><style lang="stylus">.vue-tree{ list-style: none; padding: 0; margin: 0; .tree-item{  cursor: pointer;  transition: background-color .2s;  .tree-content{   position: relative;   padding-left: 28px;   &:hover{    background-color: #f0f7ff;   }  }  .expand-arrow{   position: absolute;   top: 0;   left: 0;   width: 28px;   height: 28px;   cursor: pointer;   &::after{    position: absolute;    top: 50%;    left: 50%;    display: block;    content: ' ';    border-width: 5px;    border-style: solid;    border-color: transparent;    border-left-color: #ccc;    margin: -5px 0 0 -2.5px;    transition: all .2s;   }  }  &.expand{   &>.tree-content{    background-color: #f0f7ff;    &>.expand-arrow{     &::after{      transform: rotate(90deg);      margin: -2.5px 0 0 -5px;     }    }   }  }  .tree-label{   height: 28px;   line-height: 28px;   font-size: 14px;  }  .sub-tree{   display: none;   list-style: none;   padding: 0 0 0 28px;   margin: 0;  }  &.expand>.sub-tree{   display: block;  }  &.no-child{   &>.tree-content{    &>.expand-arrow{     display: none;    }   }  } }}</style>

3、組件目錄及數據結構

目錄結構

vue-tree

VueTree.vue
TreeItem.vue

樹形控件數據結構

let treeData = [ {  text: "一級", // 顯示的文字  expand: false, // 默認是否展開  children: [ // 子節點   {    text: "一級-1",    expand: false,   },   {    text: "一級-2",    expand: false,    children: [     {      text: "一級-2-1",      expand: false,     },     {      text: "一級-2-2",      expand: false,     }    ]   }  ] }];

3.1、 TreeItem.vue 代碼

<template> <li class="tree-item" :class="{expand: isExpand, 'no-child': !treeItemData.children || treeItemData.children.length === 0}">  <div class="tree-content" @click="_clickEvent">   <div class="expand-arrow" @click.stop="expandTree()"></div>   <div class="tree-label">{{treeItemData.text}}</div>  </div>  <ul class="sub-tree" v-if="treeItemData.children && treeItemData.children.length > 0">   <!--TreeItem組件中調用TreeItem組件-->   <TreeItem    v-for="item in treeItemData.children"    :tree-item-data="item"    :key="uuid()"    :tree-click-event="treeClickEvent"></TreeItem>  </ul> </li></template><script> export default {  name: "TreeItem",  props: {   treeItemData: {    type: Object,    default(){     return {};    }   },   // 節點點擊事件   treeClickEvent: {    type: Function,    default() {     return function () {};    }   }  },  data(){   return {    // 節點是否展開    isExpand: this.treeItemData.expand || false   }  },  methods: {   // 展開/收縮   expandTree(flag){    if(!this.treeItemData.children || this.treeItemData.children.length === 0){     return;    }    if(typeof flag === 'undefined'){     flag = !this.isExpand;    }else{     flag = !!flag;    }    this.isExpand = flag;   },   // 創建一個唯一id   uuid(){    let str = Math.random().toString(32);    str = str.substr(2);    return str;   },   // 節點點擊事件   _clickEvent(){    // 如果有傳遞事件函數,則調用事件函數并傳遞當前節點數據及組件    if(this.treeClickEvent && typeof this.treeClickEvent === 'function'){     this.treeClickEvent(this.treeItemData, this);    }   }  } }</script>

3.1.1、解決 組件如何才能遞歸調用? 問題

在組件模板內調用自身 必須明確定義組件的name屬性 ,并且遞歸調用時組件名稱就是name屬性。如在 TreeItem.vue 組件中組件的name名稱為'TreeItem',那么在template中調用時組件名稱就必須是 <TreeItem> 。

當然也可以全局注冊組件,具體可以查看vue官方文檔 遞歸組件

3.1.2、解決 遞歸組件點擊事件如何傳遞? 問題

我這里的解決方案是使用 props 將事件函數傳遞進來,在點擊節點的時候調用事件函數,并把相應的數據傳遞進去。

之前也嘗試過使用 $emit 的形式并把數據傳遞過去,由于是遞歸組件,這樣一直 $emit ,到最外層時傳遞的數據就變了,比如傳遞是第3層節點的數據,到最后執行時數據就變成第1層節點的數據了

4、 VueTree.vue 組件

<template> <ul class="vue-tree">  <TreeItem    v-for="(item, index) in treeData"    :key="index"    :treeItemData="item"    :tree-click-event="treeClickEvent"></TreeItem> </ul></template><script> import TreeItem from "./TreeItem"; export default {  name: "VueTreeMenu",  components: {   TreeItem  },  props: {   // 樹形控件數據   treeData: {    type: Array,    default(){     return [];    }   },   // 節點點擊事件   treeClickEvent: {    type: Function,    default() {     return function () {};    }   }  } }</script><style lang="stylus">.vue-tree{ list-style: none; padding: 0; margin: 0; .tree-item{  cursor: pointer;  transition: background-color .2s;  .tree-content{   position: relative;   padding-left: 28px;   &:hover{    background-color: #f0f7ff;   }  }  .expand-arrow{   position: absolute;   top: 0;   left: 0;   width: 28px;   height: 28px;   cursor: pointer;   &::after{    position: absolute;    top: 50%;    left: 50%;    display: block;    content: ' ';    border-width: 5px;    border-style: solid;    border-color: transparent;    border-left-color: #ccc;    margin: -5px 0 0 -2.5px;    transition: all .2s;   }  }  &.expand{   &>.tree-content{    background-color: #f0f7ff;    &>.expand-arrow{     &::after{      transform: rotate(90deg);      margin: -2.5px 0 0 -5px;     }    }   }  }  .tree-label{   height: 28px;   line-height: 28px;   font-size: 14px;  }  .sub-tree{   display: none;   list-style: none;   padding: 0 0 0 28px;   margin: 0;  }  &.expand>.sub-tree{   display: block;  }  &.no-child{   &>.tree-content{    /*padding-left: 0;*/    &>.expand-arrow{     display: none;    }   }  } }}</style>

5、使用樹形組件

<template> <div class="app" id="app">  <VueTree :tree-data="treeData2" :tree-click-event="treeClickEvent"></VueTree> </div></template><script>import VueTree from "./components/vue-tree/VueTree";export default { name: 'app', data(){  return {   treeData2: [    {     text: "一級", // 顯示的文字     expand: false, // 默認是否展開     children: [      {       text: "二級-1",       expand: false,      },      {       text: "二級-2",       expand: false,       children: [        {         text: "三級-1",         expand: false,        },        {         text: "三級-2",         expand: false,         children: [          {           text: "四級-1",           expand: false,          }         ]        }       ]      }     ]    },    {     text: "一級-2",     expand: false    }   ]  } }, methods: {  treeClickEvent(item, treeItem){   console.log(item);  } }, components: {  VueTree }}</script>

總結

以上所述是小編給大家介紹的vue遞歸組件實戰之簡單樹形控件實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产高清视频一区三区| 亚洲电影免费观看高清完整版在线观看| 亚洲欧洲激情在线| 亚洲成年网站在线观看| 中文字幕在线看视频国产欧美| 福利视频一区二区| 少妇高潮久久久久久潘金莲| 亚洲男人天堂古典| 亚洲国产又黄又爽女人高潮的| 午夜精品国产精品大乳美女| 亚洲国产精品热久久| 亚洲国产精品高清久久久| 最近的2019中文字幕免费一页| 91人人爽人人爽人人精88v| 色综合91久久精品中文字幕| 中文字幕一区日韩电影| 国产成人激情小视频| 日韩成人免费视频| 亚洲国产精品女人久久久| 日韩激情av在线播放| 亚洲天堂久久av| 成人在线观看视频网站| 欧美成在线观看| 国产精品久久久久久网站| 国产精品99久久久久久久久久久久| 亚洲电影在线看| 亚洲国产精品99| 亚洲美女自拍视频| 亚洲精品ady| 中文综合在线观看| 久热精品视频在线观看| 国产精品久久久久久久久久三级| 欧美激情videos| 北条麻妃一区二区在线观看| 欧美日韩免费在线观看| 国产精品久久久久久久久久久新郎| 在线视频欧美日韩| 国产视频欧美视频| 狠狠色狠狠色综合日日小说| 亚洲国产毛片完整版| 欧美中文字幕在线观看| 日韩欧美亚洲成人| 国产精品一区二区在线| 久久成人在线视频| 久久久久久999| 国产精品美女久久久免费| 欧美又大又硬又粗bbbbb| 日韩国产欧美区| 日韩久久免费电影| 国产91网红主播在线观看| 久久久电影免费观看完整版| 疯狂做受xxxx欧美肥白少妇| 国产一区二区黄| 亚洲黄色在线观看| 日韩在线视频网| 欧美大荫蒂xxx| 国产va免费精品高清在线| 亚洲人成电影网站色…| 欧洲成人午夜免费大片| 久久成人免费视频| 日本精品视频在线观看| 91精品美女在线| 亚洲美女www午夜| 欧美成年人在线观看| 国产精品亚洲精品| 日本高清视频精品| 欧美老女人性生活| 久99九色视频在线观看| 日韩欧美成人精品| 亚洲午夜久久久影院| 777精品视频| 久久成人在线视频| 亚洲天堂免费视频| 亚洲精品美女视频| 日韩美女在线播放| 国产成人一区二区| 日韩视频在线观看免费| 亚洲男人天堂手机在线| 色噜噜亚洲精品中文字幕| 国产精品成人观看视频国产奇米| 欧美视频国产精品| 日韩视频在线观看免费| 欧美一级大片视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品视频公开费视频| 日韩欧美黄色动漫| 国产亚洲精品久久久久动| 亚洲国产另类 国产精品国产免费| 亚洲精品欧美一区二区三区| 亚洲成色999久久网站| 日韩精品福利在线| 亚洲精品乱码久久久久久金桔影视| 欧美成人午夜剧场免费观看| 久久精品影视伊人网| 在线日韩第一页| 日韩av电影国产| 国产日韩一区在线| 精品国偷自产在线视频99| 国产亚洲成av人片在线观看桃| 97精品伊人久久久大香线蕉| 色噜噜狠狠狠综合曰曰曰88av| 国产精品视频自在线| 欧美另类高清videos| 91嫩草在线视频| 国产日韩欧美黄色| 久久免费视频这里只有精品| 欧美激情免费看| 国产又爽又黄的激情精品视频| 亚洲国产成人精品久久| 日韩福利视频在线观看| 欧美极品欧美精品欧美视频| 午夜精品久久久久久久白皮肤| 一本色道久久综合狠狠躁篇的优点| 日韩av最新在线观看| 成人在线激情视频| 国产精品男人的天堂| 欧美资源在线观看| 欧美丝袜美女中出在线| 色婷婷综合成人av| 91久久精品国产91久久性色| 性亚洲最疯狂xxxx高清| 国产狼人综合免费视频| 正在播放欧美视频| 26uuu日韩精品一区二区| 亚洲四色影视在线观看| 性日韩欧美在线视频| 国产精品爱啪在线线免费观看| 26uuu日韩精品一区二区| 成人免费网视频| 久久久久久久999精品视频| 在线日韩精品视频| 欧美成人免费观看| 日韩av在线精品| 欧美大人香蕉在线| 久久精品成人欧美大片古装| 97欧美精品一区二区三区| 成人在线视频网站| 一本色道久久88综合亚洲精品ⅰ| 亚洲理论在线a中文字幕| 国产精品久久久久久av福利软件| 国产日韩精品一区二区| 91视频免费网站| 北条麻妃久久精品| 亚洲天堂免费在线| 国内精品久久久久久| www国产亚洲精品久久网站| 欧美亚洲国产精品| 亚洲电影在线看| 国产精品啪视频| 成人免费在线视频网址| 久久免费成人精品视频| 麻豆成人在线看| 91福利视频网| 国产精品免费观看在线| 精品亚洲一区二区三区| 国产精品海角社区在线观看| 国产精品久久久久久久久久免费| 欧美视频中文在线看| 欧美猛少妇色xxxxx| 91精品国产自产在线观看永久| 国模极品一区二区三区| 色999日韩欧美国产| 亚洲精品乱码久久久久久金桔影视| 亚洲美女性生活视频|