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 コマンドを使用する際のヒント

推薦する

ページ要素の絶対位置と相対位置に関するある程度の理解

今日から、定期的にちょっとした豆知識を整理していきます。簡単なものもあるかもしれませんが、どれも役に...

Vue.jsの機能コンポーネントに関する包括的な理解

目次序文React 関数コンポーネントVue (2.x) の機能コンポーネント🌰 例: el-tab...

Linux での GDB 入門チュートリアル

序文gdb は Linux で非常に便利なデバッグ ツールです。コマンドライン モードのデバッグ ツ...

Centos7.3 で mysql5.7.18 をインストールして初期パスワードを変更する方法

この記事では、Centos7.3でのmysql5.7.18のインストールと初期パスワードの変更につい...

MySQL 外部キー制約の一般的な操作の例 [表示、追加、変更、削除]

この記事では、例を使用して、MySQL 外部キー制約の一般的な操作について説明します。ご参考までに、...

VMware 仮想マシンでの Centos8 ブリッジの静的 IP 設定方法

1. ネットワーク接続方法がブリッジされていることを確認する物理ネットワーク接続ステータスのコピーを...

docker-compose が遅すぎる場合の解決策の詳細な説明

解決策はただ一つ、ソースを変更することです。 github からのソースは基本的にタイムアウトするの...

Node.js パッケージ マネージャー npm の具体的な使用方法

目次目的npm init および package.json ファイルモジュールのインストールと管理モ...

Vue3 でサードパーティのコンポーネントライブラリをオンデマンドでロードする方法

序文Element Plus を例に、コンポーネントとスタイルのオンデマンド読み込みを構成します。環...

Vue+SpringBoot+Shiroのクロスドメイン問題を解決する

目次1. Vueフロントエンドを構成する1. クロスドメイン構成を開発する2. 本番環境のクロスドメ...

uniappは録音アップロード機能を実現

目次uni-app の紹介HTML部分js部分インスタンスを作成する録音を開始録音終了録音を再生再生...

Windows での MySQL 8.X インストール チュートリアル

以前は MySQL 5.7 を使用していましたが、MySQL にいくつか新しい機能が追加されたため、...

mysql 一時テーブルの使用状況の分析 [クエリ結果は一時テーブルに保存できます]

この記事では、例を使用して MySQL 一時テーブルの使用方法を説明します。ご参考までに、詳細は以下...

ApacheのDjangoオンライン展開方法

環境: 1. Windows Server 2016 Datacenter 64 ビット 2. SQ...

Vue Element フロントエンドアプリケーション開発の動的メニューとルーティングの関連付け処理

目次概要1. メニューとルーティング処理2. メニューとルートリスト3. ログインプロセスの処理概要...