ant-design vue table 可选列、自定义列实现

实现ant-design for vue 自定义列实现。点击按钮,弹窗显示所有列的checkbox,选择checkbox,确定即可实现自定义列。
先上代码

<script>
/**
 * 该组件为实现table可选列。
 * 具体操作见下方注释。
 * 全部集成原a-table功能,使用方式与原a-table完全相同,扩展增加了可选列功能
 * 该组件已注册至全局,使用方式只需将a-table变为zyx-table即可,等等一系列原写法不变,即可增加该功能.
 * 采用rander函数模式写,为了实现a-table中slot可动态。
 */
export default {
  name: 'Table',
  data () {
    return {
      modalVisible: false, // 弹窗
      columns: [], // 表格的列,根据条件来操作该字段
      selectList: [], // 已选择的列
      temporarySelectData: [], // 暂时选择的列,点击checkbox暂存到该字段,点确定同步到selectList
      checkboxList: []// checkbox的list,也做总数据来使用
    }
  },
  mounted () {
    /**
     * 挂载后,将原columns复制到本页columns,checkboxList
     *          将selectList赋值全选状态
     */
    this.columns = this.deepClone(this.$attrs.columns)
    this.checkboxList = this.deepClone(this.$attrs.columns)
    this.selectList = this.columns.map(ele => ele.dataIndex)
  },
  methods: {
    /**
     * 打开modal,将checkbox默认值或者是选择值(暂存)重新赋值
     */
    handelOpenSelect () {
      this.temporarySelectData = this.deepClone(this.selectList)
      this.modalVisible = true
    },
    /**
     * 点击确定,将暂存值赋值(temporarySelectData)给已选择的列(selectList)
     * 将列(columns)根据已选择的列(selectList)筛选出来
     */
    handleOk () {
      this.selectList = this.deepClone(this.temporarySelectData)
      this.modalVisible = false
      this.columns = this.checkboxList.filter(ele => this.selectList.includes(ele.dataIndex))
    },
    handleCancel () {
      this.modalVisible = false
    },
    handelChange (e) {
      this.temporarySelectData = this.deepClone(e)
    },
    deepClone (target) {
      let result
      if (typeof target === 'object') {
        if (Array.isArray(target)) {
          result = []
          for (const i in target) {
            result.push(this.deepClone(target[i]))
          }
        } else if (target === null) {
          result = null
        } else if (target.constructor === RegExp) {
          result = target
        } else {
          result = {}
          for (const i in target) {
            result[i] = this.deepClone(target[i])
          }
        }
      } else {
        result = target
      }
      return result
    }
  },
  render () {
    const props = { ...this.$attrs, ...this.$props, ...{ columns: this.columns } }
    const on = { ...this.$listeners }

    const slots = Object.keys(this.$slots).map(slot => {
      return (
        <template slot={slot}>{ this.$slots[slot] }</template>
      )
    })

    const table = (
      <a-table props={props} scopedSlots={ this.$scopedSlots } on={on} ref="zyxTable">
        {slots}
      </a-table>
    )

    const changeDiv = (
      <a-button class="select-columns" size="small" onClick={this.handelOpenSelect}></a-button>
    )

    const checkboxArr = []
    for (let i = 0; i < this.checkboxList.length; i++) {
      checkboxArr.push(<a-col span={8}><a-checkbox value={this.checkboxList[i].dataIndex}>{this.checkboxList[i].title}</a-checkbox></a-col>)
    }
    const modal = (
      <a-modal
        title="设置列"
        visible={this.modalVisible}
        onOk={this.handleOk}
        onCancel={this.handleCancel}>
        <a-checkbox-group value={this.temporarySelectData} onChange={this.handelChange}>
          <a-row>
            {checkboxArr}
          </a-row>
        </a-checkbox-group>
      </a-modal>
    )

    return (
      <div class="zyx-table">
        { table }
        { changeDiv }
        { modal }
      </div>
    )
  }
}
</script>
<style lang="less" scoped>
.zyx-table{
  position: relative;
  margin-top: 20px;

  .select-columns{
    position: absolute;
    right: 0;
    top: -30px;
  }
}

.ant-row{
  width: 100%;

  .ant-col-8{
    margin-bottom: 10px;
  }
}

.ant-checkbox-group{
  width: 100%;
}
</style>

该组件二次封装了a-table,集成原a-table所有方法
使用方法,在全局注册该组件,将原a-table替换为zyx-table即可实现。
将原标签替换为rander函数,是为了实现slot动态传入的效果。
有疑问或者更好的建议,欢迎光临思密达。github传送门

### 回答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组件支持拖拽,可以使用户根据自身需求自由排序table中的Ant Design Vuetable组件可以通过对象属性的方式自定义table,其中包括每一数据源、表头、宽度等属性。在这些属性中,index属性会在表头中显示的序号,同时也可以用作table的排序。 拖拽实现可以通过拖拽事件来实现。拖拽事件包括dragstart、dragover、drop和dragend四种事件。其中dragstart事件在拖动元素时触发,可以在事件中将当前的index属性传递给被拖动元素;dragover事件在拖动元素进入目标元素时触发,可以在事件中获取目标的index属性,并用作当前和目标的交换;drop事件在拖动元素松开鼠标时触发,可以在事件中触发交换的逻辑;dragend事件在拖动元素结束时触发,可以在事件中清空拖动元素的状态。 在实现拖拽的过程中,还需要考虑数据的绑定。拖拽并不会改变table数据源,因此需要手动更新数据源中每一的index属性。同时,在交换的时候,需要考虑表头和单元格中数据的同步更新。 总的来说,Ant Design Vuetable组件拖拽实现相对简单,可以通过拖拽事件和数据源的操作来实现。在用户体验上,拖拽可以大大提高用户对table的操作效率,同时也增加了table的交互性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值