el-tabel进行拖拽排序和点击显示隐藏

该文章展示了一个使用Vue.js封装的组件,该组件实现了表格列的拖拽排序功能。组件通过vuedraggable库实现拖放行为,并通过props接收外部数据,排序后通过$emit将新顺序回传给父组件更新表格显示。
摘要由CSDN通过智能技术生成

封装完成的组件代码 

<template>
  <div>
    <el-popover
      placement="right-start"
      width="150"
      trigger="hover">
      <el-tooltip class="item" content="上下拖动字段进行排序" placement="left" effect="light">
        <draggable v-model="sortModel"
                   class="table-column-sorter" chosenClass="is-chosen" animation="true"
                   @change="handleTableColumnSort"
        >
          <el-checkbox  v-model="column.isShow"  v-for="column in sortModel" :key="column.name"
                        class="sortable-column">
            <div style="display: flex;align-items: center;justify-content:space-between;width: 100%">
              <span style="margin: 5px 0">{{ column.name }}</span>
              <i class="el-icon-sort" style="cursor: move;text-align: right"></i>
            </div>
          </el-checkbox>
        </draggable>
      </el-tooltip>
      <i class="el-icon-s-unfold" style="color: #198cff" slot="reference"></i>
    </el-popover>
  </div>
</template>

<script>
import draggable from "vuedraggable"
export default {
  name: "PackageSortElement",
  components:{
    draggable,
  } ,
  props:{
    //接收调用组件者传参数    :AllParameters="sortModel"   sortModel是组件中自己定义的排序顺序
    //用AllParameters去接收
    AllParameters:{
      type: Array,
    }
  },
  data(){
    return{
      //接收到的数据传入 拖拽组件中进行排序
      sortModel:this.AllParameters
    }
  },
  methods:{
    handleTableColumnSort() {
      //当我们进行拖动的时候去调用 组件的change事件进行传参    this.sortModel是排序完成之后的顺序,拿到并且在原页面进行赋值
      this.$emit("change", this.sortModel)
    },
  }
}
</script>

<style lang="scss" scoped>
.table-column-sorter {
  position: relative;

  ::v-deep .el-checkbox__label {
    width: 88%;
  }

  .title-tooltip {
    position: absolute;
    left: -150px;
    top: 50%;
  }

  ::v-deep .el-checkbox {
    width: 100%;
  }

  .sortable-column {
    padding: 3px;
    color: #aaaaaa;
    cursor: pointer;
  }

  .sortable-column:hover {
    background: #cbedfc;
    padding: 3px;
  }
}

.el-icon-s-unfold {
  cursor: pointer;
  position: absolute;
  z-index: 998;
  right: 32.5px;
  top: 9px;
  height: 12px;
}

</style>




引用组件
import PackageSortElement from "../components/PackageSortElement";

 <PackageSortElement :AllParameters="sortModel"   @change="SortList"></PackageSortElement>

sortModel:原页面自己的顺序排序

引用组件代码 

  <div class="cancellation-ticket-content-table">
      <PackageSortElement :AllParameters="sortModel"  @change="SortList"></PackageSortElement>
      <template>
        <el-table
          ref="inputListTable"
// tableData后端传过来的数据
          :data="tableData"
          stripe
          tooltip-effect="dark"
          @selection-change="invoiceSelection"
          v-el-table-height-adaptive height="200px"
          border
          :key="key"
        >
          <el-table-column type="selection"/>
          <el-table-column type="index" label="序号" width="50">
            <template slot-scope="scope">{{ scope.$index + 1 }}</template>
          </el-table-column>
//遍历数组顺序
          <template v-for="(data,index) in sortModel">
            <el-table-column :label="data.name"
                             :key="index"
                             v-if="data.isShow"
                             :min-width="data.width"
                             :show-tooltip-when-overflow="data.isShow">
              <template v-slot="{row}">
                <div v-if="data.name === '香肠'"> {{ row.xc}}</div>
          
                <div v-else-if="data.name === '号码'"> {{ row.hm}}</div>
               
               <div v-else-if="data.name === '代码'"> {{ row.dm}}</div>

                <div v-else-if="data.name === '状态'"> {{ row.zt}}</div>
                <div v-else-if="data.name === '手机号'"> {{ row.sjh}}</div>
              </template>
            </el-table-column>
          </template>
          <el-table-column label="" width="90"   fixed="right">
          </el-table-column>
        </el-table>
      </template>
    </div>


date(){
  return{
//自己定义的顺序,
     sortModel: [
        {
          name: '香肠,
          isShow: true
        },
        {
          name: '号码',
          isShow: true
        },
        {
          name: '代码',
          isShow: true
        },
        {
          name: '状态',
          isShow: true
        },
        {
          name: '手机号',
          isShow: true
        },
      ],
}
}


//事件  拿到从组件内部处理的数据顺序并赋值
   SortList(value){
      this.sortModel = value;
    },

 :AllParameters="sortModel"   ,根据 :AllParameters将sortModel传到封装的组件内

封装组件内部根据  this.$emit("change", this.sortModel)  @change="SortList"事件 将处理好的数据传到原页面  


然后进行接收替换:

SortList(value){
      this.sortModel = value;
    },
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
el-table是Element UI框架中的一个表格组件,可以用来展示数据。如果需要实现拖拽排序,可以使用el-table内置的sortable属性和drag-sorting事件。 sortable属性可以让表格的行拥有拖拽排序的能力,使用方法如下: ```html <el-table :data="tableData" :sortable="true"> <!-- 表格 --> </el-table> ``` drag-sorting事件可以监听行拖拽时的变化,使用方法如下: ```html <el-table :data="tableData" :sortable="true" @drag-sorting="handleDragSort"> <!-- 表格 --> </el-table> ``` 在事件处理函数中,可以通过参数获取拖拽前和拖拽后的行的数据,然后进行排序操作: ```javascript methods: { handleDragSort(from, to) { const movedData = this.tableData.splice(from, 1)[0]; this.tableData.splice(to, 0, movedData); } } ``` 以上代码中,我们首先通过splice方法将拖拽前的行数据移除,然后再通过splice方法将该行数据插入到拖拽后的位置。 完整的代码示例: ```html <template> <el-table :data="tableData" :sortable="true" @drag-sorting="handleDragSort"> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="age" label="Age"></el-table-column> <el-table-column prop="gender" label="Gender"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: 'John', age: 20, gender: 'Male' }, { name: 'Mary', age: 25, gender: 'Female' }, { name: 'Tom', age: 18, gender: 'Male' }, ] } }, methods: { handleDragSort(from, to) { const movedData = this.tableData.splice(from, 1)[0]; this.tableData.splice(to, 0, movedData); } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值