vue+element-ui 封装列设置组件(附代码)

1、实现功能

(1)自定义固定位置:固定在列首、固定在列尾、不固定

(2)灵活控制列的显示和隐藏

(3)重置

2、思路

数据传递

父组件传递给子组件的的数据:全部的列数据

子组件传递给父组件的数据:选中需要展示且确定固定位置的列数据——checkedColumns

处理列数据

(1)将所有的列数据存储到固定列首、固定列尾和不固定列表,初始化的时候除了操作列,其他都默认是固定

(2)分别遍历这三个列表

(3)全选的实现:初始化为全选,全选按钮改变更改checkedColumns的值,传递给父组件

(4)选中or not的实现:element-ui的组件的change事件会返回选中的列表,将这个列表赋值给checkedColumns 传递给父组件

(5)固定更改:从另外的两个列表中删除更改的列数据,添加到目标列表

(6)解决问题:列的顺序会改变:遍历的列表要进行处理,通过computed,进行排序(这里的列数据要带index属性,来确定它的顺序)

3、代码实现

<template>
  <div class="container">
    <el-dropdown  trigger="click" :hide-on-click="false">
      <span >列设置<i class="el-icon-arrow-down el-icon--right"></i></span>
      <el-dropdown-menu slot="dropdown" style="overflow-y:scroll;max-height:310px">
        
        <el-dropdown-item  class="bottom-line">
          <el-checkbox  
            v-model="isCheckAll"
            @change="checkAllChange">
            全部展示
          </el-checkbox>
        </el-dropdown-item>

        <el-dropdown-item>
          <div 
            @click="reset" 
            style="color: rgb(32, 104, 171);margin-left: 20px;">
            重置
          </div>
        </el-dropdown-item>
        
        <span v-if="leftFixed.length>0">固定列首</span>
        <el-dropdown-item v-for="column in leftFixed" :key="column.index" class="itemSelection">
          <el-checkbox-group v-model="checkedColumns" @change="checkedColumnsChange">
            <el-checkbox :label="column" class="column">{{column.label}}</el-checkbox>
          </el-checkbox-group>
          <div class="itemSelection">
            <div @click.stop="toNoFixed(column)"> 不固定 | </div>
            <div @click.stop="toRightFixed(column)">| 固定在列尾</div>
          </div>
        </el-dropdown-item>

        <span v-if="noFixed.length>0">不固定</span>
        <el-dropdown-item v-for="column in noFixed" :key="column.index" class="itemSelection">
          <el-checkbox-group v-model="checkedColumns" @change="checkedColumnsChange">
            <el-checkbox :label="column" class="column">{{column.label}}</el-checkbox>
          </el-checkbox-group>
          <div class="itemSelection">
            <div @click.stop="toLeftFixed(column)"> 固定在列首 | </div>
            <div @click.stop="toRightFixed(column)">| 固定在列尾</div>
          </div>
        </el-dropdown-item>

        <span v-if="rightFixed.length>0">固定列尾</span>
        <el-dropdown-item v-for="column in rightFixed" :key="column.index" class="itemSelection">
          <el-checkbox-group v-model="checkedColumns" @change="checkedColumnsChange">
            <el-checkbox :label="column" class="column">{{column.label}}</el-checkbox>
          </el-checkbox-group>
          <div class="itemSelection">
            <div @click.stop="toLeftFixed(column)">| 固定在列首</div>
            <div @click.stop="toNoFixed(column)"> 不固定 | </div>
          </div>
        </el-dropdown-item>
      </el-dropdown-menu>
    </el-dropdown>
  </div>
</template>

<script>
  export default {
    props:{
      columns:{
          type:Array,
          default:[]
      },

    },

  data(){
    return{
      isCheckAll:true, //全选
      leftFixedList:[],   //固定首列
      noFixedList:[],  //不固定
      rightFixedList:[],    //固定尾列
      checkedColumns:[]
    }
  },

    mounted() {
      this.initSetting()
    },

    // 重新排序
  computed: {
    leftFixed() {
      return this.leftFixedList.slice().sort((a, b) => a.index - b.index);
      
    },
    noFixed() {
      return this.noFixedList.slice().sort((a, b) => a.index - b.index);
    },
    rightFixed() {
      return this.rightFixedList.slice().sort((a, b) => a.index - b.index);
    }
  },

  methods: {
    // 初始化
    initSetting(){
      // 第一次加载,除了操作都是不固定的状态
      this.noFixedList = this.columns.filter(item => item.prop !== 'operations')
      this.rightFixedList = this.columns.filter(item => item.prop === 'operations')
      
      // 第一次为全选状态
      this.checkAllChange(this.isCheckAll)
    },

    // 列显示——全选
    checkAllChange(isCheckAll){
      this.checkedColumns=isCheckAll ? this.columns:[];
      this.$emit('change-checked',this.checkedColumns)
      
    },

    // 选中列
    checkedColumnsChange(checkedColumns){
      this.checkedColumns=checkedColumns;
      this.isCheckAll = this.checkedColumns.length=== this.columns.length;
      this.$emit('change-checked',this.checkedColumns)
    },

    // 固定首列
    toLeftFixed(val){
      this.$set(val, 'fixed', 'left');
      this.noFixedList = this.noFixedList.filter(item=>item !== val);
      this.rightFixedList = this.rightFixedList.filter(item => item !== val);
      this.leftFixedList.push(val)
    },
    // 固定尾列
    toRightFixed(val){
      this.$set(val, 'fixed', 'right');
      val.fixed="right"
      this.noFixedList = this.noFixedList.filter(item=>item !== val);
      this.leftFixedList = this.leftFixedList.filter(item=>item !== val);
      this.rightFixedList.push(val)
    },
    // 不固定
    toNoFixed(val){
      this.$delete(val, 'fixed');
      this.leftFixedList= this.leftFixedList.filter(item=>item !== val);
      this.rightFixedList = this.rightFixedList.filter(item => item !== val);
      this.noFixedList.push(val)
    },

    // 重置
    reset(){
      for (let i = 0; i < this.rightFixedList.length; i++) {
        const item = this.rightFixedList[i];
        if (item.prop === "operations") {
          this.$set(item,'fixed','right')
        }
        else{
          this.$delete(item, 'fixed');
        }
      }
      for (let i = 0; i < this.leftFixedList.length; i++) {
        const item = this.leftFixedList[i];
        if (item.prop === "operations") {
          this.$set(item,'fixed','right')
        }
        else{
          this.$delete(item, 'fixed');
        }
      }
      // 第一次加载,除了操作都是不固定的状态
      this.noFixedList = this.columns.filter(item => item.prop !== 'operations')
      this.rightFixedList = this.columns.filter(item => item.prop == 'operations')
      this.leftFixedList=[]
      // 第一次为全选状态
      this.isCheckAll=true
      this.checkAllChange(this.isCheckAll)
      },
  }
}; 
</script>

 实现固定:

<el-table-column
    :fixed="item.fixed"
>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值