ant-design-vue-pro的table动态列的显示和隐藏

1 . 需求:

  • 用户可以动态的选择行和列。

上图(已经实现了的效果):
图1:在这里插入图片描述
图2:
在这里插入图片描述

2 . 基本思路:

大家知道行的选择可以说非常简单,但是列的选择,ant-design-vue中没有集成很好的组件,但是ant-design-proTable中集成了这种组件:https://procomponents.ant.design/components/table/ 有兴趣可以看看。

我的大致思路:是把columns动态渲染到表格上单,用户触发checkbox相应的watch会监听到,修改columns中的数据,重新渲染。

3.上代码:

<template>
  <a-card :bordered="false">

    <div class="filter-container">
      <a-checkbox-group v-model="checkboxVal">
        <a-checkbox value="name">
          name
        </a-checkbox>
        <a-checkbox value="age">
          age
        </a-checkbox>
        <a-checkbox value="address">
          address
        </a-checkbox>
      </a-checkbox-group>
    </div>
    <a-divider dashed />
    <a-table
      ref="table"
      size="middle"
      bordered
      rowKey="id"
      :columns="columns"
      :dataSource="dataSource"
      :pagination="ipagination"
      :loading="loading"
      :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
      @change="handleTableChange">

    </a-table>
  </a-card>
</template>
<script>
  const defaultFormThead = ['name', 'age']
  /*const columns = [
    {
      title: 'Name',
      dataIndex: 'name',
    },
    {
      title: 'Age',
      dataIndex: 'age',
    },
    {
      title: 'Address',
      dataIndex: 'address',
    },
  ];*/

  const data = [];
  for (let i = 0; i < 46; i++) {
    data.push({
      key: i,
      name: `Edward King ${i}`,
      age: 32,
      address: `London, Park Lane no. ${i}`,
    });
  }
  export default {
    data() {
      return {
        checkboxVal:defaultFormThead,
        formThead: defaultFormThead, // 默认表头 Default header
        key: 1, // table key
        formTheadOptions: ['name', 'age', 'address'],
        columns:[],
        queryParam: {},
        dataSource : data,
        ipagination:{
          current: 1,
          pageSize: 10,
          pageSizeOptions: ['10', '20', '30'],
          showTotal: (total, range) => {
            return range[0] + "-" + range[1] + " 共" + total + "条"
          },
          showQuickJumper: true,
          showSizeChanger: true,
          total: 0
        },
        /* table加载状态 */
        loading:false,
        /* table选中keys*/
        selectedRowKeys: [],
        /* table选中records*/
        selectionRows: [],
        isorter:{
          column: 'createTime',
          order: 'desc',
        },
      };
    },
    watch: {
      //监听用户点击上方的复选框
      checkboxVal(valArr) {
        console.log(valArr);
        this.formThead = this.formTheadOptions.filter(i => valArr.indexOf(i) >= 0)
        this.key = this.key + 1// 为了保证table 每次都会重渲 In order to ensure the table will be re-rendered each time
        this.createColumns();
      }
    },
    created() {
      this.createColumns();
    },
    methods:{
      createColumns(){
        this.columns = [];
        this.formThead.map((val,key)=>{
          let obj = {
              key:key,
              title: val,
              dataIndex: val,
          };
          this.columns.push(obj);
        })
      },
      loadData(arg) {
      },
      onSelectChange(selectedRowKeys, selectionRows) {
        this.selectedRowKeys = selectedRowKeys;
        this.selectionRows = selectionRows;
      },
      handleTableChange(pagination, filters, sorter) {
        //分页、排序、筛选变化时触发
        //TODO 筛选
        if (Object.keys(sorter).length > 0) {
          this.isorter.column = sorter.field;
          this.isorter.order = "ascend" == sorter.order ? "asc" : "desc"
        }
        this.ipagination = pagination;
        this.loadData();
      },
    },
  }
</script>
<style scoped>

</style>

复制到一个空的.vue文件可直接使用。前提是安装的 ant-design-vue 依赖。

完结。
有什么错误,希望大佬指出。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: Ant Design Vue 的表格组件支持拖拽的功能。具体实现方法可以参考官方文档的示例代码。在表格组件,可以通过设置 `drag-and-drop` 属性为 `true` 来开启拖拽的功能。同时,还需要设置 `columns` 属性为一个数组,数组的每个元素表示一的配置信息,包括的标题、数据字段、宽度等。在拖拽时,可以通过监听 `onColumnDragEnd` 事件来获取拖拽后的的顺序信息,然后根据顺序信息重新渲染表格。 ### 回答2: ant-design-vue table是一个基于Vue框架构建的图形用户界面组件库,其table组件提供了丰富的功能,其包括拖拽。下面我们来详细介绍一下如何实现ant-design-vue table的拖拽功能。 首先,我们需要在table组件的配置增加一个属性:columnsResizable,将其设置为true,该属性作用是启用宽调整的功能。然后,我们需要在table组件的html增加一个slot,定义头的内容,方便后续处理拖拽事件。关于slot的具体用法请自行查阅官方文档。 接下来,我们需要通过样式将table设置为可拖拽的状态。可以通过设置th元素的cursor属性为col-resize来实现,同时为th元素绑定mousedown事件,当用户拖拽头时,就可以触发该事件,然后调用对应的处理函数。 在处理函数,我们需要先获取当前头所在的位置,然后记录下鼠标的初始位置。接着监听mousemove事件,当鼠标移动时,计算出当前头的目标宽度,并通过css样式设置头的宽度,同时更新对应的宽度。最后,当鼠标松开时,释放事件监听。 除此之外,我们还需要注意一些细节问题,例如拖拽时保持整个table的宽度不变,下一的位置和宽度需要同步调整等。这些都需要我们在代码仔细处理,以避免出现意外的问题。 总之,通过以上步骤,我们就可以成功实现ant-design-vue table的拖拽功能了。当然,具体实现方式可能因人而异,这里只是提供一种参考思路,希望对大家有所帮助。 ### 回答3: Ant Design Vue是一款基于Vue的企业级UI库,它提供了丰富的组件和样式,可以直接应用于业务。其table组件支持拖拽,可以使用户根据自身需求自由排序tableAnt Design Vuetable组件可以通过对象属性的方式自定义table,其包括每一的数据源、表头、宽度等属性。在这些属性,index属性会在表头显示的序号,同时也可以用作table的排序。 拖拽的实现可以通过拖拽事件来实现。拖拽事件包括dragstart、dragover、drop和dragend四种事件。其dragstart事件在拖动元素时触发,可以在事件将当前的index属性传递给被拖动元素;dragover事件在拖动元素进入目标元素时触发,可以在事件获取目标的index属性,并用作当前和目标的交换;drop事件在拖动元素松开鼠标时触发,可以在事件触发交换的逻辑;dragend事件在拖动元素结束时触发,可以在事件清空拖动元素的状态。 在实现拖拽的过程,还需要考虑数据的绑定。拖拽并不会改变table的数据源,因此需要手动更新数据源每一的index属性。同时,在交换的时候,需要考虑表头和单元格数据的同步更新。 总的来说,Ant Design Vuetable组件拖拽的实现相对简单,可以通过拖拽事件和数据源的操作来实现。在用户体验上,拖拽可以大大提高用户对table的操作效率,同时也增加了table的交互性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值