css3|vue封装checkBox列表组件(实现group和自定义选项,纯css实现效果)
点击我查看效果
一、前言 【又在重复造轮子!!!】vue有很多现成的UI框架,博主的手机端用的是mintUI,但是mintUI样式不能整改为想要的样子,因此纯手工封装了一个checkBox组件(纯css实现效果,需要不一样的可自制样式)
先来一个效果图:
文章图片
二、正文
1、说明
- 使用checkBox绑定数据,选中的数据使用数组存储(vue分组的写法)
- 为了保证是数组类型,需要指定组件参数使用的变量,使用$emit回传数据到父组件,checkbox实现v-model双向绑定
- 通过参数确定,是否显示多选框,用样式控制
// js数据
data: function () {
return {
multiCheckOptions: [
{'value': '1', 'name': '选项1'},
{'value': '2','name': '选项2(禁用)','disabled': true},
{'value': '3', 'name': '选项3'}],
checkedVal1: [1],
checkedVal2: [1, 2],
checkedVal3: [1, 2],
}
}
3、代码解析
3.1、参数说明(参数命名最好不要使用大写,有可能会解析不到):
- label:组件的标签名称
- options:需要生成的checkBox选项数据格式:[{value:'1',name:'选项1',disabled:false}]
- checked:选中的数据 ['1'],通常与disabled:true合并使用,若使用v-model,则无需绑定该参数‘’
- disabled:是否全部禁用, 默认false可用
- showbox:是否显示勾选框, 默认显示 ( false:不显示,则样式会改变)
- 修改v-model对应的变量和事件,保证数据格式?????,
model: { // v-model对应的变量和事件,默认是value和change
prop: 'checked',
event: 'change'
},
- 保证单向数据流的统一性,且回传数据到父组件所使用的v-model
checkedVal: this.checked, // data中定义一个新的变量,用来存储选中的数据,保证单向数据流的统一性this.$emit('change', newValue) // 监听数据变化,回传数据到父组件
有这三句话,组件就已经成功了一半,接下来只需要把他们放到合适的位置,就可以初见成效。
3.3 、准备js代码
export default {
name: "multi-check-list",
model: { // v-model对应的变量和事件,默认是value和change
prop: 'checked',
event: 'change'
},
props: { // 组件参数
label: String,
options: Array,
checked: Array,
disabled: false,
showbox: {
type: Boolean,
default: true
},
},
watch: { // 监听数据变化,回传数据到父组件
checkedVal(newValue, oldValue) {
if (newValue != oldValue) {
this.$emit('change', newValue)
}
}
},
data() {
return {
checkedVal: this.checked, // 用来存储选中的数据
curTime: new Date().getTime(), // 获取当前时间,生成唯一id,保证一个页面可使用多个组件
}
},
}
可能会有小伙伴不明白,为什么要checkedVal:this.checked?!?
答:
- 确实不需要这句话,直接把checkedVal使用到的地方替换成checked也可以达到目的
- 但是我们写代码,是不是除了写代码之外,还可以做点别的事情,比如写出优雅的代码((????д????)????? What are you 弄啥嘞!)
- 首先,vue是单向数据流,自上而下,普通的数据类型,是不会与父组件数据保持一致,因为object(我们用的checked数组,也属于object)用的是同一块内存,也就是上下的checked会同步变化
- 其次,我们封装组件为了保证调用者的数据不被破坏,我们应该遵循vue的规则,另外定义一个变量用来存储会变化的数据
文章图片
【css3|vue封装checkBox列表组件(实现group和自定义选项,纯css实现效果)】3.4 、编写html代码
遍历传入的options,动态生成CheckBox列表
到这里,组件封装就基本成型了,没有贴出css,如果需要完整代码,可直接在本人github上clone代码,或者在本人资源里面下载
感谢观看,欢迎留言交流!
推荐阅读
- vue-cli|vue-cli 3.x vue.config.js 配置
- 2020-04-07vue中Axios的封装和API接口的管理
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- python自定义封装带颜色的logging模块
- jQuery插件
- VueX--VUE核心插件
- vue组件中为何data必须是一个函数()
- 用npm发布一个包的教程并编写一个vue的插件发布
- vuex|vuex 基础结构
- Vue源码分析—响应式原理(二)