vue3 ts 使用vuedraggable动态设置el-table列的显示与隐藏并且可以随意拖地排序(element-plus )

1、此功能已集成到TTable组件中

2、最终效果(基于element-plus 的 el-table组件)

在这里插入图片描述

TTable组件使用(只需要设置两个参数)

columnSetting // 是否显示列设置按钮
name="TtableColumnSet" // 区分储存本地表头数据(保证其唯一性)

具体代码如下

<template>
  <el-dropdown trigger="click">
    <el-button icon="Setting" size="default">列设置</el-button>
    <template #dropdown>
      <el-dropdown-menu>
        <el-dropdown-item>
          <span class="title">列设置</span>
          <Draggable class="t_table_column_setting_dropdown" v-model="state.columnSet" item-key="prop">
            <template #item="{element,index}">
              <el-checkbox :checked="!element.hidden" @click.native.stop :disabled="element.checkBoxDisabled"
                @change="checked => checkChanged(checked, index)">
                {{element.label}}
              </el-checkbox>
            </template>
          </Draggable>
        </el-dropdown-item>
      </el-dropdown-menu>
    </template>
  </el-dropdown>
</template>
<script lang="ts">
export default {
  name: 'ColumnSet'
}
</script>
<script setup lang="ts">
import Draggable from 'vuedraggable'
import { watch, onMounted, reactive } from 'vue'
const props = defineProps({
  columns: {
    type: Array,
    default: () => []
  },
  title: {
    type: String,
    default: ''
  },
  name: {
    type: String,
    default: ''
  }
})
// 初始化
const initColumnSet = () => {
  const columnSet = props.columns.map((col: any, index) => ({
    label: col.label,
    prop: col.prop,
    hidden: false,
    checkBoxDisabled: false
  }))
  return columnSet
}
// 获取缓存数据
const getColumnSetCache = () => {
  const value = localStorage.getItem(`t-ui-plus:TTable.columnSet-${props.name || props.title}`)
  return value ? JSON.parse(value) : initColumnSet()
}
// 抛出事件
const emits = defineEmits(['columnSetting'])
const state: any = reactive({
  columnSet: []
})
onMounted(() => {
  state.columnSet = getColumnSetCache()
  // console.log('onMounted', state.columnSet)
  emits('columnSetting', state.columnSet)
})
watch(
  () => state.columnSet,
  (val) => {
    emits('columnSetting', val)
    // console.log(3333, val)
    localStorage.setItem(`t-ui-plus:TTable.columnSet-${props.name || props.title}`, JSON.stringify(val))
  },
  { deep: true }
)
// checkbox改变选中状态
const checkChanged = (checked, index) => {
  state.columnSet[index].hidden = !checked
  let obj: any = {}
  state.columnSet.map(val => {
    val.hidden in obj || (obj[val.hidden] = [])
    obj[val.hidden].push(val.hidden)
  })
  if (obj.false.length < 2) {
    state.columnSet.map((val, key) => {
      if (!val.hidden) {
        state.columnSet[key].checkBoxDisabled = true
      }
    })
  } else {
    state.columnSet.map((val, key) => {
      if (!val.hidden) {
        state.columnSet[key].checkBoxDisabled = false
      }
    })
  }
}

</script>
<style lang="scss">
.el-dropdown-menu {
  padding: 10px;
  font-size: 14px;
  .el-dropdown-menu__item {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    .title {
      font-weight: bold;
      margin-bottom: 5px;
    }
    .t_table_column_setting_dropdown {
      display: flex;
      flex-direction: column;
      max-height: 300px;
      overflow-y: auto;
      .el-checkbox {
        .el-checkbox__input.is-checked+.el-checkbox__label {
          color: #262626;
        }
      }
    }
  }
}
</style>

注意点

vue2 的实现可以查看这篇

vue3使用需要下载最新版本(官方使用示例)

 npm i -S vuedraggable@next  
 & 
 yarn add vuedraggable@next

组件地址

gitHub组件地址

gitee码云组件地址

相关文章

基于ElementUi再次封装基础组件文档

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue3 TS环境下,使用Element Plus的el-table组件实现插入行可以按照以下步骤进行: 1. 安装Element Plus和Vue3: ``` npm install element-plus vue@next ``` 2. 在Vue3组件中引入el-table组件,并定义表格数据和: ```vue <template> <el-table :data="tableData" :columns="tableColumns" :row-key="id" > </el-table> </template> <script lang="ts"> import { defineComponent } from 'vue'; import { ElTable, ElTableColumn } from 'element-plus'; import 'element-plus/lib/theme-chalk/index.css'; export default defineComponent({ components: { ElTable, ElTableColumn, }, data() { return { tableData: [ { id: 1, name: '张三', age: 18 }, { id: 2, name: '李四', age: 20 }, { id: 3, name: '王五', age: 22 }, ], tableColumns: [ { label: 'ID', prop: 'id' }, { label: '姓名', prop: 'name' }, { label: '年龄', prop: 'age' }, ], }; }, }); </script> ``` 3. 在表格中添加一个按钮,用于插入新行: ```vue <template> <el-table :data="tableData" :columns="tableColumns" :row-key="id" > <template #append> <el-button type="primary" @click="addRow">添加行</el-button> </template> </el-table> </template> <script lang="ts"> import { defineComponent } from 'vue'; import { ElTable, ElTableColumn, ElButton } from 'element-plus'; import 'element-plus/lib/theme-chalk/index.css'; export default defineComponent({ components: { ElTable, ElTableColumn, ElButton, }, data() { return { tableData: [ { id: 1, name: '张三', age: 18 }, { id: 2, name: '李四', age: 20 }, { id: 3, name: '王五', age: 22 }, ], tableColumns: [ { label: 'ID', prop: 'id' }, { label: '姓名', prop: 'name' }, { label: '年龄', prop: 'age' }, ], }; }, methods: { addRow() { const newRow = { id: 4, name: '赵六', age: 24 }; this.tableData.push(newRow); }, }, }); </script> ``` 4. 点击“添加行”按钮,即可将新行添加到表格的末尾。 上述代码中,我们在el-table组件内部添加了一个template标签,用于渲染“添加行”按钮。该按钮使用Element Plus的el-button组件,并绑定了一个点击事件addRow。在addRow方法中,我们创建了一个新的行数据newRow,并使用数组的push方法将其添加到tableData数组中。由于tableData是响应式的,因此添加新行后,表格会自动更新。 需要注意的是,我们在el-table组件上添加了一个#append的插槽,该插槽用于渲染在表格底部的操作栏。在操作栏中,我们可以添加按钮、分页器等操作组件,以实现更多的交互效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wocwin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值