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で実現したページサイドバーの効果に関する研究

推薦する

ウェブページで Enter キーを押すと自動的にフォームを送信し、他のページにジャンプするソリューション

ウェブページでEnterキーを押すと、フォームは自動的に送信され、他のページに移動します。クエリフォ...

純粋な JS を使用して vue.js で双方向バインディング機能を実装する方法

目次まず、双方向バインディングを実装するアイデアについて説明します。これらの機能を実装するための j...

WeChatアプレットが左右連携を実現

この記事では、WeChatアプレットの左右連動を実現するための具体的なコードを参考までに紹介します。...

Mysql 5.7.19 無料インストール版 (64 ビット) の設定方法に関する詳細なチュートリアル

公式サイトから mysql-5.7.19-winx64 をダウンロードします。これはシステムの 64...

CSS3はシームレスなスクロールと手ぶれ防止を実現します

質問画像とテキストのシームレスなスクロールは、一般的に携帯電話では良い効果をもたらしますが、一部のモ...

Node.jsとDenoの比較

目次序文Denoとは何ですか? Node.jsとの比較建築ESモジュール依存関係の管理TypeScr...

JavaScript を使用してソートアルゴリズムを実装する方法

目次バブルソート選択ソート挿入ソート要約するバブルソートバブルソートは、シーケンスの右側から始めて、...

見栄えの良い CSS カスタム スタイル (タイトル h1 h2 h3)

レンダリングBlog Gardenでよく使われるスタイル /*タイトル h1 h2 h3 スタイル*...

この記事ではCSSの組み合わせセレクターの使い方を説明します

CSS 組み合わせセレクターには、単純なセレクターのさまざまな組み合わせが含まれます。 CSS3 に...

ビジュアルデザインとインタラクションデザインについて

<br />製品設計プロセス全体において、ビジュアルデザインとインタラクションデザインの...

インタラクティブデザインでページングと読み込みのどちらを選択するかについての説明

この記事の著者@子木yoyoが個人ブログに投稿したものです。 Web ページでもモバイル アプリでも...

Mysql を 5.7 にアップグレードした後のグループ クエリの問題を解決する

問題を見つける最近MySQLをMySQL 5.7にアップグレードした後、次のようなクエリでグループ化...

XHTML 入門チュートリアル: テーブルタグの応用

<br />テーブルは XHTML では扱いにくいタグなので、このセクションで理解するだ...

CSS3アニメーション属性に基づくWeChatタップアニメーション効果の実装

最近人気のWeChatタップ機能を見て、CSS3アニメーションを見直し、このボックスシェイクアニメー...

Vueは製品の拡大鏡効果を実現します

この記事の例では、製品の拡大鏡効果を実現するためのVueの具体的なコードを共有しています。具体的な内...