在Vue中如何操作自定义指令实现checkbox全选功能

下面我就为大家分享一篇vue自定义指令实现checkbox全选功能的方法,具有很好的参考价值,希望对大家有所帮助。

最近做的一个项目需要用到Vue实现全选功能,参考了一下网上的做法,发现用属性计算的复用性不高,于是选用自定义指令,但网上的做法大多是会对原始数据有一定的格式要求,而且没有返回结果,于是做了改进。

上代码:

nbsp;html>         

   全选  

登录后复制              {{item.demo}}         

   customerResult: {{customerResult}}  

       var vm = new Vue({ el: “#app”, data:function(){ return { list:[{demo:1}, {demo:2}, {demo:3}], allCheck:'', customerResult:'', } }, directives: { 'check-all': { twoWay: true, params: ['checkData','result','key'], bind() { /*为原始数据的每一个对象添加一个checked属性*/ this.vm[this.params.checkData].forEach((item)=>{ Vue.set(item,'checked',false) }); /*提取被选中的项*/ this.setValue=function(){ let result=[] this.vm[this.params.checkData].forEach((item) => { if(item.checked){ result.push(item[this.params.key]) } }); this.vm[this.params.result]=result } /*如果所有的列表的checked属性都为true,则选中全选框,否则不选中全选框 */ this.vm.$watch(this.params.checkData, (data) => { if(data.every((item) => item.checked)) { this.set(true); } else { this.set(false); } this.setValue() }, {deep: true}); }, // checkAll发生更改时 update(checkAll) { /*如果全选框被选中,则将列表的所有checked属性转为true,否则转为false */ if(checkAll) { this.vm[this.params.checkData].forEach((item) => { item.checked = true; }); } else { this.vm[this.params.checkData].forEach((item) => { item.checked = false; }); } this.setValue() }, }, } })  

通常我们都要获取原始数据中的某个键值,可在“key”中填进想要获取的键值,“result”就是被选中的项了。
有时,我们需要返回一个完整的对象修改一下代码,当不输入key时,返回一个完整的对象数组

立即学习“前端免费学习笔记(深入)”;

this.setValue=()=>{ let result=[] this.vm[this.params.checkData].forEach((item) => {  //删除checked属性  let temp={};  (()=>delete Object.assign(temp,item).checked)();  item.checked?result.push(item[this.params.key]||temp):""; }); this.vm[this.params.result]=result}

登录后复制

但时,这时,返回来的数组中对象中并没有与与原数据是相同的引用地址,当需要使用array.$remove()函数时就会失败,新增一个relative参数,用户自定义判断返回的数据是否与原始数据关联

this.setValue = () => { let result = [] this.vm[this.params.checkData].forEach((item) => {  if(this.params.relative) {   item.checked ? result.push(item) : "";  }else{   //删除checked属性   let temp = {};   (() => delete Object.assign(temp, item).checked)();   item.checked ? result.push(item[this.params.key] || temp) : "";  } }); this.vm[this.params.result] = result}

登录后复制

当数据长度大于2个时,需要判断2N次,相当消耗性能,优化一下:

'check-all', {  twoWay: true,  params: ['checkData', 'result', 'key','relative'],  /*checkData:列表数据,  result:返回的结果,  key:列表数据中需要返回的字段,  relative:是否返回与列表数据相同引用地址的选中结果*/  bind() {   /*提取被选中的项*/  this.setValue = () => {   let result = []   if (this.params.relative) {    this.vm[this.params.checkData].forEach((item) => {     item.checked ? result.push(item) : "";    });   } else {    this.vm[this.params.checkData].forEach((item) => {     //删除checked属性     let temp = {};     (() => delete Object.assign(temp, item).checked)();     item.checked ? result.push(item[this.params.key] || temp) : "";    });   }   this.vm[this.params.result] = result  };   /*为原始数据的每一个对象添加一个checked属性*/  this.addChecked = () => {   this.vm[this.params.checkData].forEach((item) => {    Vue.set(item, 'checked', false)   });  };  /*如果所有的列表的checked属性都为true,则选中全选框,否则不选中全选框 */  this.vm.$watch(this.params.checkData, (data) => {   if(!data.length) return;   data.every((item) => item.checked) ? this.set(true) : this.set(false);   this.setValue()  }, {deep: true});  //当列表发生变化时重新绑定  this.vm.$watch(this.params.checkData, (data) => {   if(!data.length) return   this.addChecked();  });  },  // checkAll发生更改时   update(checkAll) {   /*如果全选框被选中,则将列表的所有checked属性转为true,否则转为false */   checkAll ? this.vm[this.params.checkData].forEach((item) => {    item.checked = true   }) : this.vm[this.params.checkData].forEach((item) => {    item.checked = false   });   this.setValue()  }, }

登录后复制

这时只需要判断N+1次。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

p5.js入门教程之鼠标交互的示例

Vue 实现双向绑定的四种方法

Vue-路由导航菜单栏的高亮设置方法

以上就是在Vue中如何操作自定义指令实现checkbox全选功能的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2750370.html

(0)
上一篇 2025年3月8日 05:35:07
下一篇 2025年3月8日 05:35:14

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 怎样编写可自定义维护JS代码

    这次给大家带来怎样编写可自定义维护js代码,编写可自定义维护js代码的注意事项有哪些,下面就是实战案例,一起来看一下。 1.1 格式化 关于缩进层次: 我不想挑起“Tab or Space”和“2 or 4 or 6 or 8 Space”…

    编程技术 2025年3月8日
    200
  • 使用JS怎样实现最简单的跨域

    这次给大家带来使用JS怎样实现最简单的跨域,使用JS实现最简单的跨域注意事项有哪些,下面就是实战案例,一起来看一下。 有一天有人跑来跟我定方案,问我cors是什么原理,一脸懵逼,跨域我只知道jsonP啊,眼看一个装逼的机会就要失去了。“我现…

    编程技术 2025年3月8日
    200
  • 怎样使用Vuejs自定义路由

    这次给大家带来怎样使用vuejs自定义路由,使用vuejs自定义路由的注意事项有哪些,下面就是实战案例,一起来看一下。 我们知道组件可以通过 template 来指定模板,对于单文件组件,可以通过 template 标签指定模板,除此之外,…

    编程技术 2025年3月8日
    200
  • 如何使用element-ui表格实现单元格可编辑

    下面我就为大家分享一篇element-ui 表格实现单元格可编辑的示例,具有很好的参考价值,希望对大家有所帮助。 如下所示:       {{ scope.row.name }}              export default{ d…

    编程技术 2025年3月8日
    200
  • vue中dialog弹框如何实现

    下面我就为大家分享一篇vue中简单弹框dialog的实现方法,具有很好的参考价值,希望对大家有所帮助。 效果如下,dialog中内容自行添加            x   empty       登录后复制 接收父组件传参isShow,并返…

    2025年3月8日
    200
  • 关于Angular4 中内置指令的基本用法

    下面这篇文章主要给大家介绍了关于angular4中内置指令的基本用法,文中通过示例代码介绍的非常详细,需要的朋友们下面来一起看看吧。 不得不说指令是ng最为强大的功能之一,好吧,也可以去掉之一,是最强大的功能。 前言 大家都知道ng内置了许…

    编程技术 2025年3月8日
    200
  • CodeSmith生成实体类是如何实现的

    本篇文章给大家带来的内容是关于codesmith生成实体类是如何实现的,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 /**本代码由代码生成器自动生成,请不要更改此文件的任何代码。*生成时间:*生成者:*/using Sy…

    编程技术 2025年3月8日
    200
  • 浅谈angular中@、=、&指令的差异

    本篇文章带大家了解一下angular指令中@,=,&的区别。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 【相关推荐:《angular教程》】 当directive中的scope设置为一个对象的时候,该指令就有了…

    2025年3月7日
    200
  • 浅谈angular中控制器、服务和指令的关系

    本篇文章给大家介绍一下angular控制器、服务和指令三者之间的关系。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 【相关推荐:《angular教程》】 从总体来看,这三个组件的关系如下所示: 服务负责从远端服务器抓取和…

    2025年3月7日
    200
  • 浅谈angular指令中的4种设计模式

    本篇文章给大家介绍一下angular指令中的4种设计模式。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 【相关推荐:《angular教程》】 指令的功能集非常丰富,不过我们已经发现了指令的帕累托分布:使用angular编…

    2025年3月7日
    200

发表回复

登录后才能评论