07_el-table 拖动改变列的展示顺序 _ 前端实现

1、动态渲染el-table

<template>
  <div>
    <!-- 表格 -->
    <el-table :data="tableData" border style="width: 100%">
      <el-table-column type="index" label="序号" width="50" align="center" />
      <el-table-column v-for="(column, index) in columnsOrder" :custom="column.custom" :key="index"
        :label="column.label" :width="column.width" :align="column.align" :prop="column.prop">
        <template v-if="column.slotName" slot-scope="scope">
          <el-tooltip effect="dark" :content="String(scope.row[column.prop])" placement="top">
            <span :class="{ 'ellipsis-text': true, 'no-wrap': column.width && column.width !== 'auto' }"
              style="display: block; overflow: hidden;">
              {{ scope.row[column.prop] }}
            </span>
          </el-tooltip>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

2、拖拽标题的模块(需要借助第三方工具 vuedraggable )

2.1 下载 vuedraggable

npm install vuedraggable

2.2 引入 vuedraggable

<script>
import draggable from 'vuedraggable';
export default {
  components: { draggable },
}
</script>

2.3 列标题拖拽模块

<template>
  <div>
    <!-- 列标题拖拽 -->
    <el-dropdown trigger="click" style="margin-bottom: 10px;">
      <el-button size="mini">
        列排序<i class="el-icon-arrow-down el-icon--right"></i>
      </el-button>
      <el-dropdown-menu slot="dropdown">
        <draggable v-model="columnsOrder" tag="div" @end="onColumnDrop($event)">
          <div v-for="column in columnsOrder" :key="column.prop">
            {{ column.label }}
          </div>
        </draggable>
      </el-dropdown-menu>
    </el-dropdown>
  </div>
</template>


3、拖拽的逻辑

  data() {
    return {
      // 表格数据 可以从后端读取,这里仅作为演示
      tableData: [
        { name: "张三", age: "18", address: '河北省石家庄市长安区xxx路xxx小区' },
        { name: "李四", age: "28", address: '北京市朝阳区110号楼110单元110室' }

      ],
      columnsOrder: [],
    }
  },
  methods: {
    // 表格列拖拽
    onColumnDrop(event) {
      const { item, newIndex } = event;
      if (newIndex !== undefined && newIndex !== null && newIndex >= 0 && newIndex < this.columnsOrder.length) {
        localStorage.setItem('ColumnsOrder', JSON.stringify(this.columnsOrder));
      }
    },
  }

这样拖拽以后,会自动将拖拽以后 得到的数据 存储到 localStorage,每次进入页面可以随时调取浏览器的缓存,实现 用户可以自定义列的排列顺序 的偏好设置

localStorage 和 sessionStorage的区别

localStorage 和 sessionStorage 都是Web存储API的一部分,用于在客户端(即用户的浏览器)存储数据。尽管
它们有相似之处,但也存在关键区别:

生命周期:

localStorage: 数据具有持久性,除非用户手动清除浏览器数据或者通过JavaScript调用删除方法,否则数据会一直>存在,即使关闭浏览器或重启电脑。
sessionStorage: 数据仅在当前浏览器窗口或标签页的会话期间有效。一旦用户关闭了浏览器窗口或标签页,数据就>会被清除。刷新页面不会删除sessionStorage中的数据。
作用域:

localStorage: 数据在同源策略下共享,意味着同一域名下的所有页面都可以访问到相同的localStorage数据。
sessionStorage: 同样遵循同源策略,但是它的数据存储是基于每个浏览器窗口或标签页独立的,也就是说,每个窗>口或标签页都有自己的sessionStorage实例,它们之间不共享数据。
存储容量:

两者都受限于浏览器的存储空间限制,通常情况下这个限制大约是5MB,但具体大小可能因浏览器而异。
应用场景:

localStorage 适合存储那些不敏感的、需要长期保留的信息,比如用户偏好设置。
sessionStorage 适用于存储敏感的短期信息,如用户登录状态、临时购物车等,这些信息不需要长期保留,并且在
会话结束后应该被清除。
综上所述,选择使用localStorage还是sessionStorage主要取决于数据的敏感性和持久性需求。

4、进入页面调取浏览器的缓存

  created() {
  //进入页面调用
    this.tableOrderAssignment() 
  },
  methods: {
    tableOrderAssignment() {
      // 获取localStorage中的值
      const columnsOrderExists = localStorage.getItem('entertainColumnsOrder') !== null;
      // 判断是否存在
      // 如果存在,则证明用户设置过 那么直接调取就行
      // 如果没有设置过 ,说明是 首次进入页面,那么就需要我们将默认的展示顺序以及数据给到 用户
      if (!columnsOrderExists) {
        this.columnsOrder = [
          { prop: 'name', label: '姓名', width: '120', align: 'center', slotName: true },
          { prop: 'age', label: '年龄', width: '130', align: 'center', slotName: true },
        ]
      } else {
        this.columnsOrder = JSON.parse(localStorage.getItem('ColumnsOrder'))
      }
    },
  }

5、整体代码

<template>
  <div>
    <!-- 列标题拖拽 -->
    <el-dropdown trigger="click" style="margin-bottom: 10px;">
      <el-button size="mini">
        列排序<i class="el-icon-arrow-down el-icon--right"></i>
      </el-button>
      <el-dropdown-menu slot="dropdown">
        <draggable v-model="columnsOrder" tag="div" @end="onColumnDrop($event)">
          <div v-for="column in columnsOrder" :key="column.prop">
            {{ column.label }}
          </div>
        </draggable>
      </el-dropdown-menu>
    </el-dropdown>
    <!-- 表格 -->
    <el-table :data="tableData" border style="width: 100%">
      <el-table-column type="index" label="序号" width="50" align="center" />
      <el-table-column v-for="(column, index) in columnsOrder" :custom="column.custom" :key="index"
        :label="column.label" :width="column.width" :align="column.align" :prop="column.prop">
        <template v-if="column.slotName" slot-scope="scope">
          <el-tooltip effect="dark" :content="String(scope.row[column.prop])" placement="top">
            <span :class="{ 'ellipsis-text': true, 'no-wrap': column.width && column.width !== 'auto' }"
              style="display: block; overflow: hidden;">
              {{ scope.row[column.prop] }}
            </span>
          </el-tooltip>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
import draggable from 'vuedraggable';
export default {
  components: { draggable },
  data() {
    return {
      // 表格数据 可以从后端读取,这里仅作为演示
      tableData: [
        { name: "张三", age: "18", address: '河北省石家庄市长安区xxx路xxx小区' },
        { name: "李四", age: "28", address: '北京市朝阳区110号楼110单元110室' }
      ],
      columnsOrder: [],
    }
  },
  created() {
    this.tableOrderAssignment()
  },
  methods: {
    // 表格列拖拽
    onColumnDrop(event) {
      const { item, newIndex } = event;
      if (newIndex !== undefined && newIndex !== null && newIndex >= 0 && newIndex < this.columnsOrder.length) {
        localStorage.setItem('entertainColumnsOrder', JSON.stringify(this.columnsOrder));
      }
    },
    tableOrderAssignment() {
      // 获取localStorage中的值
      const columnsOrderExists = localStorage.getItem('entertainColumnsOrder') !== null;
      // 判断是否存在
      // 如果存在,则证明用户设置过 那么直接调取就行
      // 如果没有设置过 ,说明是 首次进入页面,那么就需要我们将默认的展示顺序以及数据给到 用户
      if (!columnsOrderExists) {
        this.columnsOrder = [
          { prop: 'name', label: '姓名', width: '500', align: 'center', slotName: true },
          { prop: 'age', label: '年龄', width: '500', align: 'center', slotName: true },
          { prop: 'address', label: '地址', width: '500', align: 'center', slotName: true },
        ]
      } else {
        this.columnsOrder = JSON.parse(localStorage.getItem('ColumnsOrder'))
      }
    },
  }
}
</script>

<style>
.el-dropdown-menu {
  padding: 10px;
  cursor: pointer;
}
</style>
  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
El-TableElement UI 中的一个表格组件,支持行合并和多选功能。 要实现多选功能,需要在表格中加入 el-table-column 组件,并设置 type 属性为 'selection'。例如: ```html <el-table :data="tableData" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table> ``` 其中,tableData 是一个数组,包含了表格中的数据。handleSelectionChange 是一个方法,用于处理用户选择的数据。 要实现合并,可以使用 el-table-column 中的 rowspan 和 colspan 属性。例如: ```html <el-table :data="tableData"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column label="地址" :rowspan="2"> <el-table-column prop="province" label="省份" :colspan="2"></el-table-column> <el-table-column prop="city" label="市区" :colspan="2"></el-table-column> </el-table-column> </el-table> ``` 在上面的例子中,第三使用了 rowspan 属性,表示该占据了两行。同时,该还包含了两个 el-table-column 组件,每个组件都使用了 colspan 属性,表示该占据了两。 注意,使用 rowspan 和 colspan 属性时,要确保表格数据的结构符合要求,否则可能会出现错位或重叠的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只嘉祺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值