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 相关文章推荐
phpwind放自动注册方法
Dec 02 Javascript
jQuery解决iframe高度自适应代码
Dec 20 Javascript
jQuery获取当前对象标签名称的方法
Feb 07 Javascript
JavaScript判断textarea值是否为空并给出相应提示
Sep 04 Javascript
jQuery基于图层模仿五星星评价功能的方法
May 07 Javascript
JS原型对象的创建方法详解
Jun 16 Javascript
JavaScript面试题(指针、帽子和女朋友)
Nov 23 Javascript
关于Javascript中document.cookie的使用
Mar 08 Javascript
解决vue数组中对象属性变化页面不渲染问题
Aug 09 Javascript
vue中将html字符串转换成html后遇到的问题小结
Dec 10 Javascript
js逆向解密之网络爬虫
May 30 Javascript
javascript面向对象三大特征之继承实例详解
Jul 24 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
php输出xml格式字符串(用的这个)
2012/07/12 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
使用onbeforeunload属性后的副作用
2007/03/08 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
jQuery对象的selector属性用法实例
2014/12/27 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
Vue中的Props(不可变状态)
2018/09/29 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
[06:43]2018DOTA2国际邀请赛寻真——VGJ.Thunder
2018/08/11 DOTA
python单例模式实例分析
2015/04/08 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
python多线程并发实例及其优化
2019/06/27 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
浅谈tensorflow 中tf.concat()的使用
2020/02/07 Python
python海龟绘图之画国旗实例代码
2020/11/11 Python
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
新浪网技术部笔试题
2016/08/26 面试题
C#中的验证控件有几种
2014/03/08 面试题
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
旅游市场营销方案
2014/03/09 职场文书
保险专业求职信
2014/07/07 职场文书
十八大标语口号
2014/10/09 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书
关于JavaScript回调函数的深入理解
2021/06/27 Javascript