checkbox在vue中的用法小结


Posted in Javascript onNovember 13, 2018

前言

关于checkbox多选框是再常见不过的了,几乎很多地方都会用到,这两天在使用vue框架时需要用到checkbox多选功能,实在着实让我头疼,vue和原生checkbox用法不太一样,之前对于vue中用到过的checkbox也只是别人写好的组件,这次在自己实现时走了很多坑,特意写这篇文章记录下来,给后来者提供一个参考

在这之前,先看看原生checkbox搭配jquery取值的用法

<input type="checkbox" name="hobby" value="游泳">游泳
    <input type="checkbox" name="hobby" value="健身">健身
    <input type="checkbox" name="hobby" value="旅游">旅游

    $(".section1 input[type=checkbox][name=hobby]").change(function(){
         var obj = document.getElementsByName("hobby");
     var check_val = [];
     for(k in obj){
      if(obj[k].checked){
        check_val.push(obj[k].value);
      }
     }
     $(".section1 .res").text(check_val);
      });

checkbox禁用

<input type="checkbox" name="hobby" value="游泳" checked disabled="true">游泳

在vue中checkbox用法

在vue中,v-model其实是checked语法糖,通过v-model来判断当前checkbox是否被选中, 它绑定一个数组,选中项的值会自动添加到数组中

<div>请选择你的爱好(vue)</div>
    <input type="checkbox" v-model="hobby2" value="游泳">游泳
    <input type="checkbox" v-model="hobby2" value="健身">健身
    <input type="checkbox" v-model="hobby2" value="旅游">旅游
    <div>你已选中:{{hobby2}}</div>
var vm = new Vue({
      el: '#app',
      data:{
        msg:'hello',
        hobby2:[]
      },
      created(){
        console.log('created')
      },
      method:{
        login:function(){
          alert(1)
        }
      }
    })

vue中checkbox禁用

假如我们要求选项至少选择一个值,我们来通过disabled来禁止用户取消点击选项

 这里主要是通过设置hobby2的值来控制checkbox选项的选中或取消

1.首先先将hobby2数组设置一个默认值hobby2:['游泳']

2.添加input点击事件

<input type="checkbox" v-model="hobby2" value="游泳" @click="handleClick">游泳
handleClick:function(ev){
          var that = this;
          setTimeout(function(){
            console.log('this.hobby2',ev.target.checked,that.hobby2.length,that.hobby2)
            if(!ev.target.checked){
              if(that.hobby2.length==1){
                that.lastcheckval = that.hobby2[0];
              }
              if(that.hobby2.length==0){
                that.hobby2.push(that.lastcheckval)
              }
            }
          },1)
        }

1.通过获取点击事件 ev.target.checked的值判断当前点击状态是取消还是选中

 如是取消状态,则判断当前hobby2长度为0时通过push将lastcheckval最后一个值添加进去,这样就无法取消最后一个选项

lastcheckval的值需要在hobby2数组长度为1时将选项值保存起来

setTimeout异步

这里的如果不使用setTimeout异步,当点击选中或者取消选项时,数组hobby2中的值还是上一个选项结果,为了保证一致添加setTimeout解决该问题

刚才我们通过控制v-model中hobby2的值来禁止用户取消最后一个选项,那如果我们要实现这样一个功能又如何做呢

1.用户最多只能选择2个选项 (交互效果:当当前选项长度为2时,用户去选择新的选项时,将第一个选项取消,依次类推)

 在checked为false时添加如下代码,判断hobby2长度大于2时,将第一个元素删除

if(that.hobby2.length>2){
                that.hobby2.splice(0,1);
              }

自定义checkbox样式

默认的checkbox样式十分丑陋,不同的浏览器展示效果也不一样,如果是设计出图的话,我们就需要自定义样式,
 结合vue checkbox选项禁用来自定义checkbox样式

原理

1.通过label标签将input包裹住通过label for绑定input id,当点击label时实际就是点击的input
将input设置opacity: 0;不可见

2.通过给div来设置checkbox的默认样式及选中状态样式

.section3 .checkboxlist{}
    .checkboxlist label{
        margin-left: 10px;
    }
    .checkboxlist .checkbox{
      display: inline-block;
      width: 14px;
      height: 14px;
      border: 1px solid #eee;
        margin-right: -20px;
    }
    .checkboxlist .checkbox.checked{
      background: blue;
    }
    .checkboxlist input{
      opacity: 0;
    }

checkbox选项选中状态checked类动态添加 ,判断hobby3中是否存在当前选项值来觉得是否绑定checked类

:class="hobby3.indexOf('游泳')!=-1?'checked':''"
<label for="游泳">
        <div class="checkbox" :class="hobby3.indexOf('游泳')!=-1?'checked':''"></div>
        <input type="checkbox" id="游泳" v-model="hobby3" value="游泳" @click="handleClick">游泳
      </label>
      <label for="健身">
        <div class="checkbox" :class="hobby3.indexOf('健身')!=-1?'checked':''"></div>
        <input type="checkbox" id="健身" v-model="hobby3" value="健身" @click="handleClick">健身
      </label>
      <label for="旅游">
        <div class="checkbox" :class="hobby3.indexOf('旅游')!=-1?'checked':''"></div>
        <input type="checkbox" id="旅游" v-model="hobby3" value="旅游" @click="handleClick">旅游
      </label>
      <label for="爬山">
        <div class="checkbox" :class="hobby3.indexOf('爬山')!=-1?'checked':''"></div>
        <input type="checkbox" id="爬山" v-model="hobby3" value="爬山" @click="handleClick">爬山
      </label>

总结

以上所述是小编给大家介绍的checkbox在vue中的用法总结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
提高jQuery性能的十个诀窍
Nov 14 Javascript
jquery中常用的函数和属性详细解析
Mar 07 Javascript
莱鸟介绍window.print()方法
Jan 06 Javascript
jquery中键盘事件小结
Feb 24 Javascript
详解Bootstrap插件
Apr 25 Javascript
jquery 键盘事件的使用方法详解
Sep 13 jQuery
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
Jan 17 Javascript
vue 的点击事件获取当前点击的元素方法
Sep 15 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
Nov 02 Javascript
Vue表单之v-model绑定下拉列表功能
May 14 Javascript
微信小程序实现滑动翻页效果(完整代码)
Dec 06 Javascript
详解JavaScript的this指向和绑定
Sep 08 Javascript
React父子组件间的传值的方法
Nov 13 #Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
Nov 13 #Javascript
详解如何用typescript开发koa2的二三事
Nov 13 #Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
Nov 13 #Javascript
koa源码中promise的解读
Nov 13 #Javascript
vue-router传递参数的几种方式实例详解
Nov 13 #Javascript
vue-router的使用方法及含参数的配置方法
Nov 13 #Javascript
You might like
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
js中hash和ico的关联分析
2015/02/05 Javascript
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
js表单验证实例讲解
2016/03/31 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
详解vue2.0监听属性的使用心得及搭配计算属性的使用
2018/07/18 Javascript
小程序组件之仿微信通讯录的实现代码
2018/09/12 Javascript
微信实现自动跳转到用其他浏览器打开指定APP下载
2019/02/15 Javascript
Moment.js实现多个同时倒计时
2019/08/26 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
从Python的源码浅要剖析Python的内存管理
2015/04/16 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
Python中random模块生成随机数详解
2016/03/10 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
Python_LDA实现方法详解
2017/10/25 Python
Python登录注册验证功能实现
2018/06/18 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
Spartoo瑞典:鞋子、包包和衣服
2018/09/15 全球购物
会计毕业自我鉴定
2014/02/05 职场文书
小学开学标语
2014/07/01 职场文书
安装工程师岗位职责
2015/02/13 职场文书
员工试用期转正自我评价
2015/03/10 职场文书
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js