ホームページ > 記事 > ウェブフロントエンド > Vue.js で再帰コンポーネントを使用してツリー メニューを構築する方法
この記事では主に、Vue.js の再帰コンポーネントを使用して折りたたみ可能なツリー メニューを構築するための教育コンテンツを紹介します。興味のある友人は、フォローして学ぶことができます。
Vue.js では、再帰コンポーネントは次のように自身を呼び出します:
Vue.component('recursive-component', { template: `<!--Invoking myself!--> <recursive-component></recursive-component> });
再帰コンポーネントは、ブログ上のコメントやネストされたメニューを表示するためによく使用されます。または、特定のコンテンツは異なりますが、基本的に同じタイプの親と子です。 。例:
ここで、再帰コンポーネントを効果的に使用する方法を示すために、展開/折りたたみ可能なツリー メニューを構築することで段階的に進めていきます。
データ構造
ツリー UI の再帰コンポーネントは、再帰データ構造の視覚的表現になります。このチュートリアルでは、各ノードがオブジェクトであるツリー構造を使用します:
ラベル プロパティ。
子ノードがある場合、nodes プロパティは 1 つ以上のノードの配列プロパティです。
すべてのツリー構造と同様に、ルート ノードが必要ですが、無限に深くすることができます。
let tree = { label: 'root', nodes: [ { label: 'item1', nodes: [ { label: 'item1.1' }, { label: 'item1.2', nodes: [ { label: 'item1.2.1' } ] } ] }, { label: 'item2' } ] }
再帰コンポーネント
TreeMenu というデータ構造を表示する再帰コンポーネントを作成しましょう。現在のノードのラベルのみを表示し、それ自体を呼び出して子ノードを表示します。ファイル名: TreeMenu.vue、内容は次のとおりです:
<template> <p class="tree-menu"> <p>{{ label }}</p> <tree-menu v-for="node in nodes" :nodes="node.nodes" :label="node.label" > </tree-menu> </p> </template> <script> export default { props: [ 'label', 'nodes' ], name: 'tree-menu' } </script>
コンポーネントを再帰的に使用する場合は、最初に Vue.component のグローバル定義を作成するか、それに name 属性を与える必要があります。そうしないと、子コンポーネントはそれ以上呼び出すことができなくなり、未定義の「未定義コンポーネント エラー」エラー メッセージが表示されます。
基本イベント
他の再帰関数と同様に、再帰を終了するには基本イベントが必要です。そうしないとレンダリングが無限に続き、最終的にはスタック オーバーフローが発生します。
ツリーメニューでは、子のないノードに到達したときに再帰を停止したいと考えています。これは v-if を介して実行できますが、 v-for を使用することを選択すると、暗黙的にそれが実装されます。ノード配列にそれ以上の定義がない場合は、ツリーメニュー コンポーネントが呼び出されます。 template.vue ファイルは次のとおりです:
<template> <p class="tree-menu"> ... <!--If `nodes` is undefined this will not render--> <tree-menu v-for="node in nodes"></tree-menu> </template>
Usage
このコンポーネントを今どのように使用しますか?まず、データ属性と定義されたツリーメニュー コンポーネントを含むデータ構造を持つ Vue インスタンスを宣言します。 app.js ファイルは次のようになります:
import TreeMenu from './TreeMenu.vue' let tree = { ... } new Vue({ el: '#app', data: { tree }, components: { TreeMenu } })
データ構造にはルート ノードがあることを思い出してください。メイン テンプレートから開始し、ルート ノード属性を小道具に使用して、TreeMenu コンポーネントを再帰的に呼び出します。
<p id="app"> <tree-menu :label="tree.label" :nodes="tree.nodes"></tree-menu> </p>
現在は次のようになります:
正しい姿勢
「深さ」を視覚的に識別するのは良いことです子コンポーネントの「」を使用して、ユーザーが UI からデータ構造を把握できるようにします。これを実現するには、各レベルで子ノードをインデントします。
これは、TreeMenu を通じて深度プロパティ定義を追加することで実現されます。この値を使用して、インライン スタイルを動的に変換にバインドします。各ノードのラベルに対して、transform:translate CSS ルールを使用して、インデントを作成します。 template.vue は次のように変更されます**:**
<template> <p class="tree-menu"> <p :style="indent">{{ label }}</p> <tree-menu v-for="node in nodes" :nodes="node.nodes" :label="node.label" :depth="depth + 1" > </tree-menu> </p> </template> <script> export default { props: [ 'label', 'nodes', 'depth' ], name: 'tree-menu', computed: { indent() { return { transform: `translate(${this.depth * 50}px)` } } } } </script>
Depth 属性は、メイン テンプレートでは 0 から始まります。上記のコンポーネント テンプレートでは、この値が子ノードに渡されるたびに増加することがわかります。
<p id="app"> <tree-menu :label="tree.label" :nodes="tree.nodes" :depth="0" ></tree-menu> </p>
注: 深度値を v-bind して、それが文字列ではなく JavaScript 数値型であることを確認してください。
展開/折りたたみ
再帰的なデータ構造は大きくなる可能性があるため、それらを表示するための UI の優れたトリックは、ユーザーが必要に応じてノードを展開または折りたたむことができるように、ルート ノードを除くすべてのノードを非表示にすることです。
これを行うには、ローカル属性 showChildren を追加します。値が False の場合、子ノードはレンダリングされません。この値はノードをクリックすることで切り替える必要があるため、クリック イベント リスナー メソッド toggleChildren を使用して管理する必要があります。 template.vue ファイルは次のように変更されます**:**
<template> <p class="tree-menu"> <p :style="indent" @click="toggleChildren">{{ label }}</p> <tree-menu v-if="showChildren" v-for="node in nodes" :nodes="node.nodes" :label="node.label" :depth="depth + 1" > </tree-menu> </p> </template> <script> export default { props: [ 'label', 'nodes', 'depth' ], data() { return { showChildren: false } }, name: 'tree-menu', computed: { indent() { return { transform: `translate(${this.depth * 50}px)` } } }, methods: { toggleChildren() { this.showChildren = !this.showChildren; } } } </script>
概要
このようにして、作業ツリー メニューが完成しました。最後の仕上げとして、プラス/マイナスのアイコンを追加して、UI をより見やすくすることができます。また、オリジナルの showChildren に優れたフォントとコンピューティング機能を追加しました。
上記は私が皆さんのためにまとめたもので、将来的に皆さんのお役に立てれば幸いです。
関連記事:
jQuery でマウス応答 Taobao アニメーション効果を実装する方法
jQuery で実装されたマウス応答バッファ アニメーション効果
vue2.0 応答性を実装する方法 (詳細なチュートリアル)
方法JSを通じてテキストの断続的なサイクルスクロール効果を実現します
Reactのrefsを詳しく説明します(詳細なチュートリアル)
以上がVue.js で再帰コンポーネントを使用してツリー メニューを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。