首页 > 其他分享 >vue iview table实现动态自定义表头

vue iview table实现动态自定义表头

时间:2023-04-10 17:22:31浏览次数:33  
标签:checkAll vue false 自定义 表头 item key checkAllGroup true

一、前言

众所周知,iview中有一个表格组件Table,用于展示多条结构类似的数据。之前遇到过一个需求,要手动控制table的表头显示。就是假如table表格一共有10列数据,可以通过设置勾选,决定显示多少列

二、代码

为了代码的复用性,将配置页面单独抽成了组件,所以代码中会有组件之间传值
父组件(表格页面)

<template>
  <div>
    <!-- 渲染table表格 -->
    <TableComponent :allColList='allColList' :tableData='tableData' :defaultCheckList='defaultCheckList' @confirm="handleConfirm"></TableComponent>
  </div>
</template>

<script>
import TableComponent from '@/components/TableComponent.vue'
export default {
  name:'tableShow',
  components:{
    TableComponent
  },
  data(){
    return {
      // 所有表格列
      allColList: [
        {
          type: "selection",
          key: "selection",
          width: 60,
          align: "center",
        },
        {
          title: "入口ID",
          key: "enterId",
          minWidth: 120,
          align: "center",
          tooptip: true,
        },
        {
          title: "渠道",
          key: "channel",
          minWidth: 120,
          align: "center",
        },
        {
          title: "品牌",
          key: "brand",
          minWidth: 120,
          align: "center",
        },
        {
          title: "入口名",
          key: "enterName",
          minWidth: 120,
          align: "center",
          tooptip: true,
        },
        {
          title: "状态",
          key: "status",
          minWidth: 120,
          align: "center",
        },
        {
          title: "更新人",
          key: "updatedBy",
          minWidth: 120,
          align: "center",
        },
      ],
      //默认列
      defaultCheckList:["enterId","channel","enterName"],
      tableData: [
        {
          enterId: "1234wert",
          channel: "手机",
          brand: "小米",
          enterName: "个性化视频专辑",
          status: "上线",
          updatedBy: "admin",
        },
      ],
    }
  },
  methods:{
    // 提交确定事件 实际工作中会调接口
    handleConfirm(val) {
      this.defaultCheckList = val;
    },
  }
}
</script>

子组件(配置页面)

<template>
  <div>
    <div class="dropdown">
      <Dropdown trigger="custom" placement="bottom-end" :visible="visible">
        <a href="javascript:void(0)" @click="handleOpen">
          自定义Table列
          <Icon type="ios-arrow-down"></Icon>
        </a>
        <DropdownMenu slot="list" style="width: 240px">
          <div style="padding: 10px 15px;">
            <div style="border-bottom: 1px solid #e9e9e9;padding-bottom:6px;margin-bottom:6px;">
              <Checkbox
                :indeterminate="indeterminate"
                :value="checkAll"
                @click.prevent.native="handleCheckAll"
              >全选</Checkbox>
            </div>
            <CheckboxGroup
              v-model="checkAllGroup"
              @on-change="checkAllGroupChange"
            >
              <Checkbox v-for="item in allCheckList" :key='item.key' :label="item.key">{{item.title}}</Checkbox>
            </CheckboxGroup>
          </div>
          <div class="btnGroup">
            <Button type="primary" @click="confirm" :disabled="checkAllGroup.length < 1">确认</Button>
            <Button @click="handleClose">关闭</Button>
          </div>
        </DropdownMenu>
      </Dropdown>
    </div>
    <Table ref="table" border :columns="showColList" :data="tableData"> </Table>
  </div>
</template>

<script>
export default {
  name: "tableComponent",
  data() {
    return {
      //实际显示的表格列
      showColList: [],
      //是否显示配置弹出窗
      visible: false,
      indeterminate: true,
      checkAll: false,
      // 选中表格列
      checkAllGroup: [],
      //所有供选择的项
      allCheckList:[],
      // 默认显示的列
      defaultColCheckList: [],
    };
  },
  props:{
    //所有table列
    allColList:{   
      type:Array,
      require:true
    },
    //table数据
    tableData:{   
      type:Array,
      default:() => []
    },
    //默认被选择的项
    defaultCheckList:{
      type:Array,
      default:() => []
    }
  },
  computed: {},
  created(){
    console.log('我是生命钩子函数created');
    this.init();
  },
  watch:{
    defaultCheckList(newValue, oldValue){
      console.log('我是监听器函数checkList');
      console.log(newValue)
      console.log(oldValue)
      this.init();
    }
  },
  methods: {
    init(){
      console.log('我是初始化方法init');
      this.allCheckList = this.allColList.filter(item => {
        if(!item.type){
          return item
        }
      })
      if(this.defaultCheckList.length > 0){
        this.defaultColCheckList = this.defaultCheckList;
      }else{
        this.defaultColCheckList = this.allCheckList.map(item => {
          return item.key
        })
      }
      this.dealTableColumn(this.defaultColCheckList);
    },
    /**
     * 重新渲染table表格
     */ 
    dealTableColumn(arr) {
      this.showColList = [];
      this.allColList.forEach((item) => {
        if (arr.indexOf(item.key) > -1) {
          this.showColList.push(item);
        }
      });
    },
    /**
     * 显示配置弹窗
    */
    handleOpen() {
      this.visible = true;
      this.checkAllGroup = this.defaultColCheckList;
      if(this.checkAllGroup.length == this.allCheckList.length){
        this.indeterminate = false;
        this.checkAll = true;
      }
    },
    /**
     * 隐藏配置弹窗
    */
    handleClose() {
      this.visible = false;
      this.checkAllGroup = [];
    },
    /**
     * 全选时处理逻辑
    */
    handleCheckAll() {
      if (this.indeterminate) {
        this.checkAll = false;
      } else {
        this.checkAll = !this.checkAll;
      }
      this.indeterminate = false;

      if (this.checkAll) {
        this.checkAllGroup = this.allColList.map(item => {
          return item.key
        })
      } else {
        this.checkAllGroup = [];
      }
    },
    /**
     * 选项发生变化时处理逻辑
    */
    checkAllGroupChange(data) {
      if (data.length === this.allCheckList.length) {
        this.indeterminate = false;
        this.checkAll = true;
      } else if (data.length > 0) {
        this.indeterminate = true;
        this.checkAll = false;
      } else {
        this.indeterminate = false;
        this.checkAll = false;
      }
    },
    /**
     * 确认提交配置项
    */
    confirm(){
      // this.dealTableColumn(this.checkAllGroup);
      // this.defaultColCheckList = this.checkAllGroup;
      this.$emit('confirm', this.checkAllGroup)
      this.visible = false;
    }
  },
};
</script>

<style scoped>
.dropdown {
  display: flex;
  justify-content: right;
  margin:20px;
}
.ivu-checkbox-group-item{
  display: block;
  margin-top: 8px;
}
.btnGroup{
  text-align: right;  
  margin-bottom: 10px;
}
.btnGroup button{
  margin-right: 10px;
}
</style>

三、效果如下

 

标签:checkAll,vue,false,自定义,表头,item,key,checkAllGroup,true
From: https://www.cnblogs.com/ysx215/p/17303598.html

相关文章

  • Vue启用报错 RangeError: Invalid typed array length: -4095
    近期开发的前端项目项目启用失败,记录下修复过程RangeError:Invalidtypedarraylength:-4095 错误原因:node版本问题,安装10.x.x即可重新安装:1.将原来的nvm,node卸载2.安装nvm 如果显示上面内容即安装成功3.在nvm上安装一个版本的Node   命令:nvmls出现下图......
  • GORM自定义类型
    GORM自定义类型官网地址官方也有一个用来收集自定义的类型的仓库:https://github.com/go-gorm/datatypes场景时间类型初始的时间类型只有time.time类型,而我们习惯输入和展示的结构是形如2023-04-0812:12:12这种。这种格式需要被程序转化为time.time类型被orm使用,从数据库......
  • vue实现路由懒加载(异步加载)及组件懒加载(异步加载)的方式
    转自:槐序之夏:https://blog.csdn.net/qq_42403643/article/details/129264032一、为什么要使用路由懒加载为给客户更好的客户体验,首屏组件加载速度更快一些,解决白屏问题。二、定义懒加载简单来说就是延迟加载或按需加载,即在需要的时候的时候进行加载。三、使用常用的懒加......
  • 关于vue2老项目的打包优化,实现首屏加载速度提升
    分析项目代码体积yarnaddwebpack-bundle-analyzer在webpack.dev.conf.js中配置constBundleAnalyzerPlugin=require('webpack-bundle-analyzer').BundleAnalyzerPluginplugins:[newBundleAnalyzerPlugin(),//代码体积分析插件......]执行yarnrundev或......
  • vue3中的自定义指令
    1.适用到自定义指令的场景 防抖、图片懒加载、一键Copy的功能、拖拽、页面水印、权限校验、输入框自动聚焦、相对时间转换、下拉菜单2.个人需求:在后台系统中,有很多表单提交组件,其中很多限制数字且限制条件不同。最初使用oninput="value=value.replace(/[^\d]/g,'')"来显示......
  • vue3 高德地图弹窗选址功能
    import{defineComponent,h}from'vue';importAMapLoaderfrom'@amap/amap-jsapi-loader';import{Input,AutoComplete,Modal,message}from'ant-design-vue';//首先需要引入Vue3的shallowRef方法(使用shallowRef进行非深度监听,因为在Vue3所......
  • 文件批量改名高手,文件怎么随机改名,支持自定义生成长度
    如何批量重命名多个文件呢?有没有简单一点的方法呢?小编的回答当然是有的啦,下面一起来试试这个新的技巧,希望能给大家带来帮助。所需工具安装一个文件批量改名高手文件素材若干操作步骤步骤1:运行【文件批量改名高手】,在“文件批量重命名”中,导入文件,支持多种导入文件的方式步骤2:确定都......
  • vue3 环境搭建部署
    安装node查看版本chenjun@chenjundeMacBook-Airuitest%node-vv18.7.0创建vue项目(⚠️注意项目名称小写)npminitvue@latest运行vue项目 1cd项目2npminstall3npmrundev ......
  • vscode保存时自动ESLint格式化(vue)
    一、安装eslint  二、vscode全局配置2.1打开设置   2.2打开settings.json  2.3在settings.json中添加eslint配置{"code-runner.runInTerminal":true,"eslint.format.enable":true,//以下是eslint配置//vscode默认启用了根据文件......
  • 自定义运行时异常(非检查异常)
    写一个类继承Exception或其子类,然后在其他类中使用该异常注意:自定义的异常为运行时异常,因为运行时异常为非检查异常,并不需要程序员显示的抛出异常,但是为了更好的去检测程序,所以自定义运行时异常自定义运行时异常的使用形式://自定义构造带......