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 Go 数据安全/隐私保护
【Vue】组件封装——input输入框
【Vue】组件封装——input输入框
273 0
【Vue】组件封装——input输入框
|
3月前
Vue2使用v-model封装ElementUI_DatePicker 日期选择器组件
本文介绍了如何在Vue2中使用v-model封装ElementUI的DatePicker日期选择器组件,并实现自定义属性和方法的结合使用,包括禁用日期、格式化日期等功能。
119 2
Vue2使用v-model封装ElementUI_DatePicker 日期选择器组件
|
3月前
|
JavaScript
Vue2使用v-model封装ElementUI_Input组件
本文介绍了在Vue2中如何使用v-model封装ElementUI的Input组件。封装后的组件可以根据传入的title属性决定是否显示标题,支持正则表达式校验,并提供了在Vue页面中的使用示例。
125 5
|
7月前
|
JavaScript 开发者
[vue2/vue3] -- 深入剖析v-model的原理、父子组件双向绑定的多种写法
[vue2/vue3] -- 深入剖析v-model的原理、父子组件双向绑定的多种写法
[vue2/vue3] -- 深入剖析v-model的原理、父子组件双向绑定的多种写法
|
7月前
|
资源调度 JavaScript 前端开发
vue3怎么调用vant中的icon组件
vue3怎么调用vant中的icon组件
239 4
|
7月前
|
JavaScript
Vue中的v-model如何实现一个自定义组件的双向绑定?
Vue中的v-model如何实现一个自定义组件的双向绑定?
239 2
|
7月前
|
JavaScript
【双向绑定极简版代码】在Vue.js的自定义组件中实现v-model=“”双向绑定
【双向绑定极简版代码】在Vue.js的自定义组件中实现v-model=“”双向绑定
|
JavaScript API
如果使用Vue3.0实现一个 Modal,你会怎么进行设计?
如果使用Vue3.0实现一个 Modal,你会怎么进行设计?
154 0
如果使用Vue3.0实现一个 Modal,你会怎么进行设计?
|
JavaScript
vue动态生成表单组件vue-form-maker
vue动态生成表单组件vue-form-maker
185 0
|
JavaScript
Vue 自定义组件实现 v-model 数据双向绑定
Vue 自定义组件实现 v-model 数据双向绑定
132 0