首页 > 其他分享 >vue封装带有全选的多选框

vue封装带有全选的多选框

时间:2023-02-03 13:34:25浏览次数:68  
标签:vue Description default value 全选 data change 选框

​ 基于element-ui的多选框组件(el-checkbox)进行二次封装,将全选的逻辑都封装到组件内部,使用v-model的方式进行数据的绑定,方便使用。

  • 组件代码

    <template>
      <div>
        <el-checkbox v-model="checkAll" :indeterminate="isIndeterminate" @change="handleCheckAllChange">全选</el-checkbox>
        <div style="margin: 15px 0;"></div>
        <el-checkbox-group v-model="checkData" @change="handleCheckedChange">
          <!--自定义插槽方式定义多选组-->
          <template v-if="$slots.default">
            <slot></slot>
          </template>
          <!--默认方式,数据格式为{value: '', label: ''}-->
          <template v-else>
            <el-checkbox v-for="(item, index) in options" :key="index" :label="item[value]">{{ item[label] }}</el-checkbox>
          </template>
        </el-checkbox-group>
      </div>
    </template>
    <script>
    
    /** @Description 带全选的多选择控件 */
    export default {
      name: 'AllSelectCheckbox',
      model: {
        prop: 'data',
        event: 'change'
      },
      props: {
        data: {
          type: Array,
          default: () => []
        },
        options: {
          type: Array,
          default: () => []
        },
        value: {
          type: String,
          default: 'value'
        },
        label: {
          type: String,
          default: 'label'
        },
        disabled: {
          type: Boolean,
          default: false
        }
      },
      data() {
        return {
          checkData: [],
          checkAll: false
        }
      },
      computed: {
        /** @Description 自动计算isIndeterminate */
        isIndeterminate() {
          const checkedCount = this.checkData.length
          const isIndeterminate = checkedCount > 0 && checkedCount < this.options.length
    
          return isIndeterminate
        },
        /** @Description 全选择的所有value */
        allOptionsValue() {
          return this.options.map(r => r[this.value])
        }
      },
      watch: {
        data() {
          this.checkData = this.data
        }
      },
      created() {
        this.checkData = this.data
      },
      mounted() {
    
      },
      methods: {
        /** @Description 全选 */
        doSelectAll() {
          this.$emit('change', [...this.allOptionsValue])
        },
        /** @Description 取消全选 */
        undoSelectAll() {
          this.$emit('change', [])
        },
        /** @Description 选择框变化 */
        handleCheckedChange(value) {
          const checkedCount = value.length
          this.checkAll = checkedCount === this.options.length
    
          this.$emit('change', value)
        },
        /** @Description 全选框变化 */
        handleCheckAllChange(val) {
          this.$emit('change', val ? [...this.allOptionsValue] : [])
        }
      }
    }
    
    </script>
    <style lang='css' scoped>
    </style>
    
  • 使用示例

    <template>
      <div>
        <AllSelectCheckbox v-model="checkData" :options="options" value="code" label="name" :disabled="false">
          	<!---可以自定义插槽修改多选框内容---->
            <!-- <el-checkbox v-for="(item,index) in options" :key="index" :label="item.code">{{ item.name }}</el-checkbox> -->
        </AllSelectCheckbox>
      </div>
    </template>
    
    <script>
    import AllSelectCheckbox from '@/components/allSelectCheckbox'
    
    export default {
      components: {
        AllSelectCheckbox
      },
      data() {
        return {
          checkData: ['1'],
          options: [
            { code: '1', name: '男' },
            { code: '2', name: '女' },
            { code: '3', name: '其他' }
          ]
        }
      },
      mounted() {
    
      },
      methods: {
        change(val) {
          console.log(val)
        }
      }
    }
    
    </script>
    <style lang='css' scoped>
    </style>
    
    

标签:vue,Description,default,value,全选,data,change,选框
From: https://www.cnblogs.com/linmt/p/17088905.html

相关文章

  • vue 项目中 jsconfig.json 概念 及 使用步骤
    vue项目中jsconfig.json概念及使用步骤vue项目中jsconfig.json是什么当您在工作空间中有一个定义项目上下文的jsconfig.json文件时,JavaScript体验会得到改进概述目......
  • vue版本2.9.6升级到高版本
    由于npminstall-gvue-cli安装的是老版本,如果想要安装新版本,可以先看一下自己是否已经安装了新版本vuecreateproj:可以看到我这边有两个版本了,如果想要安装新版本需要......
  • VUE-超大文件上传-如何上传文件-大文件上传
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上......
  • vue3 bind绑定
    bind绑定不但可以动态绑定属性值  <divv-bind:id="dynamicId"></div>还可以动态绑定属性名  <av-bind:[attributeName]="url">...</a>以及表达式型的  <a:[......
  • vue-cli以及element-ui国际化实战(待完善-切换时不刷新页面)
    步骤创建language文件夹在src同级的目录下新建language文件夹,新增三个文件,代码如下index.jsimportVuefrom'vue'importVueI18nfrom'vue-i18n'Vue.use(VueI1......
  • vue实现自定义v-loading指令
    实现dom节点的局部loading效果,效果如element-ui的v-loading。实现代码:loading.js,其中@/components/loadingComponent/index.vue为自定义的一个loading组件,可自行实现。......
  • vue脚手架的使用
    打开创建好的vue项目,点开src可以看到下面:assets是用来放图片的目录components用于放vue组件文件router用于放路由文件main.js是项目开始走的路口,一般不用修改:import......
  • vue脚手架的安装
    安装脚手架基于npm命令下面,因此需要先安装node.js前面,前面安装elementui里面有介绍怎么安装node.jselement-ui的安装及使用-Liku007-博客园(cnblogs.com)npm管理前端......
  • VUE API接口的统一管理
    vue项目对api进行封装统一管理在日常vue项目中或刚接收一个vue项目,如果项目足够大,就需要进行统一管理和规范接口了1.js文件创建先在src目录下新建一个api文件夹,然后......
  • Could not find a declaration file for module ‘xxx‘ (vue3+ts)
    vue3+ts框架搭建过程中遇到引入三方qs库出现eslitn提示'Couldnotfindadeclarationfileformodule‘qs‘';解决方案方案1:npmi--save-dev@types/qs此处......