Vue のツリー表示については、プロジェクトが使用されています: エフェクト ダイアグラムがツリー形式で非同期に表示されます: element-ui、el-tree の公式ドキュメントを見つけました。 (アドレス:https://element.eleme.cn/#/zh-CN/component/tree) プロジェクト要件: 遅延読み込み形式で表示し、ディレクトリには新しい編集および削除操作があり、要件に応じて操作後にツリー構造を更新する必要があります。 それでは、始めましょう。 1つ、 遅延読み込み: Tree の遅延読み込みは、1 つの属性 lazy によって制御されます。 lazy を使用するには、ロードを使用してレンダリング ツリーのデータをロードする必要があります。この原則では、初期化によってロード関数がトリガーされ、最初に初期データがロードされ、ノードをクリックすると、ロード関数がトリガーされ、このノードの下の子ノードがロードされます。 二、 カスタムノード: ノードの後にアクションボタンを追加します 簡単な例については公式サイトに例があります ** 主にノードの更新について話す ** // refreshNode: 更新するノード; newNodeData: 新しい子ノードのデータ refreshNode.splice(0, refreshNode.length); ノードをリフレッシュします。doCreateChildren(新しいノードデータ)。 次のことを理解してください: menuNodeClick(データ、ノード、ツリーノード) { this.selectNodeData = データ this.selectNode = ノード } 2>. ノード操作後、ノードを更新します。さまざまなシナリオに応じて、現在のノード (node) を更新するか、現在のノードの親ノード (node.parent) を更新するかを選択できます。 /** * ノードデータを更新 * @node [node/Object]: ノードを更新、ノード以下のすべてのノードを更新 * @type [String]: ノードタイプ、「node」はノードがツリーのノード情報ノードであることを意味します。「data」はノードがツリーのノード情報のデータであることを意味します */ refreshTreeNode(ノード、タイプ) { ノードをリフレッシュします。 // 更新するノードの子ノードを取得します。if(type === 'node') { リフレッシュノード = ノード.childNodes }それ以外の場合(type === 'data') { getNode = this.$refs.tree.getNode(node) とします。 リフレッシュノード = getNode.childNodes } // 元の子ノードを削除します。refreshNode.splice(0, refreshNode.length); //データを再要求し、ノードを更新します。this.requestTreeNode(node) } 3.チェックボックスを選択します。 遅延読み込み中に選択ボックスがある場合は、選択ボックスを含むデータを読み込み、属性default-checked-keysを通じてチェックし、展開されたノードを default-expanded-keys を通じて設定する必要があります。 4. 単一選択: // 現在のノードを選択してこれを設定します。$refs.tree.setCurrentKey( this.selectNodeData[this.nodeKey] ) 単一選択、複数選択に関わらず、初めてロードされるとき、背景は選択された情報だけでなく、選択されたノードが配置されているブランチのすべてのノード情報を提供し、ノードが配置されているブランチを上から選択項目まで展開できるように default-expanded-keys に割り当てる必要があります。しかし、多くの場合、バックエンドは選択された値に関する情報のみを提供するため、フロントエンドはデータ自体をカプセル化し、展開する必要があるブランチ情報を取得する必要があります。データ形式に応じて異なる方法が使用されます
このデータ形式は、[1 つのレイヤーをクリックして、1 つのレイヤーをロードする] と [1 つのレイヤーをクリックして、クリックしたレイヤーの子ノードの複数のレイヤーをロードする] の両方の状況を満たすことができます。最初のケースではデータ処理は必要ありません。2 番目のケースでは、親ノードと子ノードを関連付けるために各データにフィールドを挿入する必要があり、その後、データは el-tree で必要な形式にカプセル化され、再帰関数を使用してデータが統合されます (関連付けられたフィールドが parentId、nodeKey が id、ツリーの子ノード フィールドが children、id が 'N' の子ノードの複数のレイヤーをロードする必要があると仮定) (注: 再帰関数はパフォーマンスに影響を与えるため、注意して使用してください) 2). 多層データ(子ノードの属性名が children であると仮定) [ { ...、 子供たち: [ { ...、 子供たち: [ { ...、 子供たち: [...]、 }, { ...、 子供たち: [...]、 } ] }, { ...、 子供たち: [ { ...、 子供たち: [...]、 } ] } ] } ] この形式のデータは、単層と多層の両方のシナリオで使用でき、処理は必要ありません。 遅延読み込みの例: <el-tree :data="ツリーデータ" :props="デフォルトプロパティ" :load="ノードツリーをロード" @node-click="ハンドルNodeClick" 怠け者 :クリック時にノードを展開="false" :default-expanded-keys="['1']" ノードキー="id" :ハイライト現在の値="true" > <span class="custom-tree-node" slot-scope="{ ノード、データ }"> <span class="treeLeft">{{ node.label }}</span> <span class="treeRight"> <i v-if="node.level === 1" @click="() => appendNode(ノード、データ)" クラス="el-icon-plus" スタイル="色: 青" </i> <!--グループを追加--> <!-- ルートノードは削除したり名前を変更したりする必要はありません--> <i v-if="data.id !== 0" @click="() => deleteNode(ノード、データ)" クラス="el-icon-delete" スタイル="色: 赤" </i> <!--グループを削除--> <i v-if="data.id !== 0" @click="() => editNode(ノード、データ)" クラス="el-icon-edit" スタイル="色: 青" </i> <!--グループ名を変更--> </span> </span> </el-tree> ビュー: // ツリーメニュー treeData: [], // ツリーノード defaultProps: { // el-tree のデフォルトデータ配列パラメータを変更します children: 'children', ラベル: '名前', id: 'id', 親ID: '親ID', isLeaf: 'leaf' // ノードがリーフノードであるかどうかを指定します。これは、lazy 属性が指定されている場合にのみ有効です}, 方法: // ツリーデータをロードする loadNodeTree(node, resolve) { const that = this ノードレベル === 0 の場合 { that.loadtreeData(ノード、解決) } それ以外の場合 (node.level === 1) { that.getChildByList(ノード、解決) } }, // get loadtreeData は親ノードデータ、getChildByList は子ノードデータを非同期的に取得します loadtreeData(nodeData, resolve) { 定数データ型 = { ページインデックス: 1, ページサイズ: 100000 } getAlltype(データ型) .then(res => { 定数ルートChildren = [] (res.code === 200)の場合{ 定数データ = res.data.list データ.map(アイテム => { ルートチャイルド.push({ 名前: アイテム.typeName、 親ID: ''、 id: アイテム.id、 葉: 偽、 子供たち: [] }) }) //resolve にコンテンツがある場合は遅延ロードされてクエリされ、そうでない場合は変更されます if (resolve) { 解決(ルートの子供) } それ以外 { ノードデータ.childNodes = [] nodeData.doCreateChildren(ルートChildren) } } それ以外 { 解決する([]) } }) }, // 子ノードの取得リクエスト getChildByList(nodeData, resolve) { var _parentID = ノードデータ.data.id 定数型仕様 = { タイプID: _親ID、 ページインデックス: 1, ページサイズ: 100000 } getAlltypeSpec(typeSpec).then(res => { 定数ルートChildren = [] (res.code === 200)の場合{ 定数データ = res.data.list データ.map(アイテム => { ルートチャイルド.push({ 名前: アイテム.説明、 親ID: アイテムタイプID、 id: アイテム.id、 葉: 真、 子供たち: [] }) }) if (解決) { 解決(ルートの子供) } それ以外 { ノードデータ.childNodes = [] nodeData.doCreateChildren(ルートChildren) } } それ以外 { 偽を返す } }).catch(エラー => { コンソール.log(エラー) }) }, // ノードクリックイベント handleNodeClick(data, node) { this.addnode = ノード this.adddata = データ ノードレベル === 1 の場合 { this.queryForm.typeId = ノードデータID this.queryForm.typeSpecId = '' } それ以外の場合 (node.level === 2) { this.queryForm.typeId = node.data.parentId this.queryForm.typeSpecId = ノードデータID } this.クエリ() }, ノード操作: ノードの追加、ノードの変更、ノードの削除 (自分のノードを操作して親ノード情報を渡して現在のノードを見つけ、子ノードを操作して現在のノードを渡します。結論: 親ノードが子ノードを操作します) // ツリーノードに型指定を追加 appendNode(node, data) { this.addTypesSpec = { タイプ名: ノード.データ.名前、 タイプID: ノードデータID } this.createTypesSpecDialog = true }, // ツリータイプの変更 editNode(node, data) { 定数 typeId = node.data.parentId // レベル1型 if (node.level === 1) { this.editTypesDialog = true this.editTypes = { id: ノード.データ.id、 タイプ名: ノード.データ.名前 } } それ以外 { this.editTypesSpecDialog = true this.getSelectTypes() // this.editTypesSpec = Object.assign({}, node.data) this.editTypesSpec = { タイプID: タイプID、 id: ノード.データ.id、 説明: node.data.name } } }, // ツリー型の削除 deleteNode(node, data) { // レベル1型 if (node.level === 1) { this.$msgbox.confirm('この操作によりアセットタイプデータが削除されます。続行しますか?', 'プロンプトの削除', { confirmButtonText: '確認'、 cancelButtonText: 'キャンセル'、 タイプ: '警告' }).then(() => { typeDel(ノードデータID)。次に( 応答 => { this.$message('正常に削除されました') this.クエリ() this.loadNodeTree(ノード.parent) }, エラー => { コンソールログ('エラー', エラー) } ) }).catch(() => { this.$message.error('キャンセルされました') }) } それ以外 { this.$msgbox.confirm('この操作により、資産タイプ仕様データが削除されます。続行しますか?', '削除プロンプト', { confirmButtonText: '確認'、 cancelButtonText: 'キャンセル'、 タイプ: '警告' }).then(() => { typeSpecDel(node.data.id).then( 応答 => { this.loadNodeTree(ノード.parent) this.$message('正常に削除されました') this.クエリ() }, エラー => { コンソールログ('エラー', エラー) } ) }).catch(() => { this.$message.error('キャンセルされました') }) } }, ノードがトリガーされると、ポップアップ ボックスが表示されます。通常のポップアップ ボックスは、追加、変更、または削除されます。ただし、バックグラウンド リクエストを送信して正常な操作を返した後、ツリー構造を再度読み込む必要があります。そのため、ここでツリーの読み込みメソッドを再度呼び出します。渡されたノードは、ツリーがトリガーされてクリックされたときに保存できます。私のメソッドは handleNodeClick です。このメソッドは、クリックされたノードが変更、追加、または削除されたかどうかに関係なく、そのノードを保存します。 this.$message('編集に成功しました') this.loadNodeTree(this.addnode.parent) 1. 拡張と縮小を設定する ノードが展開されている場合 ノードを展開します。 }それ以外 { ノードを折りたたむ(); } 2. 親ノードを取得する ノード.親 理解できるなら読んでください。コードは最適化できますが、最近はあまり時間がありません。理解できなくても、このロジックが理解できれば大丈夫です。また次回 これで、追加、削除、変更、クエリに el-tree 遅延読み込みを使用する Vue に関するこの記事は終了です。Vue el-tree 遅延読み込みに関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: VMware仮想マシンを使用してUbuntu 20.04をインストールする完全なチュートリアル
1. mysqldump の使用時にエラー (1064) が報告されます。これは、mysqldump...
この記事では、ブロック崩しピンボールゲームを実装するためのJSの具体的なコードを参考までに紹介します...
最初はブラウザのスクロールバーのスタイルを変更して効果を実現したいと思っていましたが、情報を調べてみ...
今日ログインページを書いていたとき、個人情報と携帯電話番号を認証する必要がありましたが、ページにボタ...
操作効果: html <div class="三目並べ"> <...
dockerの登場により、多くのサービスが徐々にハードウェアアーキテクチャへの依存から脱却しました。...
<br />テーブルは、昔から誰もが使ってきたタグで、今も使われています。しかし、現在の...
jsvc の紹介実稼働環境では、Tomcat はデーモン モードで実行する必要があります。Tomc...
問題の説明 (環境: windows7、MySql8.0)今日、MySql をインストールした後、M...
mysql countの詳細な説明count関数はテーブルや配列内のレコードを数えるために使われます...
目次要約する要約する配列が変更されると、対応するデータを動的にロードしますシナリオ: 異なるコンポー...
1. プロジェクト文書 2. ページレイアウトにHTMLとCSSを使用するHTML部分 <di...
序文Web アプリケーションでは、トラフィックを節約し、転送データのサイズを縮小し、転送効率を向上さ...
目次1. 一括更新の方法コンソール出力2. フックがルーティングパラメータを取得する方法実行効果1....
この記事では、Excelテーブルプラグインを導入するVueの具体的なコードを参考までに共有します。具...