Rumah hujung hadapan web tutorial js 使用Element-UI Table实现拖拽功能

使用Element-UI Table实现拖拽功能

Jun 08, 2018 am 11:17 AM
element table ui seret

这次给大家带来使用Element-UI Table实现拖拽功能,使用Element-UI Table实现拖拽功能的注意事项有哪些,下面就是实战案例,一起来看一下。

Element-UI 的 Table 组件很强大,但是我们的需求更强大...

简单粗暴的来一发效果图:

一、数据驱动

传统的拖动效果,都是基于通过 mousedown、mousemove、mouseup 事件来修改删减 dom 节点

但 Vue 是一个数据驱动的前端框架,开发时应尽量避免操作 dom

而且 Element-UI 的 Table 组件封装得很严谨,直接操作 dom 很容易产生不可预计的 bug

所以我的核心思路就是:通过一个数组渲染表头(列),然后修改这个数组的顺序,从而修改列表的列排序

template 部分:

 <p class="w-table" :class="{&#39;w-table_moving&#39;: dragState.dragging}">
 <el-table :data="data"
  :border="option.border"
  :height="option.height"
  :max-height="option.maxHeight"
  :style="{ width: parseInt(option.width)+&#39;px&#39; }"
  :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>
Salin selepas log masuk

上面的 data 是列表数据集合,option 是 Table 组件配置项,header 是表头数据集合,由父组件传入

props: {
 data: {
  default: function () {
  return []
  },
  type: Array
 },
 header: {
  default: function () {
  return []
  },
  type: Array
 },
 option: {
  default: function () {
  return {}
  },
  type: Object
 }
 }
Salin selepas log masuk

配置项可以根据 Element-UI 的 api 自行删减

但有几个参数在组件内部被征用:

1. header-cell-class-name

绑定了一个函数,动态给表头单元格添加 class,从而实现拖动中的虚线效果。

2. column-key

绑定为 header 数组的 index,用于确定需要修改的 header 元素下标

3. render-header

表头渲染函数,用以添加自定义方法,以监听 mousemove 等相关事件 

二、记录拖动状态

拖动过程中需要记录几个关键参数:

data () {
 return {
  tableHeader: this.header,
  dragState: {
  start: -1, // 起始元素的 index
  end: -1, // 结束元素的 index
  move: -1, // 移动鼠标时所覆盖的元素 index
  dragging: false, // 是否正在拖动
  direction: undefined // 拖动方向
  }
 }
 }
Salin selepas log masuk

另外父元素传入了一个表头数据 header,但拖动完成后会修改这个数据

在子组件中直接修改父元素的数据是不推荐的,所以这里初始化了一个 tableHeader 用于托管表头数据 header

但为了让 header 修改时,tableHeader 也能响应修改,就得添加一个监视器 watch

 watch: {
 header (val, oldVal) {
  this.tableHeader = val
 }
 }
Salin selepas log masuk

三、自定义表头

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']
   })
  ])
 },
Salin selepas log masuk

三个鼠标事件中,第一个参数是事件对象,第二个是表头对象

在对应的处理函数中,可以通过 column.columnKey 获取到对应的表头元素下标 index

空标签 用来显示拖动时的动画(虚线)

四、事件处理

按下鼠标时,记录下起始列。鼠标抬起时,记录下结束列。根据二者之差计算出拖动的方向。

然后根据起始列和结束列的位置,将表头数据重新排序,从而实现列的拖动

拖动过程的处理函数如下:

// 按下鼠标开始拖动
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 ? &#39;left&#39; : &#39;right&#39; // 判断拖动方向
  this.dragState.move = parseInt(column.columnKey)
 } else {
  this.dragState.direction = undefined
 }
 } else {
 return false
 }
},

// 拖动易位
dragColumn ({start, end, direction}) {
 let tempData = []
 let left = direction === &#39;left&#39;
 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
},
Salin selepas log masuk

五、虚线效果

在拖动过程中,通过 mousemove 事件,改变当前列的表头状态

然后借助 headerCellClassName 动态修改其 class

headerCellClassName ({column, columnIndex}) {
 return (columnIndex - 1 === this.dragState.move ? `darg_active_${this.dragState.direction}` : &#39;&#39;)
}
Salin selepas log masuk

这个 class 会添加到表头单元格 上,通过这个 class 给上面的空标签 添加虚线即可

贴一下我自己写的完整样式(使用了 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;
 }
 }
}
Salin selepas log masuk

六、父组件调用

<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>
Salin selepas log masuk

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

progressbar组件实战案例解析

如何优化Vue项目

Atas ialah kandungan terperinci 使用Element-UI Table实现拖拽功能. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk mengubah suai elemen.gaya Bagaimana untuk mengubah suai elemen.gaya Nov 24, 2023 am 11:15 AM

Kaedah untuk elemen.gaya untuk mengubah suai elemen: 1. Ubah suai warna latar belakang elemen; 2. Ubah suai saiz fon elemen; Ubah suai penjajaran mendatar elemen. Pengenalan terperinci: 1. Ubah suai warna latar belakang elemen, sintaksnya ialah "document.getElementById("myElement").style.backgroundColor = "red";" 2. Ubah suai saiz fon elemen, dsb.

Bagaimana untuk menggunakan JavaScript untuk melaksanakan fungsi seret dan zum imej? Bagaimana untuk menggunakan JavaScript untuk melaksanakan fungsi seret dan zum imej? Oct 27, 2023 am 09:39 AM

Bagaimana untuk menggunakan JavaScript untuk melaksanakan fungsi seret dan zum imej? Dalam pembangunan web moden, menyeret dan mengezum imej adalah keperluan biasa. Dengan menggunakan JavaScript, kami boleh menambahkan fungsi seret dan zum pada imej dengan mudah untuk memberikan pengalaman pengguna yang lebih baik. Dalam artikel ini, kami akan memperkenalkan cara menggunakan JavaScript untuk melaksanakan fungsi ini, dengan contoh kod khusus. Struktur HTML Pertama, kita memerlukan struktur HTML asas untuk memaparkan gambar dan menambah

Mengapakah UI Elden Ring terus muncul? Mengapakah UI Elden Ring terus muncul? Mar 11, 2024 pm 04:31 PM

Dalam Elden's Ring, halaman UI permainan ini akan disembunyikan secara automatik selepas tempoh masa Ramai pemain tidak tahu bagaimana UI sentiasa dipaparkan Pemain boleh memilih konfigurasi paparan tolok dalam paparan dan konfigurasi bunyi pada. Mengapa UI Elden Ring terus dipaparkan? 1. Pertama, selepas kita memasuki menu utama, klik [Konfigurasi Sistem]. 2. Dalam antara muka [Display and Sound Configuration], pilih konfigurasi paparan meter. 3. Klik Dayakan untuk melengkapkan.

Petua dan amalan terbaik untuk pemilihan seret dan lepas dan peletakan dalam Vue Petua dan amalan terbaik untuk pemilihan seret dan lepas dan peletakan dalam Vue Jun 25, 2023 am 10:13 AM

Vue ialah rangka kerja JavaScript popular yang sesuai untuk membina aplikasi halaman tunggal (SPA). Ia menyokong pemilihan drag-and-drop dan fungsi peletakan melalui arahan dan komponen, memberikan pengguna pengalaman interaktif yang lebih baik. Artikel ini akan memperkenalkan teknik dan amalan terbaik untuk pemilihan seret dan lepas dan peletakan dalam Vue. Drag Instruction Vue menyediakan arahan v-draggable yang boleh mencapai kesan seretan dengan mudah. Perintah ini boleh digunakan pada mana-mana elemen, dan gaya seret boleh disesuaikan.

Apakah perpustakaan komponen UI biasa dalam Vue? Apakah perpustakaan komponen UI biasa dalam Vue? Jun 11, 2023 am 11:47 AM

Vue ialah rangka kerja JavaScript popular yang menggunakan pendekatan berasaskan komponen untuk membina aplikasi web. Dalam ekosistem Vue, terdapat banyak perpustakaan komponen UI yang boleh membantu anda membina antara muka yang cantik dengan cepat dan menyediakan fungsi yang kaya dan kesan interaktif. Dalam artikel ini, kami akan memperkenalkan beberapa pustaka komponen VueUI biasa. ElementUIElementUI ialah perpustakaan komponen Vue yang dibangunkan oleh pasukan Ele.me Ia menyediakan pembangun dengan satu set yang elegan.

Cara menggunakan Vue untuk melaksanakan kesan pengisihan seret dan lepas Cara menggunakan Vue untuk melaksanakan kesan pengisihan seret dan lepas Sep 20, 2023 pm 03:01 PM

Cara menggunakan Vue untuk melaksanakan kesan pengisihan seret dan lepas Vue.js ialah rangka kerja JavaScript popular yang boleh membantu kami membina aplikasi bahagian hadapan yang sangat interaktif. Dalam Vue, kami boleh melaksanakan kesan isihan seret dan lepas dengan mudah, membolehkan pengguna mengisih data dengan menyeret elemen. Artikel ini akan memperkenalkan cara menggunakan Vue untuk melaksanakan kesan pengisihan seret dan lepas dan memberikan contoh kod khusus. Mula-mula, kita perlu mencipta contoh Vue dan menentukan tatasusunan untuk menyimpan data yang hendak diisih. Dalam contoh kita akan

Kemahiran praktikal Vue: gunakan arahan v-on untuk mengendalikan acara seret tetikus Kemahiran praktikal Vue: gunakan arahan v-on untuk mengendalikan acara seret tetikus Sep 15, 2023 am 08:24 AM

Kemahiran praktikal Vue: Gunakan arahan v-on untuk mengendalikan acara seret tetikus Prakata: Vue.js ialah rangka kerja JavaScript yang popular Kesederhanaan, kemudahan penggunaan dan fleksibiliti menjadikannya pilihan pertama bagi banyak pembangun. Dalam pembangunan aplikasi Vue, pengendalian peristiwa interaksi pengguna adalah kemahiran penting. Artikel ini akan memperkenalkan cara menggunakan arahan v-on Vue untuk mengendalikan peristiwa seret tetikus dan memberikan contoh kod khusus. Buat contoh Vue: Mula-mula, perkenalkan fail perpustakaan Vue.js dalam fail HTML: &

Dua penyelidik Google China mengeluarkan model 'pemahaman UI mudah alih' visual yang pertama, empat tugas utama untuk menyegarkan SOTA Dua penyelidik Google China mengeluarkan model 'pemahaman UI mudah alih' visual yang pertama, empat tugas utama untuk menyegarkan SOTA Apr 12, 2023 pm 04:40 PM

Bagi AI, "bermain dengan telefon mudah alih" bukanlah tugas yang mudah Hanya mengenal pasti pelbagai antara muka pengguna (UI) adalah masalah besar: bukan sahaja jenis setiap komponen mesti dikenal pasti, tetapi juga simbol yang digunakan, kedudukan untuk menentukan fungsi. daripada komponen tersebut. Memahami UI peranti mudah alih boleh membantu merealisasikan pelbagai tugas interaksi manusia-komputer, seperti automasi UI. Kerja sebelumnya untuk memodelkan UI mudah alih biasanya bergantung pada maklumat hierarki paparan skrin, secara langsung menggunakan data struktur UI, dan dengan itu memintas masalah mengenal pasti komponen bermula dari piksel skrin. Walau bagaimanapun, hierarki paparan tidak tersedia dalam semua senario Kaedah ini biasanya menghasilkan hasil yang salah disebabkan penerangan objek yang hilang atau maklumat struktur yang salah letak, jadi walaupun anda menggunakan.

See all articles