vue 实现全选全不选的示例代码


Posted in Javascript onMarch 29, 2018

全选功能可以说是前端开发中非常常见的一个功能,以前的项目开发用jQuery开发比较多。最近在使用vue前端框架重构之前的项目。从jQuery到vue的转变主要是一个思想想的转变,是将原有的直接操作dom的思想转变到操作数据,用数据驱动dom,也是vue框架的一个核心思想,思想转变过来,对功能的实现自然容易理解一些。

例如下面这个简单的demo

vue 实现全选全不选的示例代码

按照jQuery的思想来做的话,要选中全选checkbox和所有的checkbox项,分别注册选中事件,判断选中状态来给相关的checkbox设置对应的状态,这就涉及到很多的dom操作。

下面就看一下vue数据驱动dom的思想来实现这一功能。

vue数据驱动dom实现功能

<div class="checkbox">
  <label for="quan">
    <!-- 这里的 $event 是将当前对象传入进去,具体详情请参照vue官方文档 -->
    <input id="quan" type="checkbox" @click="checkAll($event)"> 全选
  </label>
  <label>
    <!-- v-model 双向数据绑定命令 -->
    <input class="checkItem" type="checkbox" value="apple" v-model="checkData"> apple
  </label>
  <label>
    <input class="checkItem" type="checkbox" value="banana" v-model="checkData"> banana
  </label>
  <label>
    <input class="checkItem" type="checkbox" value="orange" v-model="checkData"> orange
  </label>
</div>
<script>
  new Vue({
    el: '#app',
    data(){
      return {
        checkData: [] // 双向绑定checkbox数据数组
      }
    },
    watch: { // 监视双向绑定的数据数组
      checkData: {
        handler(){ // 数据数组有变化将触发此函数
          if(this.checkData.length == 3){
            document.querySelector('#quan').checked = true;
          }else {
            document.querySelector('#quan').checked = false;
          }
        },
        deep: true // 深度监视
      }
    },
    methods: {
      checkAll(e){ // 点击全选事件函数
        var checkObj = document.querySelectorAll('.checkItem'); // 获取所有checkbox项
        if(e.target.checked){ // 判定全选checkbox的勾选状态
          for(var i=0;i<checkObj.length;i++){
            if(!checkObj[i].checked){ // 将未勾选的checkbox选项push到绑定数组中
              this.checkData.push(checkObj[i].value);
            }
          }
        }else { // 如果是去掉全选则清空checkbox选项绑定数组
          this.checkData = [];
        }
      }
    }
  });
</script>

利用vue的双向数据绑定v-model命令,当勾选时,checkbox的value值会自动push到所绑定的数组checkData中去,省去了不少对dom的操作。

如果是固定选项这样是可以实现的,但是这种方法有一些弊端,双向绑定数组数据是写死的,不太灵活,如果增加了checkbox选项,要更改wach里绑定数组的长度判断。

有时候checkbox选项也是后台动态获取过来的,这样也灵活一些。

例如后台数据是这样的:

ajaxData: [{
    name: 'a',
    value: 'apple'
  },{
    name: 'b',
    value: 'banana'
  },{
    name: 'c',
    value: 'orange'
  }]

需要先动态渲染checkbox选项,在进行数据绑定。

<div id="app">
  <div class="checkbox">
    <label for="quan">
      <!-- 这里的 $event 是将当前对象传入进去,具体详情请参照vue官方文档 -->
      <input id="quan" type="checkbox" @click="checkAll($event)"> 全选
    </label>
    <label v-for="item in ajaxData">
      <!-- v-model 双向数据绑定命令 -->
      <input class="checkItem" type="checkbox" :value="item.value" v-model="checkData"> {{item.name}}
    </label>
  </div>
</div>
<script>
  new Vue({
    el: '#app',
    data(){
      return {
        ajaxData: [{ // 后台请求过来的数据
          name: '选项1',
          value: 'apple'
        },{
          name: '选项2',
          value: 'banana'
        },{
          name: '选项3',
          value: 'orange'
        }],
        checkData: [] // 双向数据绑定的数组
      }
    },
    watch: {
      checkData: { // 监视双向绑定的数组变化
        handler(){
          if(this.checkData.length == this.ajaxData.length){
            document.querySelector('#quan').checked = true;
          }else {
            document.querySelector('#quan').checked = false;
          }
        },
        deep: true
      }
    },
    methods: {
      checkAll(e){ // 点击全选事件
        if(e.target.checked){
          this.ajaxData.forEach((el,i)=>{
            // 数组里没有这一个value才push,防止重复push
            if(this.checkData.indexOf(el.value) == '-1'){ 
              this.checkData.push(el.value);
            }
          });
        }else { // 全不选选则清空绑定的数组
          this.checkData = [];
        }
      }
    }
  });
</script>

vue 实现全选全不选的示例代码

方法并不是最优的写法,也存在一些弊端,欢迎各位指点迷津,一起探讨。

github地址:https://github.com/zhangqian00/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 插件 任意位置浮动固定层
Dec 25 Javascript
JS 自动完成 AutoComplete(Ajax 查询)
Jul 07 Javascript
用javascript添加控件自定义属性解析
Nov 25 Javascript
EasyUi datagrid 实现表格分页
Feb 10 Javascript
jQuery实现网页顶部固定导航效果代码
Dec 24 Javascript
简单谈谈javascript中this的隐式绑定
Feb 22 Javascript
jQuery实现简单的网页换肤效果示例
Sep 18 Javascript
基于百度地图实现产品销售的单位位置查看功能设计与实现
Oct 21 Javascript
JavaScript的继承实现小结
May 07 Javascript
浅谈Angular6的服务和依赖注入
Jun 27 Javascript
jquery获取img的src值实例介绍
Jan 16 jQuery
Openlayers测量距离与面积的实现方法
Sep 25 Javascript
Angular开发实践之服务端渲染
Mar 29 #Javascript
使用vue2实现购物车和地址选配功能
Mar 29 #Javascript
vue axios请求拦截实例代码
Mar 29 #Javascript
JavaScript面试出现频繁的一些易错点整理
Mar 29 #Javascript
jQuery实现的上传图片本地预览效果简单示例
Mar 29 #jQuery
详解Javascript中new()到底做了些什么?
Mar 29 #Javascript
Koa2 之文件上传下载的示例代码
Mar 29 #Javascript
You might like
星际争霸秘籍
2020/03/04 星际争霸
PHP中文URL编解码(urlencode()rawurlencode()
2010/07/03 PHP
PHP jQuery表单,带验证具体实现方法
2014/02/15 PHP
初识laravel5
2015/03/02 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
利用PHP将图片转换成base64编码的实现方法
2016/09/13 PHP
PHP静态成员变量和非静态成员变量详解
2017/02/14 PHP
javascript 对象定义方法 简单易学
2009/03/22 Javascript
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
Javascript判断对象是否相等实现代码
2013/03/18 Javascript
js Calender控件使用详解
2015/01/05 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
Python多线程threading和multiprocessing模块实例解析
2018/01/29 Python
python中abs&amp;map&amp;reduce简介
2018/02/20 Python
tensorflow学习笔记之简单的神经网络训练和测试
2018/04/15 Python
不知道这5种下划线的含义,你就不算真的会Python!
2018/10/09 Python
python实现可变变量名方法详解
2019/07/01 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
毕业生物理教师求职信
2013/10/17 职场文书
中文专业毕业生自荐信
2014/05/24 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
python爬取豆瓣电影TOP250数据
2021/05/23 Python
拙作再改《我的收音机情缘》
2022/04/05 无线电