ホームページ > ウェブフロントエンド > jsチュートリアル > vuejs で再帰ツリー メニュー コンポーネントを実装する方法 (詳細なチュートリアル)

vuejs で再帰ツリー メニュー コンポーネントを実装する方法 (詳細なチュートリアル)

亚连
リリース: 2018-06-12 10:42:19
オリジナル
1905 人が閲覧しました

この記事では主に vuejs での再帰ツリー メニュー コンポーネントの実装を紹介し、参考として提供します。

前書き

少し前に、再帰コンポーネントが最も使用されるバックエンド管理システムを構築するために vue を使用しました。 また、公式ドキュメントに不慣れなため、多くの落とし穴を踏んでしまいました。今日はみんなと共有します。

再帰コンポーネント

コンポーネントは、name オプションがある場合にのみ、テンプレート内でそれ自体を再帰的に呼び出すことができます。 公式Webサイトのこの文は、キー定義コンポーネントにはname属性が必要であるというものです。

シミュレーションデータの形式は次のとおりです:

[
  {
   "id": "1",
   "menuName": "基础管理",
   "menuCode": "10",
   "children": [
    {
     "menuName": "用户管理",
     "menuCode": "11"
    },
    {
     "menuName": "角色管理",
     "menuCode": "12",
     "children": [
      {
       "menuName": "管理员",
       "menuCode": "121"
      },
      {
       "menuName": "CEO",
       "menuCode": "122"
      },
      {
       "menuName": "CFO",
       "menuCode": "123"
      },
      {
       "menuName": "COO",
       "menuCode": "124"
      },
      {
       "menuName": "普通人",
       "menuCode": "124"
      }
     ]
    },
    {
     "menuName": "权限管理",
     "menuCode": "13"
    }
   ]
  },
  {
   "id": "2",
   "menuName": "商品管理",
   "menuCode": ""
  },
  {
   "id": "3",
   "menuName": "订单管理",
   "menuCode": "30",
   "children": [
    {
     "menuName": "订单列表",
     "menuCode": "31"
    },
    {
     "menuName": "退货列表",
     "menuCode": "32",
     "children": []
    }
   ]
  },
  {
   "id": "4",
   "menuName": "商家管理",
   "menuCode": "",
   "children": []
  }
 ]
ログイン後にコピー

html 私たちのアイデアは、ulにliを設定し、無制限のulはliを設定し、タイトルをp要素で囲むことです。

<template>
 <li>
  <span @click="toggle">   <!-- toggle:点击关闭展开 -->
   <i v-if="isFolder" class="icon" :class="[open ? &#39;folder-open&#39; : &#39;folder&#39;]" @cilck="toggle"></i>
   <!-- <i v-if="isFolder" class="icon " :class="[open ? &#39;folder-open&#39; : &#39;folder&#39;]"></i> -->
   <i v-if="!isFolder" class="icon folder-text"></i>
   {{model.menuName}}
  </span>
  <ul v-show="open" v-if="isFolder">
   <treeMenu v-for="item in model.children" :model="item"></treeMenu>
  </ul>
 </li>
</template>
ログイン後にコピー

公式ドキュメントに記載されている再帰コンポーネントは、 name 属性の使用

注意すべき点はい、親コンポーネントから渡されたデータは最初にディープコピーする必要があります

ディープコピー:データにpropsを割り当て、値、JSONを割り当てながらディープコピーを作成しますdata 内の .parse(JSON.stringify(この値で大丈夫です)) で、データ値は勝手に名前が付けられます

export default {
  name: &#39;treeMenu&#39;,
  //props: [&#39;model&#39;], //这样和下面效果一样
  props: {
   model: { type: Object },
  },
  components: {},
}
ログイン後にコピー

vueの考え方に従い、Domツリーを操作せずに、2つの変数を定義します。 1 つはサブメニューの表示と非表示を切り替えるため (open)、もう 1 つはサブメニューを保存してアイコンを変更するため (isFolder) です。

  data() {
   return {
    open: false, //一个显示隐藏子菜单(open)
    //isFolder: true  //这个不要写死,运用计算属性计算看存不存在
   }
  },
ログイン後にコピー

vue 計算プロパティを使用して、isFolder の値を動的に変更し、アイコンを変更し、子の有無と子の長さを決定します

  computed: {
   isFolder() { //利用vue计算属性动态改变isFolder的值,修改图标,判断存在不子级和子级长度
    // return this.model.children && this.model.children.length //和下面效果一样
    let isFolder = false
    if (this.model.children && this.model.children.length) {
     isFolder = true;
    } else {
     isFolder = false;
    }
    return isFolder
   }
  },
ログイン後にコピー

非表示のイベントを表示します

  methods: {
   toggle() {
    if (this.isFolder) {
     this.open = !this.open
    }
   }
  },
ログイン後にコピー

この時点で、ツリー メニューが完成しました

上記は私です。皆さんのためにまとめました。今後皆さんのお役に立てれば幸いです。

関連記事:

詳細な回答: vue の変更はコンポーネントにどのような影響を与えますか?

JavaScriptを使用して宝くじシステムを実装する方法

layuiでの値の受け渡しに関する問題

vueでvue-cliを使用してhelloWorldを構築する方法

Parcelを使用してパッケージ化する方法

以上がvuejs で再帰ツリー メニュー コンポーネントを実装する方法 (詳細なチュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート