今日项目需要一个详细的权限配置,如:路由权限,页面tabs权限,操作权限;而路由权限大都知道就不赘述,而操作权限这就涉及页面中每个按钮了,这里使用VUEX进行管理

1.配置store

store 中 user.js 配置如下

const mutations = {
SET_PERMISS_ARR: (state, permiss) => {
state.permissArr = permiss
}
}
const actions = {
// 获取权限
getauthList({ commit }) {
return new Promise((resolve, reject) => {
getauthList()
.then(response => {
// eslint-disable-next-line eqeqeq
if (response && response.data.code == 0) {
const dataInfo = response.data
if (dataInfo.data && dataInfo.data.length > 0) {
const resFormatArr = formatDataPermiss(dataInfo.data)
commit('SET_PERMISS_ARR', resFormatArr)
}
resolve(dataInfo)
}
})
.catch(error => {
reject(error)
})
})
},
}
function formatDataPermiss(data, lastSpace = '') {
const resArrs = []
data.forEach(item => {
if (item.childs && item.childs.length > 0) {
const eachItem = formatDataPermiss(item.childs, lastSpace + '/' + item.space)
resArrs.push.apply(resArrs, eachItem)
} else {
if (item.functions && item.functions.length > 0) {
item.functions.forEach(childItem => {
const joinStr = `${lastSpace}/${item.space}/${childItem.action}`
resArrs.push(joinStr)
})
} else {
resArrs.push(lastSpace + '/' + item.space,)
}
}
})
return resArrs
}
export default {
namespaced: true,
state,
mutations,
actions
}

getters.js 配置如下

const getters = {
getGermissArr: state => state.user.permissArr
}
export default getters

其中getauthList()在获取到权限列表后,使用getGermissArr进行存储

页面通过v-if = "getGermissArr.includes('/people/peopleBasic/info')"进行按钮隐藏与显示

getGermissArr值为['/people/peopleBasic/edit','/people/peopleBasic/info', ...]

在页面具体操作中传入对应值进行匹配,如果存在及判定该用户拥有该操作权限)

然而这一切并未像预料的那么顺利,如下

2. 运行测试

测试截图



测试中发现,如管理员登录菜单是编辑,查看,在此给另一个用户配置权限只有编辑这个操作,然后

管理员退出,再使用刚配置的用户进行登录,发现数据操作都有,显然这数据没有更新还是是上一次

管理员的操作权限的缓存然而我在每次登录的时候都调用过对应的权限方法,debugger时也确实重新

赋值了,也调用了该mutantionSET_PERMISS_ARR

3. 修改mutations

根据上面测试,推断是不是state.permissArr = permiss重新为getGermissArr赋值操作未成功

于是改为 set将其重新指定属性值



这个是可以解决在用户首次登录后数据更新正确,但是在页面再次刷新后,computed 中的 getGermissArr却始终为空数组???

后来在页面增加watchgetGermissArr进行监听,如下:



控制台查看computed 与watch 对 getGermissArr 监听后log打印



看上图

第一行是getUserPermission()方法中打印的this.getGermissArr

第二行是watch 中打印的

显然getUserPermission()方法比 watch 先执行why?


个人认为 这里就是`computed`与`watch`的本质区别,`computed`监听的是这个响应式对象的变法,而 `watch`是监听这个对象的值的变化 在` VUE.set(state, 'permissArr', permiss)`的时候`computed`监测到`permissArr`有变化, 他立马响应到了`getUserPermission()`这个操作中的`this.getGermissArr`, 而这个点`set`刚把 `permissArr`清空尚未将新值赋值过去,所以页面得到的`getGermissArr`还是一个`[]` 而watch监测到`permissArr`被赋值了新值才真正相应`getGermissArr` 所以对应这个场景 `computed`适用于第一次登陆对应`permissArr`对象更新的监听,`watch `适用于监 听页面刷新`permissArr`再次赋值

好啦个人能力有限以上记录纯属个人理解推测,不准确处望评论指点谢谢

computed与watch监听同一对象的场景的更多相关文章

  1. Vue之计算属性Computed和属性监听Watch,Computed和Watch的区别

    一. 计算属性(computed) 1.计算属性是为了模板中的表达式简洁,易维护,符合用于简单运算的设计初衷. 例如: <div id="app"> {{ myname ...

  2. Vue中计算属性(computed)和监听属性函数watch的比较

    1.计算属性适用的情形我们可能会有这样的需求,一个数据属性在它所依赖的属性发生变化时,也要发生变化,这种情况下,我们最好使用计算属性.例如在下面这个例子中,如果我们使用监听函数,代码就会变得有点冗余. ...

  3. computed配合watch监听对象数据

  4. Android-应用安装/替换/卸载/广播监听

    在上一篇博客Android-开关机的广播,中介绍了,如何订阅接收者,去接收系统发送的开机/关机广播, 而这篇博客是订阅接收者 去接收应用的(安装/替换/卸载) 三种广播 订阅 接收者 去接收 应用的 ...

  5. 使用KVO键值监听

    本文章从五个方面介绍KVO(Key-Value-Observer)键值观察者: (1)功能介绍 (2)使用步骤 (3)应用场景 (4)原理理解 (5)相关的面试题 一 功能介绍 KVO是OC语言对「观 ...

  6. spring中的事件发布与监听

    点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. spring事件发布与监听的应用场景 当处理完一段代码逻辑,接下来需要同 ...

  7. vue中的computed(计算属性)和watch(监听属性)的特点,以及深度监听

    //计算属性是根据data中已有的属性,计算得到一个新的属性, <div>全名:{{fullName}}</div> 创建计算属性通过computed关键字,它是一个对象 计算 ...

  8. vue computed计算属性 watch监听

    计算属性 computed:{ 变量:function(){ return 计算好的值 } } 这时候计算好的值 就付给了你的变量 在实例中可以this.使用 注意 声明的变量的data中不可以重复声 ...

  9. vue computed计算属性和watch监听属性解疑答惑

    computed计算属性     计算属性类似于方法,用于输出data中定义的属性数据的结果,data数据变化时,计算属性的结果会同步变化,需要注意的是计算属性不可与data定义的属性同名. 相比于方 ...

  10. vue里的watch 和 computed 监听的不同

    1.computed里是偏向于通过监听data里的值变化后,经过运算返回一个新的计算结果, 所以k不能与data里的k重名,并且必须有return, 能够缓存,依赖的值不变化不会进行重复计算: 而wa ...

随机推荐

  1. Java8 lambda常用操作

    参考博客:https://www.cnblogs.com/hmy-1365/p/12923435.html

  2. Linux & 标准C语言学习 <DAY2>

    vim文本编辑器:     可以直接在终端下采用纯键盘操作的一款文本编辑器,号称编辑器之神,可以二次升级.可以扩展     基础用法:         1.进入vim:             输入 ...

  3. CF309E 题解

    11:30,过题.12:50,忘记做法. 吃饭时不该看未来日记的,Ynoj 害人不浅(确信). 以上为个人吐槽. 题目大意 不知道题目翻译是个啥...但讨论区有大佬给出了精确的翻译.我改得符合题目背景 ...

  4. java方法参数(超详细)

    前言 在上一篇文章中,壹哥给大家讲解了方法的定义.调用和返回值,但方法的内容还有很多,比如方法的参数是怎么回事?接下来壹哥会在这篇文章中,继续给大家讲解方法参数相关的知识,这就是我们今天要学习的内容. ...

  5. SpringBoot——配置嵌入式 Servlet容器

    更多内容,前往 IT-BLOG 一.如何定制和修改Servlet容器的相关配置 前言:SpringBoot 在Web 环境下,默认使用的是 Tomact 作为嵌入式的 Servlet容器: ​[1]修 ...

  6. 基于Labelstudio的UIE半监督智能标注方案(本地版)

    基于Labelstudio的UIE半监督智能标注方案(本地版) 更多技术细节参考上一篇项目,本篇主要侧重本地端链路走通教学,提速提效: 基于Labelstudio的UIE半监督深度学习的智能标注方案( ...

  7. Android Banner - ViewPager 02

    Android Banner - ViewPager 02 现在来给viewpager实现的banenr加上自动轮播 自动轮播的原理,使用handler的延迟消息来实现. 自动轮播实现如下内容 开始轮 ...

  8. 二进制安装Kubernetes(k8s) v1.26.1 IPv4/IPv6双栈 可脱离互联网

    二进制安装Kubernetes(k8s) v1.26.1 IPv4/IPv6双栈 可脱离互联网 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star ...

  9. 创建用户认证授权的 kubeconfig 文件

    创建用户认证授权的 kubeconfig 文件 当我们安装好集群后,如果想要把 kubectl 命令交给用户使用,就不得不对用户的身份进行认证和对其权限做出限制. 下面以创建一个 cby 用户并将其绑 ...

  10. flask-wtf使用

    Web应用程序的一个重要方面是为用户提供一个用户界面.HTML提供了一个 标签,用于设计一个接口.一个Form 元素,例如文本输入,单选框等可以适当地使用. 通过GET或POST方法将用户输入的数据以 ...