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 相关文章推荐
更换select下拉菜单背景样式的实现代码
Dec 20 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
Feb 10 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
May 13 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
Oct 24 Javascript
js replace替换所有匹配的字符串
Feb 13 Javascript
JQuery标签页效果的两个实例讲解(4)
Sep 17 Javascript
JavaScript类型系统之基本数据类型与包装类型
Jan 06 Javascript
AngularJS 路由详解和简单实例
Jul 28 Javascript
JavaScript实现256色转灰度图
Feb 22 Javascript
vue实现鼠标移入移出事件代码实例
Mar 27 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
Oct 11 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
Aug 13 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
怎样在PHP中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
php xml实例 留言本
2009/03/20 PHP
php学习之运算符相关概念
2011/06/09 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
php redis setnx分布式锁简单原理解析
2020/10/23 PHP
Javascript 日期处理之时区问题
2009/10/08 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
javascript获取四位数字或者字母的随机数
2015/01/09 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
非常实用的js验证框架实现源码 附原理方法
2016/06/08 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
vue实现简单图片上传
2020/06/30 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
Python 硬币兑换问题
2019/07/29 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
css3 2D图片转动样式可以扩充到Js当中
2014/04/29 HTML / CSS
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
分别介绍一下Session Bean和Entity Bean
2015/03/13 面试题
迟到检讨书500字
2014/02/05 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
广告设计应届生求职信
2014/03/01 职场文书
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书