Antdesign-vueとsortablejsを組み合わせて、2つのテーブルをドラッグして並べ替える機能を実現

Antdesign-vueとsortablejsを組み合わせて、2つのテーブルをドラッグして並べ替える機能を実現

成果を達成する

最初は、antdesign をベースにしたものがあるかどうかをオンラインで調べようと思ったのですが、本当にほとんどないことがわかりました。では、早速写真をご覧ください。

ここに画像の説明を挿入

sortablejs の紹介

まず、このプラグインについて知っておきましょう: sortablejs
API ドキュメントを注意深く読んでみてください:

ここに画像の説明を挿入

ここでは私が使用した API に焦点を当てます。
1. groupオブジェクトを渡すことができます。パラメータ値はnamepullputです。
name : 2 つのリスト間でドラッグする場合、name の値は同じである必要があります。
pull : pull は、このリスト コンテナーから移動する設定を定義するために使用されます (true/false/'clone'/function)

  • true: リスト コンテナー内のリスト セルを移動できます。
  • false: リスト コンテナー内のリスト ユニットは移動できません。
  • clone: リスト単位が移動され、移動された要素は要素のコピーになります。
  • function: プルするかどうかの判断に使用する関数。複雑なロジックを実行し、関数内で false/true を返すことで、削除するかどうかを判断できます。

put : put は、リスト コンテナーにリスト セルを配置するための設定を定義するために使用されます (true/false/['foo','bar']/function)。

  • true: リスト コンテナーはリスト セルを他のリスト コンテナーに配置できます。
  • false: true の反対。
  • ['foo','bar']: これは、グループ構成項目で定義された名前の値を表す文字列または文字列の配列です。
  • 関数: put 関数を判断するために使用されます。複雑なロジックを実行し、関数内で false/true を返して、put するかどうかを判断できます。

2. animation ms、数値 単位: ms、ソートアニメーションの時間を定義します。
3. handle : シンプルな CSS セレクター形式の文字列。セレクターに一致するリスト ユニット内の要素がドラッグ ハンドルになります。リスト ユニットは、ドラッグ ハンドルを押すことによってのみドラッグできます (ドラッグする要素のクラスをバインドします)。
4. ドラッグを開始するためのonStart:function(evt){}コールバック メソッド。
5. リスト内の要素を順番に更新するためのonUpdate:function(evt){}コールバック メソッド。
6. onAdd:function(evt){}あるリストから別のリストに要素をドラッグするためのコールバック メソッド。
7. onRemove:function(evt){}リストから要素を削除し、別のリストに入るためのコールバック メソッド。
この要件ではこれらを使用しますAPI だけで十分です。

具体的な実装

1. 最初のステップは、 sortableメソッドを初期化することです。2 つのテーブルをドラッグする必要があるため、2 つのメソッドを初期化します。
HTMLコード

<s-テーブル
 ref="テーブル"
 サイズ="デフォルト"
 クラス="左テーブル"
 rowKey="キー"
 :columns="列"
 :data="データをロード">
</s-テーブル>
  
<s-テーブル
 クラス="ソートテーブル"
 ref="テーブル2"
 サイズ="デフォルト"
 クラス="左テーブル"
 rowKey="キー"
 :columns="列"
 :data="データをロード">
</s-テーブル>

特定の列とloadData については詳しく説明する必要はありません。

JSコード

'sortablejs' から Sortable をインポートします。
方法:{
 // ドラッグを実装するためにソート可能を初期化する initSortable () {
 var that = これ
 var el = this.$el.querySelector('.sort-table tbody')
 ソート可能.create(el, {
 ハンドル: '.ant-table-row',
 アニメーション: 150,
 グループ: { 名前: 'name'、プル: true、プット: true }、
 onUpdate: 関数 (evt) {
 
 },
 // ドラッグ開始時 onStart: function (evt) {
  
 },
 onAdd: 関数 (イベント) {
  
 },
 onRemove: 関数 (evt) {
 
 }
 })
 },
 ソート可能な初期化1(){
 var that = これ
 var el = this.$el.querySelector('.left-table tbody')
 ソート可能.create(el, {
 ハンドル: '.ant-table-row',
 アニメーション: 150,
 グループ: { 名前: 'name'、プル: true、プット: true }、
 onUpdate: 関数 (evt) {
 
 },
 // ドラッグ開始時 onStart: function (evt) {
  
 },
 onAdd: 関数 (イベント) {
  
 },
 onRemove: 関数 (evt) {
 
 }
 })
 },
 }

handleについてクラス、 antdesignテーブルの各行をドラッグしたいので、各行を選択する必要がありますクラス。

ここに画像の説明を挿入

今のところ2テーブル間でドラッグ効果を実現できますが、それはドラッグ効果のみです。
ドラッグ後、両側のデータ ソースは変更されず、ドラッグ後でも反対側のテーブルの表示ページにエラーが表示されます。

ここに画像の説明を挿入

右側のテーブルではソートが固有ですが、このテーブルではこのソートは必要ありません。ドラッグが成功したのに、なぜまだデータがないと表示されるのでしょうか。最後に、左側のヘッダーのCheckBoxは選択できません。今のところ、ドラッグ効果しかありません。
2. ドラッグ操作の後、左側と右側のデータ ソースを再割り当てします。これを実装するには 2 つの方法があります。

  • ドラッグするたびにバックエンド データが要求され、新しいデータ ソースを取得した後、データがテーブルに再割り当てされます。
  • フロントエンドはデータソース自体を処理し、すべてのドラッグが完了した後にそれを整理し、バックエンドに保存します。

パフォーマンスの消費を考慮して、2 番目を選択しました。
1) 左側と右側のデータソース配列を定義する

データ(){
 戻る {
 unMatchedList: [], // 左側の一致しないデータ dataList: [], // 右側の一致するデータ pullIndex: '', // 元の配列ドラッグ要素のインデックス}
}

2) removeまたはaddたびにデータ ソースを更新します。ここでは、テーブル ドラッグ メソッドのみを記述します。他のメソッドでは、 that.dataListthat.unMatchedList重複するコードは貼り付けません。

 // ドラッグ開始時 onStart: function (evt) {
  that.pullIndex = evt.oldIndex
 },
 onAdd: 関数 (イベント) {
 //evt.newIndex は新しい配列のインデックスに移動します //pullIndex は元の配列内のドラッグされた要素のインデックスです that.dataList.splice(evt.newIndex, 0, that.unMatchedList[that.pullIndex])
  that.dataList.forEach((item, index) => {
  アイテム.ソート = インデックス + 1
  })
  //テーブルビューに更新を通知します。$nextTick(() => {
  that.$refs.table2 && this.$refs.table2.refresh(true)
 		 that.$refs.table && this.$refs.table.refresh(true)
  })
 },
 onRemove: 関数 (evt) {
  that.dataList.splice(evt.oldIndex, 1)
  that.dataList.forEach((item, index) => {
  アイテム.ソート = インデックス + 1
  })
  $nextTick(() => {
  that.$refs.table2 && this.$refs.table2.refresh(true)
 		that.$refs.table && this.$refs.table.refresh(true)
  })
 }
 })

3) 同じテーブル内でドラッグアンドドロップによる並べ替えを実装する

ソート可能な初期化(){
 var that = これ
 var el = this.$el.querySelector('.sort-table tbody')
 ソート可能.create(el, {
 ハンドル: '.ant-table-row',
 アニメーション: 150,
 グループ: { 名前: 'name'、プル: true、プット: true }、
 //ここではonEndメソッドを使用しないでください onUpdate: function (evt) {
  var o = evt.oldIndex
  var n = evt.newIndex
  (o === n)の場合{
  戻る
  }
  that.sortListAndUpdate(that.dataList, o, n)
 },
 })
 },
 // o (oldIndex) と n (newIndex) が 0 から始まるようにデータをソートします sortList (list, o, n) {
 var newTableData = JSON.parse(JSON.stringify(リスト))
 var データ = newTableData.splice(o, 1, null)
 newTableData.splice(o < n ? n + 1 : n, 0, data[0])
 newTableData.splice(o > n ? o + 1 : o, 1)
 新しいテーブルデータを返す
 },
 /**
 * データをソートしてテーブルを更新します。o (oldIndex) と n (newIndex) は 0 から始まる必要があります*/
 ソートリストと更新 (リスト, o, n) {
 var newTableData = this.sortList(リスト、o、n)
 newTableData.forEach((アイテム、インデックス) => {
 アイテム.ソート = インデックス + 1
 })
 this.$nextTick(() => {
 this.dataList = 新しいテーブルデータ
 that.$refs.table2 && this.$refs.table2.refresh(true)
 })
 },

ここでは、ドラッグ効果がある限りonEndメソッドがトリガーされ、左右にドラッグした後に別のソートが行われるため、 onEndメソッドではなくonUpdateメソッドを使用してソートします。

これで、antdesign-vue と sortablejs を組み合わせて、2 つのテーブルをドラッグして並べ替える機能を実現する方法についての説明は終わりです。antdesign-vue でドラッグ アンド ソートを実現する方法についての関連コンテンツをさらにご覧になりたい場合は、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • vue は sortable を使用して el-table のドラッグ アンド ドロップによるソート機能を実装します。
  • Vueはリストのドラッグとソートの機能を実装します
  • Vueはvuedraggableに基づいて選択、ドラッグ、ソート効果を実装します
  • vue ドラッグ コンポーネント vuedraggable API オプションは、ボックス間の相互ドラッグと並べ替えを実現します。
  • Vue をベースにスムーズな遷移のドラッグ アンド ドロップ ソート機能を実装する
  • Vue ドラッグ可能なコンポーネントを使用して、Vue プロジェクトでテーブル コンテンツのドラッグ アンド ドロップによる並べ替えを実装します。
  • vue.draggableはテーブルのドラッグアンドドロップソート効果を実現します
  • vuedraggable+element uiは、ページコントロールのドラッグアンドドロップソート効果を実現します。
  • Vueのドラッグアンドドロップソートプラグインvuedraggableの使い方を詳しく説明します
  • Vueはvuedraggableを使用して、ネストされたマルチレイヤーのドラッグアンドドロップソート機能を実装します。

>>:  JSで実現したページサイドバーの効果に関する研究

推薦する

Vue は PC カメラを呼び出してリアルタイムで写真を撮る機能を実装します

VueはPCカメラを呼び出してリアルタイムで写真を撮影します。参考までに、具体的な内容は次のとおりで...

Linux Cron によるパラメータ付き PHP コードのスケジュール実行

1. 引き続き PHP スクリプトを使用して実行します。コマンドラインに入力: php /home/...

HTML メタビューポート属性の説明

ビューポートとはモバイル ブラウザは、Web ページを仮想の「ウィンドウ」(ビューポート) に配置し...

ZabbixはPSK共有キーを使用してサーバーとエージェント間の通信を暗号化します。

Zabbix バージョン 3.0 以降、Zabbix サーバー、Zabbix プロキシ、Zabbi...

CSS を使用して 3 列のアダプティブ レイアウト (両側は固定幅、中央はアダプティブ) を実現します。

いわゆる 3 列適応レイアウトとは、両側の幅が固定され、中央のブロックの幅が適応されることを意味しま...

CD コマンドを使わずに Linux でディレクトリ/フォルダに入る方法

ご存知のとおり、cd コマンドがないと、Linux でディレクトリを切り替えることはできません。それ...

docker runコンテナの自動終了の解決策

今日、Dockerfile を使用してイメージを作成したときに問題が発生し、イメージの実行後にコンテ...

突然外部ネットワークからDockerにアクセスできなくなる問題の解決方法

マスターのメソッドによると、原因は sysctl net.ipv4.ip_forward であること...

React+Typescriptはカウントダウンフックメソッドを実装します

まず、setIntervalはフックとしてカプセル化されます👇 'react' から...

CentOS7.4 起動時の緊急モードへようこそメッセージに対する解決策

今日は仮想マシンを使って実験をしました。システムをインストールし、いくつかのオプションを最適化した後...

MySQLの行ロックとテーブルロックの意味と違いの詳細な説明

1. はじめに行ロックとテーブルロックの違いは面接で頻繁に出てくるはずです。MySQL のロックにつ...

MySQL 5.7 および MySQL 8.0 でルートパスワードを変更する方法の概要

MySQL 5.7 バージョン:方法1: SET PASSWORDコマンドを使用するフォーマット: ...

EXPLAIN コマンドの詳細な説明と MySQL での使用方法

1. シナリオの説明: 同僚から MySQL で explain を使用する方法を教わったので、返さ...

Linux の chown コマンドと chmod コマンドの違いの詳細な説明

Linux システムでは、chmod コマンドと chown コマンドの両方を使用して権限を設定でき...

MySql はデータを正常に挿入しますが、[Err] 1055 エラーが報告されます。解決策

1. 質問:最近、挿入操作を行っています。MySQLのバージョンは5.7です。挿入は成功しますが、エ...