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 相关文章推荐
javascript之锁定表格栏位
Jun 29 Javascript
js实现的网页颜色代码表全集
Jul 17 Javascript
js 获取Listbox选择的值的代码
Apr 15 Javascript
JS获取整个页面文档的实现代码
Dec 15 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
Mar 29 Javascript
javascript中in运算符用法分析
Apr 28 Javascript
原生js实现水平方向无缝滚动
Jan 10 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
Aug 12 Javascript
微信小程序自定义组件
Aug 16 Javascript
浅谈React深度编程之受控组件与非受控组件
Dec 26 Javascript
Vue源码解析之Template转化为AST的实现方法
Dec 14 Javascript
微信小程序实现星级评价
Nov 20 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中使用explode查找某个字符是否存在的方法
2011/07/12 PHP
thinkphp连贯操作实例分析
2014/11/22 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
js浮点数精确计算(加、减、乘、除)
2013/12/26 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
Javascript实现字数统计
2015/07/03 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
JS操作xml对象转换为Json对象示例
2017/03/25 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
JS 60秒后重新发送验证码的实例讲解
2017/07/26 Javascript
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
2019/03/07 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
nodejs二进制与Buffer的介绍与使用
2019/07/11 NodeJs
vue 封装面包屑组件教程
2020/11/16 Javascript
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
使用Python对Csv文件操作实例代码
2017/05/12 Python
django上传图片并生成缩略图方法示例
2017/12/11 Python
Python求出0~100以内的所有素数
2018/01/23 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
mac系统下Redis安装和使用步骤详解
2019/07/09 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
化妆品活动策划方案
2014/05/23 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
MySQL sql_mode的使用详解
2021/05/08 MySQL
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js
css3 选择器
2022/05/11 HTML / CSS