Vue2使用v-model封装ElementUI_CheckBox组件

简介: 本文介绍了在Vue2中如何使用v-model封装ElementUI的CheckBox组件。封装后的组件支持有标题和无标题的情况,并提供了在Vue页面中的使用示例,包括单独使用和在表单中的使用。

核心

可以查阅这篇文章,看一些v-model的具体实现;
简介来讲,就是自定义属性和自定义方法的结合使用。
Vue2.0、Vue3.0分别使用v-model封装组件

首先新建脚手架引入element-ui组件和样式;

新建vCheckBox.vue组件:


<template >
  <div>
    <div class="inputBox" v-if="title">
      <p class="inputBoxP">{
   {
   title}}</p>
      <el-checkbox-group class="radiogroup" v-model="checkList" @change="inputFun">
        <el-checkbox v-for="item in options" :key="item.key" :label="item.key">{
   {
   item.value}}</el-checkbox>
      </el-checkbox-group>
    </div>
    <el-checkbox-group v-else class="radiogroup" v-model="checkList" @change="inputFun">
      <el-checkbox v-for="item in options" :key="item.key" :label="item.key">{
   {
   item.value}}</el-checkbox>
    </el-checkbox-group>
  </div>
</template>
<script>
export default {
   
  model: {
   
    prop: "value",
    event: "inputFun"
  },
  data() {
   
    return {
   
      checkList: []
    };
  },
  props: {
   
    value: {
   
      type: Array,
      require: false,
      default: () => []
    },
    title: {
   
      type: String,
      require: false
      // default: "请传入Titlt"
    },
    placeholder: {
   
      type: String,
      require: false,
      default: "请选择"
    },
    options: {
   
      type: Array,
      require: true,
      default: []
    }
  },
  watch: {
   
    value: {
   
      handler(newVal, oldVal) {
   
        if (newVal) {
   
          this.checkList = newVal;
        }
      },
      immediate: true
    }
  },
  methods: {
   
    inputFun(e) {
   
    //不改变地址 可能导致form校验的时候拿不到最新的值
      this.$emit("inputFun", [...this.checkList]);
    }
  }
};
</script>
<style lang="less"  scoped>
.inputBox {
   
  margin-bottom: 10px;
  display: flex;
  justify-content: flex-start;
  align-items: center;
  width: var(--boxWidth);
  .inputBoxP {
   
    text-align: right;
    white-space: nowrap;
    width: 150px;
  }
  .inputBoxIpt {
   
    width: 200px;
  }
  .radiogroup {
   
    width: 200px;
    height: 32px;
    line-height: 32px;
    display: flex;
    align-items: center;
  }
}
</style>
</script>

<style lang="less" scoped>
.inputBox {
   
  margin-bottom: 10px;
  display: flex;
  justify-content: flex-start;
  align-items: center;
  width: var(--boxWidth);
  .inputBoxP {
   
    text-align: right;
    white-space: nowrap;
    width: 150px;
  }
  .inputBoxIpt {
   
    width: 200px;
  }
}
</style>

我这里根据有没有传递title属性,做了渲染判断。原因在于这个组件要分别使用在form表单中和单独使用。

单个使用

针对有title的情况
使用肯定需要按部就班:引入_注册_页面使用。

import vCheckBox from "@/components/elementCom/CheckBox";

  components: {
   
    vCheckBox,
  }

页面使用:

 <v-check-box
      v-model="msg8"
       title="msg8"
       :options="[ {
   
       key: '3',
       value: '蚵仔煎'
     }, {
   
       key: '4',
       value: '龙须面'
     }, {
   
       key: '5',
       value: '北京烤鸭'
     }]"
     />

data:

  data() {
   
    return {
   
      msg: "1",
      msg2: "2",
      msg3: "3",
      msg4: "4",
      msg5: "",
      msg6: "1",
      msg7: "2",
      msg8: ["3", "5"],
      startDate: new Date()
    };
  },

结果:
在这里插入图片描述

收集输入的值:

 <el-button type="primary" @click="getAllInputFun">主要按钮</el-button>

  methods: {
   
  getAllInputFun() {
   
      console.log(this.$data,"data");
    },
  }

![在这里插入图片描述](https://img-blog.csdnimg.cn/53f156509df641e0bcf89b81733fc953.png

表单使用

针对没有title的情况

  <el-form
      :model="ruleForm"
        :rules="rules"
        ref="ruleForm"
        label-width="250px"
        class="demo-ruleForm"
      >
           <el-form-item label="活动性质" prop="type">
            <vCheckBox
              v-model="ruleForm.type"
              :options="[ {
   
                     key: '3',
                      value: '蚵仔煎'
                      }, {
   
                      key: '4',
                      value: '龙须面'
                      }, {
   
                      key: '5',
                      value: '北京烤鸭'
                      }]"
            ></vCheckBox>
          </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submitForm('ruleForm')">立即创建</el-button>
        <el-button @click="resetForm('ruleForm')">重置</el-button>
      </el-form-item>
  </el-form>

data:

 data() {
   
    let validatePass2 = (rule, value, callback) => {
   
      console.log(rule, "rule, value,");
      console.log(!value);
      console.log(value.length === 0);
      this.$nextTick(() => {
   
        if (!value || value.length === 0) {
   
          callback(new Error("请选择活动性质"));
        } else {
   
          callback();
        }
      });
    };
    return {
   
      ruleForm: {
   
        type: [],
      },
      rules: {
   
        type: [
          {
   
            type: "array",
            required: true,
            validator: validatePass2,
            // message: "请至少选择一个活动性质",
            trigger: "change"
          }
        ],
      }
    };
  },

methods:

  methods: {
   
    submitForm(formName) {
   
      this.$refs[formName].validate(valid => {
   
        if (valid) {
   
          alert("submit!");
          console.log(this.ruleForm, "ruleForm");
        } else {
   
          console.log("error submit!!");
          return false;
        }
      });
    },
    resetForm(formName) {
   
      this.$refs[formName].resetFields();
    }
  }
目录
相关文章
|
JavaScript
Vue2使用v-model封装ElementUI_Input组件
本文介绍了在Vue2中如何使用v-model封装ElementUI的Input组件。封装后的组件可以根据传入的title属性决定是否显示标题,支持正则表达式校验,并提供了在Vue页面中的使用示例。
540 5
|
5月前
|
存储 JavaScript 前端开发
element ui <el-date-picker> 设置展示当前月
在 Element UI 中,使用 `el-date-picker` 的 `value-format` 属性可将日期值格式化为指定字符串。设置 `type=&quot;month&quot;` 时,绑定值默认为 Date 对象,通过 `value-format=&quot;yyyy-MM&quot;` 可将其转为如 &quot;2023-05&quot; 格式,便于存储与处理。
1113 0
|
数据格式
使用小技巧实现el-table组件的合并行功能,ElementUI和ElementPlus都适用
本文介绍了在ElementUI和ElementPlus中使用`el-table`组件实现合并行功能的技巧,包括多列合并和单列合并的方法,并提供了相应的示例代码和运行效果。
10096 46
使用小技巧实现el-table组件的合并行功能,ElementUI和ElementPlus都适用
|
11月前
不要再责怪你的UI设计师为什么没有用rp?ps?figma?sketch?xd?如何免费转换非在线工具收费转换-本文将教会你常规ui设计源文件格式相互之间如何转换并且保持矢量图和标注注释问题-优雅草央千澈
不要再责怪你的UI设计师为什么没有用rp?ps?figma?sketch?xd?如何免费转换非在线工具收费转换-本文将教会你常规ui设计源文件格式相互之间如何转换并且保持矢量图和标注注释问题-优雅草央千澈
379 1
|
JavaScript 索引
vue 在 v-for 时给每项元素绑定事件
在 Vue 中使用 v-for 渲染列表时,可以通过给每项元素绑定事件来实现交互功能。通常使用 `@click` 等事件修饰符,结合方法或内联表达式来处理事件。例如:`&lt;li v-for=&quot;item in items&quot; @click=&quot;handleClick(item)&quot;&gt;{{ item }}&lt;/li&gt;`。
|
消息中间件 算法 Java
聊聊如何在Java应用中发送短信
很多业务场景里,我们都需要发送短信,比如登陆验证码、告警、营销通知、节日祝福等等。 这篇文章,我们聊聊 Java 应用中如何优雅的发送短信。
聊聊如何在Java应用中发送短信
|
JavaScript
如何对ElementUI、ElementPlus中的Tree树组件进行美化,如增加辅助线、替换展开收起图标、点击节点后文字高亮等效果?本文给你答案!
本文介绍了如何对ElementUI和ElementPlus的Tree树组件进行美化,包括增加辅助线、替换展开收起图标、点击节点后文字高亮等效果,并提供了详细的代码示例和实现效果。
3768 0
如何对ElementUI、ElementPlus中的Tree树组件进行美化,如增加辅助线、替换展开收起图标、点击节点后文字高亮等效果?本文给你答案!
element el-table 设置fixed导致行错乱问题
文章讨论了在使用Element UI的`el-table`组件时,设置固定列(`fixed`)导致行错乱的问题,并提供了解决方案。问题产生的原因是当表格底部有滚动条而固定列底部没有滚动条时,行无法对齐。解决办法是在表格中设置`padding-bottom`的内边距与滚动条高度相等,确保固定列和非固定列的行能够对齐。
3751 0
element UI 组件封装--搜索表单(含插槽和内嵌组件)
element UI 组件封装--搜索表单(含插槽和内嵌组件)
429 5
|
存储 运维 Java
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
243 2