欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue遞歸組件實(shí)戰(zhàn)之簡單樹形控件實(shí)例代碼

 更新時(shí)間:2019年08月27日 15:33:42   作者:heath_learning  
這篇文章主要介紹了vue遞歸組件實(shí)戰(zhàn)之簡單樹形控件的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

 

在編寫樹形組件時(shí)遇到的問題:

  • 組件如何才能遞歸調(diào)用?
  • 遞歸組件點(diǎn)擊事件如何傳遞?

2、樹形控件基本結(jié)構(gòu)及樣式

<template>
 <ul class="vue-tree">
  <li class="tree-item">
   <div class="tree-content"><!--節(jié)點(diǎn)內(nèi)容-->
    <div class="expand-arrow"></div><!--展開或收縮節(jié)點(diǎn)按鈕-->
    <div class="tree-label">小學(xué)</div><!--節(jié)點(diǎn)文本內(nèi)容-->
   </div>
   <ul class="sub-tree"><!--子節(jié)點(diǎn)-->
    <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">數(shù)學(xué)</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、組件目錄及數(shù)據(jù)結(jié)構(gòu)

目錄結(jié)構(gòu)

vue-tree

VueTree.vue
TreeItem.vue

樹形控件數(shù)據(jù)結(jié)構(gòu)

let treeData = [
 {
  text: "一級(jí)", // 顯示的文字
  expand: false, // 默認(rèn)是否展開
  children: [ // 子節(jié)點(diǎn)
   {
    text: "一級(jí)-1",
    expand: false,
   },
   {
    text: "一級(jí)-2",
    expand: false,
    children: [
     {
      text: "一級(jí)-2-1",
      expand: false,
     },
     {
      text: "一級(jí)-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組件中調(diào)用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 {};
    }
   },
   // 節(jié)點(diǎn)點(diǎn)擊事件
   treeClickEvent: {
    type: Function,
    default() {
     return function () {};
    }
   }
  },
  data(){
   return {
    // 節(jié)點(diǎn)是否展開
    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;
   },
   // 創(chuàng)建一個(gè)唯一id
   uuid(){
    let str = Math.random().toString(32);
    str = str.substr(2);
    return str;
   },
   // 節(jié)點(diǎn)點(diǎn)擊事件
   _clickEvent(){
    // 如果有傳遞事件函數(shù),則調(diào)用事件函數(shù)并傳遞當(dāng)前節(jié)點(diǎn)數(shù)據(jù)及組件
    if(this.treeClickEvent && typeof this.treeClickEvent === 'function'){
     this.treeClickEvent(this.treeItemData, this);
    }
   }
  }
 }
</script>

3.1.1、解決 組件如何才能遞歸調(diào)用? 問題

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

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

3.1.2、解決 遞歸組件點(diǎn)擊事件如何傳遞? 問題

我這里的解決方案是使用 props 將事件函數(shù)傳遞進(jìn)來,在點(diǎn)擊節(jié)點(diǎn)的時(shí)候調(diào)用事件函數(shù),并把相應(yīng)的數(shù)據(jù)傳遞進(jìn)去。

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

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: {
   // 樹形控件數(shù)據(jù)
   treeData: {
    type: Array,
    default(){
     return [];
    }
   },
   // 節(jié)點(diǎn)點(diǎn)擊事件
   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: "一級(jí)", // 顯示的文字
     expand: false, // 默認(rèn)是否展開
     children: [
      {
       text: "二級(jí)-1",
       expand: false,
      },
      {
       text: "二級(jí)-2",
       expand: false,
       children: [
        {
         text: "三級(jí)-1",
         expand: false,
        },
        {
         text: "三級(jí)-2",
         expand: false,
         children: [
          {
           text: "四級(jí)-1",
           expand: false,
          }
         ]
        }
       ]
      }
     ]
    },
    {
     text: "一級(jí)-2",
     expand: false
    }
   ]
  }
 },
 methods: {
  treeClickEvent(item, treeItem){
   console.log(item);
  }
 },
 components: {
  VueTree
 }
}
</script>

總結(jié)

以上所述是小編給大家介紹的vue遞歸組件實(shí)戰(zhàn)之簡單樹形控件實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • elementUI select組件默認(rèn)選中效果實(shí)現(xiàn)的方法

    elementUI select組件默認(rèn)選中效果實(shí)現(xiàn)的方法

    這篇文章主要介紹了elementUI select組件默認(rèn)選中效果實(shí)現(xiàn)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 詳解vue移動(dòng)端日期選擇組件

    詳解vue移動(dòng)端日期選擇組件

    小編給大家整理了關(guān)于vue移動(dòng)端日期選擇組件的知識(shí)點(diǎn)總結(jié),希望能夠給讀者帶來幫助,一起學(xué)習(xí)參考下。
    2018-02-02
  • 分享9個(gè)Vue的巧妙冷技巧

    分享9個(gè)Vue的巧妙冷技巧

    這篇文章主要介紹了分享9個(gè)Vue的巧妙冷技巧,文章首先通過巧用$attrs和$listeners的技巧展開,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • vue項(xiàng)目通過a標(biāo)簽下載圖片至zip包的示例代碼

    vue項(xiàng)目通過a標(biāo)簽下載圖片至zip包的示例代碼

    在vue項(xiàng)目中,將圖片下載可使用流的形式,下載成單個(gè)圖片,或者將多個(gè)圖片下載至zip包,本文就是介紹使用a標(biāo)簽下載圖片的用法,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-10-10
  • vue前端測試開發(fā)watch監(jiān)聽data的數(shù)據(jù)變化

    vue前端測試開發(fā)watch監(jiān)聽data的數(shù)據(jù)變化

    這篇文章主要為大家介紹了vue測試開發(fā)watch監(jiān)聽data的數(shù)據(jù)變化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 使用Vue實(shí)現(xiàn)調(diào)用接口加載頁面初始數(shù)據(jù)

    使用Vue實(shí)現(xiàn)調(diào)用接口加載頁面初始數(shù)據(jù)

    今天小編就為大家分享一篇使用Vue實(shí)現(xiàn)調(diào)用接口加載頁面初始數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • vue-cli3環(huán)境變量與分環(huán)境打包的方法示例

    vue-cli3環(huán)境變量與分環(huán)境打包的方法示例

    這篇文章主要介紹了vue-cli3環(huán)境變量與分環(huán)境打包的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • 如何將HTML頁面改寫到vue項(xiàng)目中詳解

    如何將HTML頁面改寫到vue項(xiàng)目中詳解

    html和vue都是前端技術(shù)中非常重要的一部分,其中html是web開發(fā)的基石,而vue則是現(xiàn)代化的前端開發(fā)框架之一,下面這篇文章主要給大家介紹了關(guān)于如何將HTML頁面改寫到vue項(xiàng)目中的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • 7個(gè)很棒的Vue開發(fā)技巧分享

    7個(gè)很棒的Vue開發(fā)技巧分享

    這篇文章主要為大家整理了7個(gè)很棒的Vue開發(fā)技巧,可以幫助大家更好的理解和使用vue框架。文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-02-02
  • Vue 3.0雙向綁定原理的實(shí)現(xiàn)方法

    Vue 3.0雙向綁定原理的實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了Vue 3.0雙向綁定原理的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評(píng)論