vue+iview 动态调整Table的列顺序

需求:因table列太多,且每个部门关注的信息不一样,拖来拖去不方便观看,客户想让Table列可以拖动,且可以保存顺序。

但是搞动态拖动太难了,我不会,于是改为操作columns数据

思路:

<Table :columns="columns" :data="data1"></Table>

Table里的columns是提前在data里写好的,可以把columns对象转成json字符串存在localStorage或者数据库里,vue开始渲染页面前修改columns的值(vue生命周期),然后再进行渲染,

客户在调整完毕后,重新渲染一下Table组件

我这里是另外写一个弹窗页modal,操作主页table的列顺序

 

这部分代码是主页代码,只展示了table部分,弹窗页代码在下面

orderOK方法是弹窗页完成后执行,逻辑是给columns赋值,然后改变table的key,使table重新渲染

beforeMount方法是vue生命周期,具体我也忘了,大概应该是vue编译代码生成html之前运行,读取localStorage,没有就存一个,有就用有的。

这里我只允许调整第二列以后的顺序,所以看到 i=2 不要疑惑,业务需要

data () {
    return {
      tabKey: 0,
      tableData: [],
      columns:[
        {title: 'Name', key: 'name'},
        {title: 'Age',key: 'age'}
      ]
    }
}
 <Table :key="tabKey" :data="tableData" :columns="columns"> </Table>
methods: {
 orderOk () {
      let col = JSON.parse(window.localStorage.getItem("VoyageCol"))
      for (var i = 2; i < col.length; i++) {
        this.columns[i] = col[i]
      }
      this.tabKey += 1
      this.$Message.success('调整成功')
    },
beforeMount () {
    if (window.localStorage.getItem("VoyageCol") == null) {
      window.localStorage.setItem("VoyageCol", JSON.stringify(this.columns));
    } else {
      let col = JSON.parse(window.localStorage.getItem("VoyageCol"))
      for (var i = 2; i < col.length; i++) {//只调整第二列以后的列
        this.columns[i] = col[i]
      }
    }
  }
}

 

新增一个button按钮,点击出现一个弹窗modal,里面一个table,把columns传进去当做table的data

这部分代码是弹窗页代码,主要是读取localStorage给他的table当数据进行操作,排序完以后点确定再存进去,然后调用主页orderOK方法刷新主页table

//本来想自己做按钮实现上移下移,发现iview框架的Table自带draggable属性,可以实现行的上下拖动,省了无数代码

<Modal v-model="modal" title="调整列名顺序" @on-ok="orderOk">
    <Table draggable :columns="columns" :data="orderData" height="460" @on-drag-drop="onDragDrop"></Table>
  </Modal>
methods: {
    orderOk () {
      window.localStorage.setItem("VoyageCol", JSON.stringify(this.orderData));
      this.$emit('orderOk')
    },
    onDragDrop (first, end) {
      //转成int型,方便后续使用
      first = parseInt(first)
      end = parseInt(end)
      if (first <= 1 || end <= 1) {
        this.$Message.warning('前两列禁止移动')
      } else {
        let tmp = this.orderData[first]

        if (first < end) {
          for (var i = first + 1; i <= end; i++) {
            this.orderData.splice(i - 1, 1, this.orderData[i])
          }
          this.orderData.splice(end, 1, tmp)
        }

        if (first > end) {
          for (var i = first; i > end; i--) {
            this.orderData.splice(i, 1, this.orderData[i - 1])
          }
          this.orderData.splice(end, 1, tmp)
        }
      }
    }
  },
  mounted () {
    this.orderData = JSON.parse(window.localStorage.getItem("VoyageCol"))
  }
}

 

样式如下:

 

posted @ 2020-11-11 17:26  戈凹高  阅读(3835)  评论(0编辑  收藏  举报