Vueシャトルボックスは上下の動きを実現します

Vueシャトルボックスは上下の動きを実現します

この記事の例では、vueシャトルボックスを上下に動かすための具体的なコードを参考までに共有しています。具体的な内容は次のとおりです。

elementUIのツリーコンポーネントを使用する

機能要件:

1. 左側の子ノードを右側のテーブルに移動する
2. 右側で選択したコンテンツを左側のツリーに移動します。単一移動と全移動
3. 右側のノードをクリックして上下に移動します

最初に遭遇する問題は、左側の子ノードだけにチェックボックスを表示する方法です。バックエンドから返されるパラメータを使用して、それが親ノードであるかどうかを判断します (実際には、バックエンドが親ノードに nocheck=true を追加する限り、問題ありません)。

// setLeftAgency: カプセル化されたリクエストインターフェース名 setLeftAgency(params).then((res) => { // 返されたコードが 0 の場合、成功を意味します if (res.data.code == 0) {
 データ = res.data とします。
 data.forEach((item) => { //返されたデータを走査します。このパラメータがItemの場合、チェックボックスが表示されないように現在のデータにnocheck=trueを追加します。
 if(item.Type!=='アイテム'){
  アイテム.nocheck=true
 }
 // item.children を削除します。
 });
 this.parentNodes = data; // 変更されたデータを配列に入れて再度レンダリングします}

左側にツリー構造、中央にボタン、右側にテーブル(左側のツリー構造とテーブルはカプセル化され、直接インポートされます)

<div class="leftTree"> // ここでの onCreated バインドは左ツリーの初期化関数であり、parentNodes は左ツリーのすべてのデータを格納します<ztree :setting="setting" @onCreated = 'onCreated' :parentNodes="parentNodes"></ztree>
</div>
<div class="centerBtn">
 <el-button type="danger" plain icon="el-icon-arrow-right" @click="moveTable"></el-button>
 <el-button type="danger" plain icon="el-icon-d-arrow-left" @click="moveTreeAll"></el-button>
 <el-button type="danger" plain icon="el-icon-arrow-left" @click="moveTree"></el-button>
 <el-button type="danger" plain @click="moveUp(index)">上に移動</el-button>
 <el-button type="danger" plain @click="moveDown(index)">下へ移動</el-button>
</div>

<div class="rightTable">
 <table :data.sync="tableData" // テーブル インターフェースによって返されるデータ ref="personListSettingPage"
  :loading='vxeLoading'
  v-model="selectGroups" // 右側のテーブルで選択された項目の配列をバインドします id="personListSettingPage"
  :showPagination= 'false'
  :height-full-screen = 'false'
  @sort-change="sortChange"
  @checkbox-change="selectChange" // 右側の選択項目の単一選択イベント @checkbox-all="selectAll" // 右側の選択項目の全選択イベント @data-refresh="getTableData()"> // 右側のテーブルデータを取得する関数 <vxe-table-column type="checkbox" width="60" align="center"></vxe-table-column>
  <table-column field="text" show-overflow="title" title="選択された指標" filterType='' >
  </テーブル列>
 </テーブル>
 </div>

使用されるパラメータ

moveDownId:"", // 下に移動するときに保存されるデータmoveUpId:"", // 上に移動するときに右側のテーブルに保存されるデータselectGroups:[], // 右側の選択されたデータを保存するために使用されますtableData:[], // リクエストが返された後、左側のすべてのデータがこの配列に保存されますparentNodes:[], // 左側のツリーのすべてのデータtreeObj:"",

左のツリーの初期化と右のテーブルのチェックボックスの選択

// ztree を初期化する
 ツリーオブジェクトの作成時
 this.treeObj = ツリーObj
 ノードを this.treeObj.getCheckedNodes(true); とします。 
},
 //チェックボックスイベント selectChange({checked, records}) {
 this.selectGroups = records // 選択したデータを配列に保存します},
 //チェックボックスすべて選択イベント selectAll({checked, records}) {
 this.selectGroups = レコード
 },

上へ移動

上へ移動(インデックス){
 if(this.selectGroups.length>0){ // 右側に選択された項目があるかどうかを確認します。goOrnot = true
 this.selectGroups.find((seItem)=>{ //右側のタブで選択された項目を走査し、対応する ID を見つけます
  if(seItem.id==this.moveUpId.id){
  this.$message.warning(this.moveUpId.t​​ext+"この行を上に移動する余地がありません")
  goOrnot = 偽
  }
 })
 if(行くか行かないか){
  this.tableData.forEach((item,index)=>{ // 右側のテーブル内のすべてのデータを走査し、
  this.$set(item,'rowIndex',index) //JavaScript の制限により、vue.js はオブジェクト プロパティの追加と削除を監視できないため、ビューが更新されるように $set または Object.assign(target, source) を使用する必要があります。})
  フラグを true にする
  this.selectGroups.forEach((val,index2)=>{
  this.tableData.find((itm,ind)=>{
   if(val.id==itm.id){
   if(itm.rowIndex==0){ // 右側の選択されたデータを走査し、すべてのデータと比較します。ID が同じ場合は、追加した rowIndex 属性の値を決定します。$message.warning(itm.text+"この行を上に移動する余地はありません")
    this.moveUpId = itm // 現在のデータを保存する flag = false
    戻る
   }それ以外{
    if(flag){ // 複数のデータ項目を移動できるようになりました let changeItem = JSON.parse(JSON.stringify(this.tableData[itm.rowIndex-1]))
    this.tableData.splice(itm.rowIndex-1,1);
    this.tableData.splice(itm.rowIndex,0,changeItem)
    }
   }
   }
  })
  })
 }
 }それ以外{
 this.$message.warning('移動するデータを選択してください')
 }
},

下に移動

下へ移動(インデックス){
 if(this.selectGroups.length>0){
 手放すOrnot = true
 this.selectGroups.find((seItem)=>{
  if(seItem.id==this.moveDownId.id){
  this.$message.warning(this.moveDownId.text+"この行を下に移動できる余地はありません")
  goOrnot = 偽
  }それ以外{
  this.moveFlag = true
  }
 })
 if(行くか行かないか){
  this.tableData.forEach((item,index)=>{
  this.$set(item,'rowIndex',index)
  })
  selectData = JSON.parse(JSON.stringify(this.tableData)) とします。
  a = [...this.selectGroups] とします
  a.reverse().forEach((val,index2)=>{
  selectData.find((itm,ind)=>{
   if(val.id==itm.id){
   itm.rowIndex==selectData.length-1の場合{
    this.$message.warning(itm.text+"この行を下に移動できる余地はありません")
    this.moveDownId = itm
    this.moveFlag = false
   }それ以外{
    if(this.moveFlag){
    changeItem = itm とします
    delIndex=selectData.findIndex(i=>i.id == changeItem.id) とします。
    this.tableData.splice(delIndex,1);
    this.tableData.splice(インデックス削除+1,0,項目変更)
    this.$refs.personListSettingPage.$refs.Table.setCheckboxRow(this.tableData[itm.rowIndex+1],true) // 右側のテーブルに ref=personListSettingPage を追加します
    }
   }
   }
  })
  })
 }
 }それ以外{
 this.$message.warning('移動するデータを選択してください')
 }
}

テーブルをツリーに移動する

/* ツリーに移動する */
ツリーを移動します(){
 if(this.selectGroups.length>0){
 this.selectGroups.forEach(item=>{
  this.parentNodes.find(val=>{
  if(val.id == item.pid){
   /* ノードを追加 */
   ノードを this.treeObj.getNodeByParam("id", val.id, null); にします。
   this.treeObj.addNodes(ノード、アイテム)
   /* 新しく追加されたノードの選択状態を解除します*/
   cancelNode を this.treeObj.getNodeByParam("id", item.id, null);
   this.treeObj.checkNode(cancelNode,false,true);
  }
  })
  this.tableData.splice(this.tableData.findIndex(val => val.id === item.id), 1)
 })
 }それ以外{
 this.$message.warning('移動するデータを選択してください')
 }
},

ツリーをテーブルに移動する

/* テーブルに移動 */
テーブルを移動します(){
 arr = [] とします
 ノードを this.treeObj.getCheckedNodes(true); とします。
 ノードの長さが0以上の場合
 ノード.forEach(item=>{
  this.tableData.find(val=>{
  arr.push(val.id)
  })
  if(arr.indexOf(item.id)>-1) return this.$message.error("データが重複しています。再度追加しないでください")
  this.treeObj.removeNode(アイテム)
  this.tableData.push(this.filterObj(item,["checked","codeSetId",'id','img','infoItemFlag','isMult','itemType','locked','mult','orgCode','pid','sort','syrs','text'])) // 冗長なフィールドを削除するには、次のメソッドを呼び出します})
 }それ以外{
 this.$message.warning('データを確認してください')
 }
},

カプセル化されたフィルターフィールド

/* オブジェクトの冗長フィールドをフィルターする*/
フィルターオブジェクト(obj, arr) {
 定数結果 = {}
 Object.keys(obj).filter((key) => arr.includes(key)).forEach((key) => {
 結果[キー] = オブジェクト[キー]
 })
 結果を返す
}

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • vue3+typeScriptシャトルボックスの実装例
  • VUE Element-uiのシャトルフレームの使い方を詳しく解説
  • Vueはシャトルボックス効果を実現します
  • Vue はオンデマンドでシャトルフレームを転送する要素を導入しました
  • シャトルボックス機能を実装するためのVueの詳細なコード

<<:  Windows 10 64 ビット版に MySQL 5.6.35 をインストールするためのグラフィック チュートリアル

>>:  Linux で top コマンドを使用する際のヒント

推薦する

React 非親子コンポーネントパラメータ渡しのサンプルコード

React は、ユーザー インターフェイスを構築するための JavaScript ライブラリです。 ...

「@INC で ExtUtils/MakeMaker.pm が見つかりません」というエラーを解決する

mha4mysql をインストールする場合の手順は、おおよそ次のようになります: unzip、per...

ユーザーエクスペリエンスの76の経験ポイントの要約

ウェブサイト体験の分類1. 感覚体験:快適性を重視した視聴覚体験をユーザーに提供します。 2. イン...

ウェブページのカラーマッチングスキルについての簡単な説明(フロントエンド開発者必読)

一般的に、Web ページの背景色は、より柔らかく、よりシンプルで、より明るく、暗いテキストとマッチし...

JavaScript で文字列内の最長の単語を見つける 3 つの方法 (推奨)

この記事は、Free Code Camp の基本アルゴリズム スクリプト「文字列内の最長の単語を見つ...

MySQL での正規表現置換のための replace と regexp の使用法の分析

この記事では、例を使用して、replace と regexp を使用して MySQL で正規表現を置...

HTML のスクロールバーについて/スクロールバーの削除

1. xhtmlの下のスクロールバーの色元の HTML では、ページ全体のスクロール バーを次のよう...

Centos7 で crontab + シェル スクリプトによる定期的な自動ファイル削除の問題を解決する

問題の説明:最近、rsyncで毎回同期するデータ量が多いが、データベースのbakファイルを保持する必...

jsオブジェクト指向カプセル化カスケードドロップダウンメニューリストの実装手順

この例で開発されたカスケード ドロップダウン メニューは、既存の JSON データに基づいて作成され...

vue プロジェクトのデプロイと Nginx でのプロキシ設定の問題の分析

1. nginxをインストールして起動する # nginxをインストールする sudo apt-ge...

MySQLの大規模テーブル最適化ソリューションについての簡単な説明

背景Alibaba Cloud RDS for MySQL(MySQL バージョン 5.7)データベ...

Node.JS で悪天候のリアルタイム警報システムを構築する

目次序文:ステップ1: 無料の天気予報インターフェースを見つけるステップ2: 天気予報インターフェー...

MySQL タイムブラインドインジェクションの 5 つの遅延方法

MySQL タイム ブラインド インジェクションの 5 つの遅延方法 (PWNHUB の予期しない解...

mysql の存在する例と存在しない例の詳細な説明

mysql の存在する例と存在しない例の詳細な説明テーブルA |列1 | 列1 | 列3 |テーブル...

MySQL テーブル名の大文字と小文字の選択

目次1. 大文字と小文字の区別を決定するパラメータ2. パラメータ変更に関する注意事項要約: 1. ...