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 (三) 管理jQuery包装集
Feb 23 Javascript
JavaScript splice()方法详解
Sep 22 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
Jul 08 Javascript
jquery实现转盘抽奖功能
Jan 06 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
Mar 30 Javascript
详解vue跨组件通信的几种方法
Jun 15 Javascript
React/Redux应用使用Async/Await的方法
Nov 16 Javascript
深入理解Vue router的部分高级用法
Aug 15 Javascript
vue+SSM实现验证码功能
Dec 07 Javascript
vue+egg+jwt实现登录验证的示例代码
May 18 Javascript
vue之debounce属性被移除及处理详解
Nov 13 Javascript
Vue3.0中Ref与Reactive的区别示例详析
Jul 07 Vue.js
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
php压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
php使用websocket示例详解
2014/03/12 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
基于jQuery的js分页代码
2010/06/10 Javascript
Jquery为a标签的href赋值实现代码
2013/05/03 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
手机平板等移动端适配跳转URL的js代码
2014/01/25 Javascript
使用jQuery操作HTML的table表格的实例解析
2016/03/13 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
JQuery Ajax 异步操作之动态添加节点功能
2017/05/24 jQuery
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
React实现评论的添加和删除
2020/10/20 Javascript
python网页请求urllib2模块简单封装代码
2014/02/07 Python
python实现聚类算法原理
2018/02/12 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
python快排算法详解
2019/03/04 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
关于Java finally的面试题
2016/04/27 面试题
模具专业毕业生自荐书范文
2014/02/19 职场文书
《孔子拜师》教学反思
2014/02/24 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
2014年学生工作总结
2014/11/20 职场文书
Python 实现定积分与二重定积分的操作
2021/05/26 Python
canvas 中如何实现物体的框选
2022/08/05 Javascript