vue根据不同权限显示图片_vue多级权限组件的实现

首先实现递归checkbox的组件

假定,我们要实现的权限组件效果是这样的:

要实现点击系统,下面的都全选,点击基础功能,用户管理半选,系统半选。点击新增组织,如果基础功能没有选中,则基础功能改为选中。

0" :class="{'top_check':datas.parentId==0}">

{{datas.title}}

{{datas.title}}

0">

基础功能

0" @pchange="permitCheck" :key="d.id">

{{d.title}}

export default{

name:"permitnode",

props:{

datas:{

type:Object,

default:{}

}

},

data(){

return {

isIndeterminate:false,

childClick:true,

based:true

};

},

mounted(){

this.based=this.datas.checkState;

let count=0;

//初始化时判断自身时全选还是半选

this.datas.childResoList.forEach(it=>{

if(it.checkState){

count++;

}

});

if(count>0&&count

this.isIndeterminate=true;

this.datas.indeter=true;

}

if(count==0){

this.isIndeterminate=false;

this.datas.indeter=false;

}

if(count==this.datas.childResoList.length){

this.isIndeterminate=false;

this.datas.indeter=false;

}

},

//watch是监听数据的变化,所以change引起树的下级变化,

//下级变化调用leafcheck方法改变上层数据时,上层数据的值没有变,所以不会死循环

watch:{

"datas.checkState":function(val){

//如果是半选状态,则表明是由子组件引起的变化,不进行全选操作

if(this.datas.indeter==true){

return ;

}

//递归watch过来时,取消本身的半选状态。

this.isIndeterminate=false;

this.based=val;

//遍历全选子组件数据,子组件watch到变化全选算子组件

for(let i=0;i

let tmp=this.datas.childResoList[i];

tmp.checkState=this.datas.checkState?true:false;

if(tmp.childResoList&&tmp.childResoList.length>0){

tmp.indeter=false;

//全选时改变半选状态

}

this.datas.childResoList.splice(i,1,tmp);

}

}

},

methods:{

handleCheckAllChange(val){

//点击上面的全选按钮时,改变全选状态,出发watch变化

this.isIndeterminate=false;//取消自身的半选状态

this.datas.indeter=false;

//向上触发事件,改变上层checkbox的变化

this.$emit("pchange");

},

//子组件变化时触发的pchange事件

permitCheck(){

this.leafcheck();

},

//基础权限选中,则父权限选中,基础权限取消,则全部取消选中。

basecheck(){

if(this.based==false){

this.datas.checkState=false;

this.isIndeterminate=false;

this.datas.indeter=false;

}else{

this.datas.checkState=true;

this.isIndeterminate=true;

this.datas.indeter=true;

}

this.$emit("pchange");

},

//叶子checkebox变化时,包括子组件变化

leafcheck(val){

let count=0;

let hasIndeter=false;

//计算选中的数值,是不是达成了全选的状态

this.datas.childResoList.forEach(it=>{

if(it.checkState){

//判断其中是否有半选的

if(it.indeter!=undefined){

if(it.indeter==true){

hasIndeter=true;

}

}

count++;

}

});

//parentId!=0不是第一级权限

if(this.datas.parentId!=0){

if(val&&this.based==false){

this.based=true;

this.datas.checkState=true;

}

//当checkbox选中时,这时候based必为true

if(count

//this.datas.checkState=true;

//indeter用来表示数据是否是显示为半选状态

this.datas.indeter=true;

this.isIndeterminate=true;

}else{

if(hasIndeter){

this.datas.indeter=true;

this.isIndeterminate=true;

}else{

this.datas.indeter=false;

this.isIndeterminate=false;

}

}

}else{

console.log("count:"+count);

if(count>0&&count

this.datas.indeter=true;

this.isIndeterminate=true;

this.datas.checkState=true;

//indeter用来表示数据是否是显示为半选状态

}

//基础权限也没选中时

if(count==0){

this.datas.indeter=false;

this.isIndeterminate=false;

this.datas.checkState=false;

}

//因为选中和半选都是选中状态,所以要做一下半选显示状态的区分

//全部选中,且没有半选显示状态的。

if(count==this.datas.childResoList.length&&hasIndeter==false){

this.datas.indeter=false;

this.isIndeterminate=false;

this.datas.checkState=true;

}

//全部选中,但是有是半选显示状态的

if(count==this.datas.childResoList.length&&hasIndeter==true){

this.datas.indeter=true;

this.isIndeterminate=true;

this.datas.checkState=true;

}

}

//向上层反馈变化

this.$emit("pchange");

}

}

}

.permit_cont{color:#fff;font-size:12px;line-height: 2;}

.permit_hr{border-bottom: 1px solid #2F3B52;margin:10px 0;}

.top_check{margin-bottom:20px;}

之后需要在这个组件外面套一层组件,提供一个方法来获取选中的checkbox

import permitNode from '@/components/public/permit_node'

export default{

props:{

chess:{

type:Array,

default:[]

},

rootId:{

type:Number,

defualt:0

}

},

components:{

permitNode

},

data(){

return {

};

},

methods:{

//遍历获取树型数据中选中的checkbox的id

getCheckedKey(){

let arr=[];

let keyarr=this.getCheckedByCircle(this.chess,arr);

return keyarr;

},

getCheckedByCircle(keys,arr){

for(let i=0;i

let tmp=keys[i];

if(tmp.checkState){

arr.push(tmp.id);

}

if(tmp.childResoList.length>0){

this.getCheckedByCircle(tmp.childResoList,arr);

}

}

return arr;

}

}

}

第二个组件上面的v-for是因为权限要像tab页签一样分多个模块,根据模块的选中状态展现不同的权限选项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux自带磁盘加密工具下载,TrueCrypt(磁盘加密工具)

TrueCrypt是一款功能强大的虚拟磁盘加密工具,它能够在硬盘上创建一个或多个虚拟磁盘,并且自动加密磁盘文件,提供AES-256、Blowfish、Serpent等多种加密算法,用户可以同时采取两个或多个来提高加密效果,软件体积小巧&am…

JS如何控制checkbox的全选反选

JS代码&#xff1a; 1 <script language"javascript" type"text/javascript">2 3 //转载请保留出处 http://www.dwww.cn 4 function unselectall() {5 if (document.getElementById("chkAll").checked) {6 …

[交互]交互的实战问题2

[交互]交互的实战问题2 axios升级导致的问题axios 设置请求 header 方式 多页签时&#xff0c;切换页签是否应该取消交互请求 axios升级导致的问题 axios 设置请求 header 方式 axios 早期设置请求 header 方式 config.headers.common.set(Pragma, no-cache)有一天发现该方式…

虚拟同步发电机_一种光储型虚拟同步机介绍

专利权人 广东电网有限责任公司摘要&#xff1a;本实用新型实施例公开了一种光储型虚拟同步机&#xff0c;包括逆变器、光伏列、储能装置、本地负荷、开关和电网&#xff0c;所述光伏阵列通过第一DC/DC转换器连接在所述逆变器的直流母线上&#xff0c;所述储能装置通过第二DC/D…

windows 和linux查看硬件信息,Linux下如何查看硬件信息?

我们在 Linux 下进行开发时&#xff0c;有时也需要知道当前的硬件信息&#xff0c;比如&#xff1a;CPU几核&#xff1f;使用情况&#xff1f;内存大小及使用情况&#xff1f;USB设备是否被识别&#xff1f;等等类似此类问题。下面良许介绍一些常用的硬件查看命令。lshw 这个命…

YUI3下widget的plugin开发

最近在尝试使用YUI3重建ExtFrame框架&#xff0c;使用YUI3做为更佳的UI和JS支持 和ExtJS比&#xff0c;YUI3的UI看起来缺少了足够的UI控件&#xff0c;但是&#xff0c;YUI3的widget开发更灵活&#xff08;也更难掌握&#xff09;&#xff0c;YUI3的widget操作更多的基于DOM封装…

雅可比行列式_夏七八写:关于“斜二测画法”与雅可比行列式的关系的想法

最开始思考这两种有没有关系的时候也是偶然&#xff0c;&#xff0c;受到启发&#xff1a;雅可比行列式有什么意义呢&#xff0c;为什么对于像 的式子为什么要其后乘上一个雅可比行列式的绝对值呢&#xff1f;在说我的想法之前&#xff0c;我想可能要先提一下一些预备知识&…

linux6.7能升级6.8吗,CentOS 六、7升级gcc至4.八、4.九、5.二、6.三、7.3等高版本

CentOS 7虽然已经出了不少年了&#xff0c;但依然会有不少人选择安装CentOS 6&#xff0c;CentOS 6有些依赖包和软件都比较老旧&#xff0c;现在天的主角gcc编译器&#xff0c;CentOS 6的gcc版本为4.4&#xff0c;CentOS 7为4.8。gcc 4.8最主要的一个特性就是全面支持C11&#…

JSP获取当前时间

JSP获取当前时间一、先看看如何取当前时间并显示的代码 ------------------------------------------------ <% java.text.SimpleDateFormat formatter new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Date currentTime new java.util.Date…

bisect git 使用_让 Git Bisect 帮助你

最后一步&#xff0c;这次是坏的。$ git bisect bad458eab0eb8d808e16d98ec7039a7c53855dd9ed6 is the first bad commitcommit 458eab0eb8d808e16d98ec7039a7c53855dd9ed6Author: Rodrigo Flores Date: Tue Oct 21 22:31:05 2014 -0200added 1013:100644 100644 7bc3db7f48a…

linux shell中各种分号和括号,linux shell 各种分号,括号使用方法总结

各种括号的用法总结如下1.Shell中变量的原形&#xff1a;${var}大家常见的变量形式都是$var2.命令替换$(cmd)命令替换$(cmd)和符号cmd(注意这不是单引号&#xff0c;在美式键盘上&#xff0c;是ESC下面的那个键)有相同之处3.一串的命令执行()和{}()和{}都是对一串的命令进行执行…

restful get不传参数404_你知道什么是 Restful 风格吗?SpringMVC 带我们实现它!

Restful 风格的 API 是一种软件架构风格&#xff0c;设计风格而不是标准&#xff0c;只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁&#xff0c;更有层次&#xff0c;更易于实现缓存等机制。在 Restful 风格中&a…

ASP.NET MVC中同步与异步

1.MvcHandler总是调用BeginProcessRequest/EndProcessRequest方法以异步的方式来处理请求2.Controller分别实现了IController和IAsyncController两个接口&#xff0c;所以当激活的Controller对象在MvcHandler的BeginProcessRequest方法中是按照这样的方式执行的&#xff1a;Con…

linux搭建spark集群,详解Spark+Zookeeper搭建高可用Spark集群

Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎&#xff1b;现在形成一个高速发展应用广泛的生态系统。Spark三种分布式部署方式比较目前Apache Spark支持三种分布式部署方式&#xff0c;分别是standalone、spark on mesos和 spark on YARN&#xff0c;详情参考。…

wifiwan口速率什么意思_无线路由器怎么设置wan口速率

wan口速率是设置无线路由器的wan口以什么速率方式工作&#xff0c;此设置不当会导致网速降低&#xff0c;下面是学习啦小编整理的无线路由器设置wan口速率的方法&#xff0c;供您参考。无线路由器设置wan口速率的方法在Wan口的设置中&#xff0c;当我们完成了基本的设置后&…