Vue Element Sortablejs を使用してテーブル列をドラッグする詳細な説明

Vue Element Sortablejs を使用してテーブル列をドラッグする詳細な説明

1. css: ドラッグテーブル.css

@charset "UTF-8";
 
.w-テーブル{
  高さ: 100%;
  幅: 100%;
  フロート: 左;
}
/* ドラッグ中のマウス表示スタイル*/
.w-table_moving .el-table th .thead-cell{
  カーソル: 移動 !important;
}
.w-table_moving .el-table__fixed{
  カーソル: 許可されていません。
}
.w-テーブル .thead-セル{
  ディスプレイ: インラインフレックス;
  flex-direction: 列;
  アイテムの位置を中央揃えにします。
  幅: 自動;
  最大高さ: 23px;
  垂直位置合わせ: 中央;
  オーバーフロー: 初期値;
  位置: 相対的;
}

2. コンポーネントをカプセル化する: dragTable.vue

<テンプレート>
    <div class="w-table" :class="{'w-table_moving': dragState.dragging}">
        <el-table :data="データ"
                  :ref="オプション.ref"
                  :class="オプション.class"
                  :stripe="オプション.stripe"
                  :border="オプション.border"
                  :height="オプションの高さ"
                  :max-height="option.maxHeight"
                  現在の行をハイライト
                  :style="{ width: parseInt(option.width)+'px' }" :cell-class-name="セルクラス名"
                  :header-cell-class-name="ヘッダーセルクラス名"
                  @sort-change="option.sortChange"
        >
            <スロット名="固定"></スロット>
 
            <template v-for="(col, index) in tableHeader">
                <el-table-column :label="col.label" :key="index" :prop="col.prop" :width="col.width" v-if="col.useTemplate==true">
                    <テンプレート スロット スコープ="スコープ">
                        <span v-html=col.useTemplateRes(scope.row)></span>
                    </テンプレート>
                </el-table-column>
                <el-テーブル列v-else
                                 :key="インデックス"
                                 :prop="col.prop"
                                 :label="列ラベル"
                                 :width="列幅"
                                 :min-width="列の最小幅"
                                 :type="列タイプ"
                                 :sortable="col.sortable"
                                 :header-align="col.headerAlign"
                                 :align="列揃え"
                                 :列キー="index.toString()"
                                 :render-header="レンダリングヘッダー"
                                 オーバーフローツールチップを表示
                                 :formatter="col.formatter"
                >
                </el-table-column>
                <el-table-column :label="v.name" :key="k" :prop="v.prop" :width="v.width" v-else></el-table-column>
            </テンプレート>
 
 
            <!--<el-table-column v-for="(col, index) in tableHeader" :key="index"
                             :prop="col.prop"
                             :label="列ラベル"
                             :width="列幅"
                             :min-width="列の最小幅"
                             :type="列タイプ"
                             :sortable="col.sortable"
                             :header-align="col.headerAlign"
                             :align="列揃え"
                             :列キー="index.toString()"
                             :render-header="レンダリングヘッダー"
                             オーバーフローツールチップを表示
                             :formatter="col.formatter"
            >
            </el-table-column>-->
        </el-table>
    </div>
</テンプレート>
 
<スクリプト>
    'sortablejs' から Sortable をインポートします。
    エクスポートデフォルト{
        名前: ""、
        データ () {
            戻る {
                テーブルヘッダー: this.header、
                ドラッグ状態: {
                    start: -9, // 開始要素のインデックス
                    end: -9, // マウスを動かしたときにカバーされる要素のインデックス
                    dragging: false, // ドラッグしているか direction: undefined // ドラッグ方向 }
            }
        },
        小道具: {
            データ: {
                デフォルト: 関数() {
                    戻る []
                },
                タイプ: 配列
            },
            ヘッダー: {
                デフォルト: 関数() {
                    戻る []
                },
                タイプ: 配列
            },
            オプション: {
                デフォルト: 関数() {
                    戻る {}
                },
                タイプ: オブジェクト
            }
        },
        マウント() {
 
        },
        時計:
            ヘッダー (val, oldVal) {
                this.tableHeader = val
            }
        },
        メソッド: {
 
            レンダリングヘッダー (createElement、{列}) {
                要素の作成を返す(
                    'div', {
                        'クラス': ['ヘッドセル'],
                        の上: {
                            マウスダウン: ($event) => { this.handleMouseDown($event, column) },
                            マウス移動: ($event) => { this.handleMouseMove($event, column) }
                        }
                    }, [
                        // ヘッダーラベルを表示するために <a> を追加します
                        要素を作成します('span', 列.ラベル),
                        // ドラッグアニメーションを表示するための空のタグを追加します createElement('span', {
                            'クラス': ['仮想']
                        })
                    ])
            },
            // マウスを押してドラッグを開始します handleMouseDown (e, column) {
                this.dragState.dragging = true
                this.dragState.start = parseInt(column.columnKey)
                // ドラッグ中に仮想コンテナに幅と高さを追加します。let table = document.getElementsByClassName('w-table')[0]
                仮想 = document.getElementsByClassName('virtual') とします。
                for (let 仮想アイテム) {
                    item.style.height = table.clientHeight - 1 + 'px'
                    // item.style.width = item.parentElement.parentElement.clientWidth + 'px'
                    item.style.width = item.parentElement.clientWidth + 'px'
                }
                document.addEventListener('mouseup', this.handleMouseUp);
            },
 
            // ドラッグを終了するにはマウスを放します。handleMouseUp() {
                this.dragColumn(this.dragState)
                // ドラッグ状態を初期化する this.dragState = {
                    開始: -9,
                    終了: -9,
                    ドラッグ: false、
                    方向: 未定義
                }
                document.removeEventListener('mouseup', this.handleMouseUp);
            },
 
            //ドラッグ handleMouseMove (e, column) {
                if (this.dragState.dragging) {
                    let index = parseInt(column.columnKey) // 開始列を記録します if (index - this.dragState.start !== 0) {
                        this.dragState.direction = index - this.dragState.start < 0 ? 'left' : 'right' // ドラッグ方向を決定します this.dragState.end = parseInt(column.columnKey)
                    } それ以外 {
                        this.dragState.direction = 未定義
                    }
                } それ以外 {
                    偽を返す
                }
            },
 
            // ドラッグして位置を変更する dragColumn ({start, end, direction}) {
                tempData = [] とします
                左 = 方向 === '左' とします
                min = left ? end : start - 1 とします。
                max = left ? start + 1 : end とします。
                (i = 0 とします; i < this.tableHeader.length; i++) {
                    if (i === 終了) {
                        tempData.push(this.tableHeader[start])
                    } そうでない場合 (i > min && i < max) {
                        tempData.push(this.tableHeader[left?i-1:i+1])
                    } それ以外 {
                        tempData.push(this.tableHeader[i])
                    }
                }
                this.tableHeader = tempData
            },
            ヘッダーセルクラス名 ({列、列インデックス}) {
                active = columnIndex - 1 === this.dragState.end ? `darg_active_${this.dragState.direction}` : '' とします。
                start = columnIndex - 1 === this.dragState.start ? `darg_start` : '' とします。
                `${active} ${start}` を返す
            },
 
            セルクラス名 ({列, 列インデックス}) {
                戻り値 (columnIndex - 1 === this.dragState.start ? `darg_start` : '')
            },
 
 
 
 
 
 
 
        },
    }
</スクリプト>
 
<スタイル>
    @import '~@/assets/css/dragTable.css';
 
 
 
</スタイル>

3. パッケージコンポーネントの呼び出し

<テンプレート>
    <div>
        <wTable :data="WarnResTable_Data_SS" :header="tableHeaderSS" :option="tableOptionSS">
            <el-テーブル列
                    タイプ="インデックス"
                    スロット="固定"
                    修理済み
                    プロパティ=""
                    label="シリアル番号"
                    align="center"
                    幅= "60"
            >
            </el-table-column>
            <el-テーブル列
                    ラベル="操作"
                    スロット="固定"
                    修理済み
                    プロパティ=""
                    幅="95"
                    align="center">
                <テンプレート スロット スコープ="スコープ">
                    <el-ボタン
                            サイズ="ミニ"
                            @click="lookDetails(scope.$index, scope.row)">表示</el-button>
                </テンプレート>
            </el-table-column>
        </wテーブル>
    </div>
</テンプレート>
 
<スクリプト>
    '../../components/dragTable/dragTable' から wTable をインポートします。
    エクスポートデフォルト{
        名前: 'テーブル'、
        データ () {
            戻る {
                テーブルオプションSS: {
                    境界線: true、
                    ストライプ: true、
                    ref:'WarnResSSTable',
                    クラス:'pms-table',
                    最大高さ: "100%",
                    高さ: "100%",
                    ソート変更:this.changeTableSortSS
                },
                テーブルヘッダーSS: [
                    {
                        ラベル: '都市名'、
                        プロパティ: 'dsmc',
                        ソート可能: true、
                        配置: '中央',
                        幅:'200',
                    },
                    {
                        ラベル: 「運用保守ユニット」、
                        プロパティ: 'ywdw'、
                        配置: '中央',
                        幅:'200',
                    },
                    {
                        ラベル: '変電所'、
                        プロパティ: 'bdzmc',
                        配置: '中央',
                        幅:'170',
                    },
                    {
                        ラベル: 'デバイス名'、
                        プロパティ: 'sbmc',
                        ソート可能: true、
                        配置: '中央',
                        幅:'150',
                    },
                    {
                        ラベル: '警告パラメータ'、
                        プロパティ: 'yjcs',
                        配置: '中央',
                        幅:'150',
                    },
                    {
                        ラベル: '警告タイプ'、
                        プロパティ: 'yjlx',
                        配置: '中央',
                        幅:'140',
                    },
                    {
                        ラベル: 「最初の警告時間」、
                        プロパティ: 'scyjsj',
                        ソート可能:true、
                        配置: '中央',
                        幅:'160',
                        フォーマッタ:this.formatTime
                    },
                    {
                        ラベル: 'データ更新時間'、
                        プロパティ: 'dqyjsj',
                        ソート可能:true、
                        配置: '中央',
                        幅:'160',
                        フォーマッタ:this.formatTime
                    },
                    {
                        ラベル: '警告の説明'、
                        プロパティ: 'yjgz',
                        配置: '中央',
                        幅:'170',
                    },
                    {
                        ラベル: 'デバイスタイプ'、
                        プロパティ: 'sblx',
                        ソート可能:true、
                        配置: '中央',
                        幅:'140',
                    },
                    {
                        ラベル: '電圧レベル'、
                        プロップ: 'dydjid',
                        ソート可能:true、
                        配置: '中央',
                        幅:'120',
                        フォーマッタ:this.formatVoltageLevel
                    }
                ]、
                警告ResTable_Data_SS:[
                    {dsmc:'dsmc1',sbmc:'sbmc1',dydjid:'hhhhh1'},
                    {dsmc:'dsmc2',sbmc:'sbmc2',dydjid:'hhhhh2'},
                    {dsmc:'dsmc3',sbmc:'sbmc3',dydjid:'hhhhh3'}
                ]、
            }
        },
        メソッド: {
            ハンドル名ソート() {
                console.log('ハンドル名ソート')
            },
            formatVoltageLevel: 関数 (行、列) {
                val = row[column.property]とします。
                (値が未定義の場合){
                    戻る "";
                }
                コンソールログ('val')
                '5555'を返す
 
            },
            changeTableSortSS(列){
                console.log('sortHandle列',列)
            },
            formatTime: 関数 (行、列) {
 
                date = row[column.property]とします。
                日付 == 未定義の場合 {
                    戻る "";
                }
                date?moment(new Date(date)).format('YYYY-MM-DD HH:MM:SS'):'';を返します。
            },
            formatVoltageLevel: 関数 (行、列) {
                val = row[column.property]とします。
                (値が未定義の場合){
                    戻る "";
                }
                val+'kV'を返す
            },
        },
        コンポーネント:
            wテーブル
        }
    }
</スクリプト>

これで、Vue Element Sortablejs でテーブル列をドラッグ アンド ドロップする場合の詳細な説明は終了です。Vue Element Sortablejs でテーブル列のドラッグ アンド ドロップを実装する方法に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue ドラッグ可能なコンポーネントを使用して、Vue プロジェクトでテーブル コンテンツのドラッグ アンド ドロップによる並べ替えを実装します。
  • vue.draggableはテーブルのドラッグアンドドロップソート効果を実現します
  • Vue ベースのドラッグ可能なツリーテーブルの例の詳細な説明
  • Elementui テーブル コンポーネント + sortablejs を使用して行のドラッグ アンド ドロップによる並べ替えを実装するサンプル コード
  • JS コンポーネント Bootstrap Table テーブル複数行ドラッグ効果実装コード
  • JS コンポーネント Bootstrap Table テーブル行ドラッグ効果実装コード
  • テーブルの並べ替え、編集、ドラッグ、ズームを実装するJavaScript
  • js テーブルの並べ替え (編集 + ドラッグ + ズーム)
  • js テーブル ドラッグ効果のサンプル コード (IE のみ)
  • vue+element-ui+sortable.js はテーブルドラッグ機能を実現します

<<:  MySQL Installer 8.0.21 インストール チュートリアル (画像とテキスト付き)

>>:  nginx の default_server 定義とマッチングルールの詳細な説明

推薦する

CentOS8 jdk8 / java8 のインストールチュートリアル(推奨)

序文最初はCentOS8でwgetを使ってダウンロードし、解凍して環境変数を設定するつもりだったので...

CSS スクロールバースタイル変更コード

CSS スクロールバースタイル変更コード .scroll::-webkit-scrollbar { ...

HTML でフロートをクリアする 2 つの方法

1. クリアフローティング法1前の親要素の高さを設定します。注: エンタープライズ開発では、可能であ...

ウェブサイトデザインの経験 ウェブサイト構築におけるよくある間違いのまとめ

注意: 計画、設計、開発のいずれの場合でも、これらの間違いは避けなければなりません。 1. ナビゲー...

Vueはページキャッシュ機能を実装する

この記事の例では、ページキャッシュ機能を実装するためのVueの具体的なコードを参考までに共有していま...

Docker は次の「Linux」になれるか?

Linux オペレーティング システムは過去 20 年間にわたってデータ センターに革命をもたらし...

ネイティブjsは9マスグリッドのドラッグアンドドロップを実現します

ネイティブJSを使用して9つの正方形のグリッドを記述し、9つのグリッドの位置をドラッグして変更する効...

フロントエンドに必要なNginx設定の詳細な説明

Nginx (エンジン x) は、軽量で高性能な HTTP およびリバース プロキシ サーバーであり...

MySQLデータベースのトランザクション分離レベルの詳細な説明

データベーストランザクション分離レベルデータベース トランザクションには、低から高まで 4 つの分離...

TypeScript をインストール、使用、自動コンパイルする方法に関するチュートリアル

1. TypeScriptの紹介前回の記事ではTypeScriptのインストール、使い方、自動コンパ...

XHTML CSS ページをプリンタ ページに変換する

<br />これまで、Web ページのプリンタ対応バージョンを作成するには、印刷したとき...

Tomcatはスレッドプールを使用してリモート同時リクエストを処理します。

Tomcatが同時リクエストを処理する方法を理解することで、スレッドプール、ロック、キュー、および...

CSS 属性を使用してマウス イベントをブロックする方法 (マウス クリックは上位の要素を貫通する可能性があります)

由来: 数日前、テスターから写真を見るという要件が送られてきました。 この要件を見たとき、私は少し混...

LinuxシステムにTomcatをインストールし、サービスの起動とシャットダウンを構成する

Linuxシステムでサービスの起動とシャットダウンを構成する1. コマンドcd /etc/init....

なぜCSSをヘッドタグに配置する必要があるのか

考えてみてください。なぜcss 、 javascriptのようにbodyタグの末尾ではなく、 hea...