Element-UI テーブルを使用してドラッグ アンド ドロップ機能を実装する
今回はElement-UI Tableを使ってドラッグ&ドロップ機能を実装する方法を紹介します。 Element-UI Tableを使ってドラッグ&ドロップ機能を実装する場合の注意点は何ですか?一見。
Element-UI の Table コンポーネントは非常に強力ですが、私たちのニーズはさらに強力です...
シンプルで粗雑なレンダリング:
1 データ駆動型
それらはすべてです。 mousedown、mousemove、mouseup イベント
による dom ノードの変更と削除に基づいています
しかし、Vue はデータ駆動型のフロントエンド フレームワークであるため、開発中に dom を操作することは避けるようにしてください
そして Element の Table コンポーネント-UI はカプセル化されています 非常に厳密で、DOM を直接操作すると予期せぬバグが簡単に発生する可能性があります そこで、私の中心的なアイデアは次のとおりです: 配列を通じてテーブル ヘッダー (列) をレンダリングし、配列の順序を変更することで列を変更するリストの並べ替え
テンプレート部分:
<p class="w-table" :class="{'w-table_moving': dragState.dragging}"> <el-table :data="data" :border="option.border" :height="option.height" :max-height="option.maxHeight" :style="{ width: parseInt(option.width)+'px' }" :header-cell-class-name="headerCellClassName" > <slot name="fixed"></slot> <el-table-column v-for="(col, index) in tableHeader" :key="index" :prop="col.prop" :label="col.label" :width="col.width" :min-width="col.minWidth" :type="col.type" :header-align="col.headerAlign" :column-key="index.toString()" :render-header="renderHeader" > </el-table-column> </el-table> </p>
上記のデータはリストデータコレクション、オプションはテーブルコンポーネント構成アイテム、ヘッダーは親コンポーネントによって渡されるテーブルヘッダーデータコレクションです
props: { data: { default: function () { return [] }, type: Array }, header: { default: function () { return [] }, type: Array }, option: { default: function () { return {} }, type: Object } }
設定項目は Element-UI の API に従って削除できます
ただし、コンポーネント内で使用されるパラメーターがいくつかあります:
1 は、header-cell-class-nameにバインドされています。ヘッダー セルにクラスを動的に追加して、ドラッグ中に点線効果を実現する関数。
2. 列キーは、変更する必要があるヘッダー要素の添字を決定するために使用されるヘッダー配列のインデックスにバインドされます
3. render-headerテーブルヘッダーレンダリング関数、カスタマイズを追加するために使用されます。mousemove およびその他の関連イベントを監視するメソッド
2. ドラッグ ステータスを記録しますドラッグ プロセス中にいくつかの重要なパラメータを記録する必要があります:
data () { return { tableHeader: this.header, dragState: { start: -1, // 起始元素的 index end: -1, // 结束元素的 index move: -1, // 移动鼠标时所覆盖的元素 index dragging: false, // 是否正在拖动 direction: undefined // 拖动方向 } } }
さらに、親要素はヘッダーに渡されます。データヘッダーですが、ドラッグは完了しています。このデータは後で変更されます
子コンポーネント内の親要素のデータを直接変更することはお勧めできません。そのため、ヘッダーデータヘッダーをホストするためにここで tableHeader が初期化されます
しかし、ヘッダーを変更できるようにするには、tableHeader も変更に応答することができます。監視ウォッチ watch: {
header (val, oldVal) {
this.tableHeader = val
}
}
Element-UI の Table コンポーネントをカスタマイズして [ドラッグ列幅を変更するためのボーダー]、mousemove、mouseup、mousedown はありません。イベントは公開されます そのため、ヘッダーをカスタマイズし、renderHeader()
メソッド
を使用する必要があるマウス イベント処理関数を手動で追加する必要があります。renderHeader (createElement, {column}) { return createElement( 'p', { 'class': ['thead-cell'], on: { mousedown: ($event) => { this.handleMouseDown($event, column) }, mouseup: ($event) => { this.handleMouseUp($event, column) }, mousemove: ($event) => { this.handleMouseMove($event, column) } } }, [ // 添加 <a> 用于显示表头 label createElement('a', column.label), // 添加一个空标签用于显示拖动动画 createElement('span', { 'class': ['virtual'] }) ]) },
3 つのマウス イベントのうち、最初のパラメーターはイベント オブジェクト、2 番目のパラメーターはヘッダー オブジェクトです 対応する処理関数では、対応するヘッダー要素の添字インデックスは column.columnKey を通じて取得できます
empty label ドラッグ中のアニメーションを表示するために使用します (破線)
4. イベント処理マウスが押されたときに、開始列が記録されます。マウスを離すと、終了列が記録されます。ドラッグ方向は、両者の差に基づいて計算されます。
その後、列のドラッグを実現するために、ヘッダーデータが開始列と終了列の位置に従って並べ替えられます。
ドラッグプロセスの処理関数は次のとおりです: // 按下鼠标开始拖动
handleMouseDown (e, column) {
this.dragState.dragging = true
this.dragState.start = parseInt(column.columnKey)
// 给拖动时的虚拟容器添加宽高
let table = document.getElementsByClassName('w-table')[0]
let virtual = document.getElementsByClassName('virtual')
for (let item of virtual) {
item.style.height = table.clientHeight - 1 + 'px'
item.style.width = item.parentElement.parentElement.clientWidth + 'px'
}
},
// 鼠标放开结束拖动
handleMouseUp (e, column) {
this.dragState.end = parseInt(column.columnKey) // 记录起始列
this.dragColumn(this.dragState)
// 初始化拖动状态
this.dragState = {
start: -1,
end: -1,
move: -1,
dragging: false,
direction: undefined
}
},
// 拖动中
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.move = parseInt(column.columnKey)
} else {
this.dragState.direction = undefined
}
} else {
return false
}
},
// 拖动易位
dragColumn ({start, end, direction}) {
let tempData = []
let left = direction === 'left'
let min = left ? end : start - 1
let max = left ? start + 1 : end
for (let i = 0; i < this.tableHeader.length; i++) {
if (i === end) {
tempData.push(this.tableHeader[start])
} else if (i > min && i < max) {
tempData.push(this.tableHeader[ left ? i - 1 : i + 1 ])
} else {
tempData.push(this.tableHeader[i])
}
}
this.tableHeader = tempData
},
このプロセスでは、mousemove イベントを通じて、現在の列のヘッダーのステータスが変更され 、その後、そのクラスが headerCellClassName
headerCellClassName ({column, columnIndex}) { return (columnIndex - 1 === this.dragState.move ? `darg_active_${this.dragState.direction}` : '') }
の助けを借りて動的に変更されます。ヘッダー セル
自分で書いた完全なスタイルを投稿します (sass を使用)コンパイル ツール):<style lang="scss">
.w-table {
.el-table th {
padding: 0;
.virtual{
position: fixed;
display: block;
width: 0;
height: 0;
margin-left: -10px;
z-index: 99;
background: none;
border: none;
}
&.darg_active_left {
.virtual {
border-left: 2px dotted #666;
}
}
&.darg_active_right {
.virtual {
border-right: 2px dotted #666;
}
}
}
.thead-cell {
padding: 0;
display: inline-flex;
flex-direction: column;
align-items: left;
cursor: pointer;
overflow: initial;
&:before {
content: "";
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
}
&.w-table_moving {
.el-table th .thead-cell{
cursor: move !important;
}
.el-table__fixed {
cursor: not-allowed;
}
}
}
<template> <p> <wTable :data="tableData" :header="tableHeader" :option="tableOption"> <el-table-column slot="fixed" fixed prop="date" label="日期" width="150"> </el-table-column> </wTable> </p> </template> <script> import wTable from '@/components/w-table.vue' export default { name: 'Table', data () { return { tableOption: { border: true, maxHeight: 500 }, tableHeader: [{ prop: 'name', label: '姓名', sortable: true, sortMethod: this.handleNameSort }, { prop: 'province', label: '省份', minWidth: '120' }, { prop: 'city', label: '市区', minWidth: '120' }, { prop: 'address', label: '地区', minWidth: '150' }, { prop: 'zip', label: '邮编', minWidth: '120' }], tableData: [{ date: '2016-05-03', name: '王小虎', province: '上海', city: '普陀区', address: '上海市普陀区金沙江路 1518 弄', zip: 200333 }, { date: '2016-05-02', name: '王小虎', province: '上海', city: '普陀区', address: '上海市普陀区金沙江路 1518 弄', zip: 200333 }, { date: '2016-05-04', name: '王小虎', province: '上海', city: '普陀区', address: '上海市普陀区金沙江路 1518 弄', zip: 200333 }, { date: '2016-05-01', name: '王小虎', province: '上海', city: '普陀区', address: '上海市普陀区金沙江路 1518 弄', zip: 200333 }, { date: '2016-05-08', name: '王小虎', province: '上海', city: '普陀区', address: '上海市普陀区金沙江路 1518 弄', zip: 200333 }, { date: '2016-05-06', name: '王小虎', province: '上海', city: '普陀区', address: '上海市普陀区金沙江路 1518 弄', zip: 200333 }] } }, methods: { handleNameSort () { console.log('handleNameSort') } }, components: { wTable } } </script>
推奨書籍:
以上がElement-UI テーブルを使用してドラッグ アンド ドロップ機能を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









element.style で要素を変更するメソッド: 1. 要素の背景色を変更する; 2. 要素のフォント サイズを変更する; 3. 要素の境界線のスタイルを変更する; 4. 要素のフォント スタイルを変更する; 5要素の水平方向の配置を変更します。詳細な紹介: 1. 要素の背景色を変更します。構文は "document.getElementById("myElement").style.backgroundColor = "red";"; 2. 要素のフォント サイズなどを変更します。

JavaScript を使用して画像のドラッグとズーム機能を実装するにはどうすればよいですか?最新の Web 開発では、画像のドラッグとズームは一般的な要件です。 JavaScript を使用すると、画像にドラッグやズーム機能を簡単に追加して、より良いユーザー エクスペリエンスを提供できます。この記事では、JavaScriptを使用してこの機能を実装する方法を、具体的なコード例とともに紹介します。 HTML 構造 まず、画像を表示したり追加したりするための基本的な HTML 構造が必要です。

エルデンズリングでは、このゲームの UI ページは一定時間が経過すると自動的に非表示になります。UI が常に表示される方法を知らないプレイヤーも多いです。プレイヤーはディスプレイとサウンドの設定でゲージの表示設定を選択できます。クリックすると回転します。の上。 Elden Ring UI が表示され続けるのはなぜですか? 1. まず、メインメニューに入った後、[システム構成] をクリックします。 2. [表示とサウンドの設定]インターフェースで、メーターの表示設定を選択します。 3. 「有効にする」をクリックして完了します。

Vue は、シングル ページ アプリケーション (SPA) の構築に適した人気のある JavaScript フレームワークです。命令とコンポーネントを通じてドラッグ アンド ドロップの選択と配置機能をサポートし、ユーザーに優れたインタラクティブなエクスペリエンスを提供します。この記事では、Vue でのドラッグ アンド ドロップによる選択と配置のテクニックとベスト プラクティスを紹介します。ドラッグ命令 Vue は、ドラッグ効果を簡単に実現できる v ドラッグ可能な命令を提供します。このコマンドは任意の要素に適用でき、ドラッグ スタイルをカスタマイズできます。

Vue は、コンポーネントベースのアプローチを使用して Web アプリケーションを構築する人気のある JavaScript フレームワークです。 Vue エコシステムには、美しいインターフェイスを迅速に構築し、豊富な機能とインタラクティブな効果を提供するのに役立つ UI コンポーネント ライブラリが多数あります。この記事では、一般的な VueUI コンポーネント ライブラリをいくつか紹介します。 ElementUIElementUI は、Ele.me チームによって開発された Vue コンポーネント ライブラリです。

Vue を使用してドラッグ アンド ドロップの並べ替え効果を実装する方法 Vue.js は、高度にインタラクティブなフロントエンド アプリケーションの構築に役立つ人気のある JavaScript フレームワークです。 Vue では、ドラッグ アンド ドロップの並べ替え効果を簡単に実装でき、ユーザーは要素をドラッグしてデータを並べ替えることができます。この記事では、Vue を使用してドラッグ アンド ドロップの並べ替え効果を実装する方法を紹介し、具体的なコード例を示します。まず、Vue のインスタンスを作成し、並べ替えるデータを格納する配列を定義する必要があります。この例では、

Vue の実践スキル: v-on 命令を使用してマウス ドラッグ イベントを処理する はじめに: Vue.js は人気のある JavaScript フレームワークであり、そのシンプルさ、使いやすさ、柔軟性により、多くの開発者にとって最初の選択肢となっています。 Vue アプリケーション開発では、ユーザー インタラクション イベントの処理は必須のスキルです。この記事では、Vue の v-on ディレクティブを使用してマウス ドラッグ イベントを処理する方法を紹介し、具体的なコード例を示します。 Vue インスタンスを作成します: まず、HTML ファイルに Vue.js ライブラリ ファイルを導入します: &

AIにとって「携帯電話で遊ぶ」ということは簡単なことではなく、さまざまなユーザーインターフェース(UI)を識別するだけでも大きな問題であり、各コンポーネントの種類を識別するだけでなく、使用されている記号、位置を識別して機能を決定する必要がありますコンポーネントの。モバイル デバイスの UI を理解すると、UI の自動化など、人間とコンピューターのさまざまな対話タスクを実現するのに役立ちます。モバイル UI モデリングに関するこれまでの研究は通常、画面のビュー階層情報に依存し、UI の構造データを直接利用することで、画面ピクセルから始まるコンポーネントの識別の問題を回避していました。ただし、ビュー階層はすべてのシナリオで使用できるわけではありません。通常、この方法では、オブジェクトの説明が欠落していたり、構造情報が間違っているため、誤った結果が出力されます。
