使用Vue3優(yōu)雅地實(shí)現(xiàn)表格拖動(dòng)排序
在 Vue.js 中主要通過(guò)第三方庫(kù)實(shí)現(xiàn)表格拖動(dòng)排序功能,其中最常用的庫(kù)是 SortableJS。
1. 安裝 sortablejs
npm i sortablejs --save
2. 初始化表格數(shù)據(jù)
這里使用 ElementPlus 作為前端組件庫(kù)
注意要給 el-table 綁定 row-key 屬性,并設(shè)置 ref。
<el-table ref="tableRef" border :data="tableData" :row-key="(row) => row.id" style="width: 100%" > <el-table-column type="index" label="序號(hào)" width="55" /> <el-table-column prop="id" label="id" width="100"> </el-table-column> <el-table-column prop="age" label="年齡" width="100"> </el-table-column> <el-table-column prop="name" label="姓名" width="120"> </el-table-column> </el-table>
js 部分
<script setup> import { ref, onMounted, onBeforeUnmount } from "vue"; const tableRef = ref(); // 表格數(shù)據(jù) const tableData = ref([ { id: 110, age: 20, name: "李白" }, { id: 120, age: 21, name: "杜甫" }, { id: 130, age: 22, name: "白居易" }, { id: 130, age: 27, name: "知否君" }, ]); </script>
3. 使用 sortablejs
3.1 導(dǎo)入 sortablejs
import Sortable from "sortablejs";
3.2 使用 sortablejs 創(chuàng)建拖動(dòng)表格方法
const sortableRow = ref(null); const sortableColumn = ref(null); // 拖動(dòng)表格行 const onSortableRow = () => { sortableRow.value = Sortable.create( tableRef.value.$el.querySelector(".el-table__body-wrapper tbody"), { animation: 150, onEnd: ({ newIndex, oldIndex }) => { // 獲取新的行位置 const currRow = tableData.value.splice(oldIndex, 1)[0]; // 重新排列行位置 tableData.value.splice(newIndex, 0, currRow); }, } ); }; // 拖動(dòng)表格列 const onSortableColumn = () => { sortableColumn.value = Sortable.create( tableRef.value.$el.querySelector(".el-table__header-wrapper thead tr"), { animation: 150, onEnd: ({ newIndex, oldIndex }) => { // 1.獲取表格列 const table = tableRef.value; const oldColumns = table.store.states.columns; // 2. 重新排列列的順序 const newColumns = [...oldColumns.value]; const movedColumn = newColumns.splice(oldIndex, 1)[0]; newColumns.splice(newIndex, 0, movedColumn); oldColumns.value = newColumns; }, } ); };
3.3 在周期函數(shù)中調(diào)用方法
// 組件掛載之后執(zhí)行 onMounted(() => { onSortableRow(); onSortableColumn(); });
3.4 銷毀實(shí)例
// 銷毀 onBeforeUnmount(() => { if (sortableRow.value) { sortableRow.value.destroy(); sortableRow.value = null; } if (sortableColumn.value) { sortableColumn.value.destroy(); sortableColumn.value = null; } });
4. 完整代碼
<template> <div> <el-card style="width: 30%"> <el-table ref="tableRef" border :data="tableData" :row-key="(row) => row.id" style="width: 100%" > <el-table-column type="index" label="序號(hào)" width="55" /> <el-table-column prop="id" label="id" width="100"> </el-table-column> <el-table-column prop="age" label="年齡" width="100"> </el-table-column> <el-table-column prop="name" label="姓名" width="120"> </el-table-column> </el-table> </el-card> </div> </template> <script setup> import Sortable from "sortablejs"; import { ref, onMounted, onBeforeUnmount } from "vue"; const tableRef = ref(); // 表格數(shù)據(jù) const tableData = ref([ { id: 110, age: 20, name: "李白" }, { id: 120, age: 21, name: "杜甫" }, { id: 130, age: 22, name: "白居易" }, { id: 130, age: 27, name: "知否君" }, ]); // 組件掛載之后執(zhí)行 onMounted(() => { onSortableRow(); onSortableColumn(); }); const sortableRow = ref(null); const sortableColumn = ref(null); // 拖動(dòng)表格行 const onSortableRow = () => { sortableRow.value = Sortable.create( tableRef.value.$el.querySelector(".el-table__body-wrapper tbody"), { animation: 150, onEnd: ({ newIndex, oldIndex }) => { // 獲取新的行位置 const currRow = tableData.value.splice(oldIndex, 1)[0]; // 重新排列行位置 tableData.value.splice(newIndex, 0, currRow); }, } ); }; // 拖動(dòng)表格列 const onSortableColumn = () => { sortableColumn.value = Sortable.create( tableRef.value.$el.querySelector(".el-table__header-wrapper thead tr"), { animation: 150, onEnd: ({ newIndex, oldIndex }) => { // 1.獲取表格列 const table = tableRef.value; const oldColumns = table.store.states.columns; // 2. 重新排列列的順序 const newColumns = [...oldColumns.value]; const movedColumn = newColumns.splice(oldIndex, 1)[0]; newColumns.splice(newIndex, 0, movedColumn); oldColumns.value = newColumns; }, } ); }; // 銷毀 onBeforeUnmount(() => { if (sortableRow.value) { sortableRow.value.destroy(); sortableRow.value = null; } if (sortableColumn.value) { sortableColumn.value.destroy(); sortableColumn.value = null; } }); </script> <style scoped></style>
效果圖
到此這篇關(guān)于使用Vue3優(yōu)雅地實(shí)現(xiàn)表格拖動(dòng)排序的文章就介紹到這了,更多相關(guān)Vue3表格拖動(dòng)排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue中使用a標(biāo)簽下載靜態(tài)資源文件(如excel、pdf等)純前端操作方法
這篇文章主要介紹了Vue中使用a標(biāo)簽下載靜態(tài)資源文件(如excel、pdf等)純前端操作方法的相關(guān)資料,需要的朋友可以參考下2025-02-02vue中axios的封裝問(wèn)題(簡(jiǎn)易版攔截,get,post)
這篇文章主要介紹了vue中axios的封裝問(wèn)題(簡(jiǎn)易版攔截,get,post),需要的朋友可以參考下2018-06-06vue開(kāi)發(fā)移動(dòng)端h5環(huán)境搭建的全過(guò)程
在正式使用Vue進(jìn)行移動(dòng)端頁(yè)面開(kāi)發(fā)前,需要做一些前置工作,下面這篇文章主要給大家介紹了關(guān)于vue開(kāi)發(fā)移動(dòng)端h5環(huán)境搭建的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08前端項(xiàng)目vue3/React如何使用pako庫(kù)解壓縮后端返回gzip數(shù)據(jù)
pako是一個(gè)流行的JS庫(kù),用于在瀏覽器中進(jìn)行數(shù)據(jù)壓縮和解壓縮操作,它提供了對(duì)常見(jiàn)的壓縮算法的實(shí)現(xiàn),使開(kāi)發(fā)者能夠在客戶端上輕松進(jìn)行數(shù)據(jù)壓縮和解壓縮,這篇文章主要介紹了前端項(xiàng)目vue3/React使用pako庫(kù)解壓縮后端返回gzip數(shù)據(jù),需要的朋友可以參考下2024-07-07vue項(xiàng)目如何實(shí)現(xiàn)ip和localhost同時(shí)訪問(wèn)
這篇文章主要介紹了vue項(xiàng)目如何實(shí)現(xiàn)ip和localhost同時(shí)訪問(wèn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10