今日项目需要一个详细的权限配置,如:路由权限,页面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. 把 ChatGPT 加入 Flutter 开发,会有怎样的体验?

    前言 ChatGPT 最近一直都处于技术圈的讨论焦点.它除了可作为普通用户的日常 AI 助手,还可以帮助开发者加速开发进度.声网社区的一位开发者"小猿"就基于 ChatGPT 做了 ...

  2. Java面试——MyBatis

    一.MyBatis 与 JDBC 的区别 [1]JDBC 是 Java 提供操作数据库的 API:MyBatis 是一个持久层 ORM 框架,底层是对 JDBC 的封装.[2]使用 JDBC 需要连接 ...

  3. Netty 线程模型(Reactor 线程模型)

    更多内容,前往个人博客 当说到 Netty 线程模型的时候,一般首先会想到经典的 Reactor 线程模型,尽管不同的 NIO 框架对于 Reactor 模式的实现存在差异,但本质上还是遵循了 Rea ...

  4. 在线调试工具 Arthas

    Arthas(阿尔萨斯) 是 Alibaba开源的一款 Java在线诊断工具,能够分析,诊断,定位Java应用问题,例如:JVM信息,线程信息,搜索类中的方法,跟踪代码执行,观测方法的入参和返回参数等 ...

  5. ARC149(A~E)

    Tasks - AtCoder Regular Contest 149 又是114514年前做的题,现在来写 屯了好多,清一下库存 A - Repdigit Number (atcoder.jp) 直 ...

  6. mumpy常用函数

    numpy.array(list(1,2,3,4)) #将一个list类型/tupe类型数据转换为一个array数组对象 #默认所有的数据类型都是相同,若传进来的参数类型不同,则遵循以下优先级: st ...

  7. [Java SE/JDK]Intellij IDEA中设置JDK版本

    1 Intellij IDEA 修改JDK版本 第1步:配置JDK环境变量 装好JDK之后,要添加一个环境变量:JAVA_HOME 第2步:修改Idea配置 由Maven决定的版本 <build ...

  8. [Linux]常用命令之【mkdir/touch/cp/rm/ls/mv】

    cp 将来源文件夹packageA下的所有目录及文件复制到新文件夹packageB下,形成: /packageB/... # cp -r /home/packageA/* /home/cp/packa ...

  9. 使用Go语言操作HDFS

    HDFS(Hadoop分布式文件系统)是Hadoop生态系统的一部分,它是一个可扩展的分布式文件系统,被设计用于在大规模数据集上运行的应用程序 安装相关package: $ go get github ...

  10. Java与Mysql锁相关知识总结

    锁的定义 在计算机程序中锁用于独占资源,获取到锁才可以操作对应的资源. 锁的实现 锁在计算机底层的实现,依赖于CPU提供的CAS指令(compare and swsp),对于一个内存地址,会比较原值以 ...