computed与watch监听同一对象的场景
今日项目需要一个详细的权限配置,如:路由权限,页面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时也确实重新
赋值了,也调用了该mutantion的 SET_PERMISS_ARR
3. 修改mutations
根据上面测试,推断是不是state.permissArr = permiss重新为getGermissArr赋值操作未成功
于是改为 set将其重新指定属性值

这个是可以解决在用户首次登录后数据更新正确,但是在页面再次刷新后,computed 中的 getGermissArr却始终为空数组???
后来在页面增加watch 对getGermissArr进行监听,如下:

控制台查看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监听同一对象的场景的更多相关文章
- Vue之计算属性Computed和属性监听Watch,Computed和Watch的区别
一. 计算属性(computed) 1.计算属性是为了模板中的表达式简洁,易维护,符合用于简单运算的设计初衷. 例如: <div id="app"> {{ myname ...
- Vue中计算属性(computed)和监听属性函数watch的比较
1.计算属性适用的情形我们可能会有这样的需求,一个数据属性在它所依赖的属性发生变化时,也要发生变化,这种情况下,我们最好使用计算属性.例如在下面这个例子中,如果我们使用监听函数,代码就会变得有点冗余. ...
- computed配合watch监听对象数据
- Android-应用安装/替换/卸载/广播监听
在上一篇博客Android-开关机的广播,中介绍了,如何订阅接收者,去接收系统发送的开机/关机广播, 而这篇博客是订阅接收者 去接收应用的(安装/替换/卸载) 三种广播 订阅 接收者 去接收 应用的 ...
- 使用KVO键值监听
本文章从五个方面介绍KVO(Key-Value-Observer)键值观察者: (1)功能介绍 (2)使用步骤 (3)应用场景 (4)原理理解 (5)相关的面试题 一 功能介绍 KVO是OC语言对「观 ...
- spring中的事件发布与监听
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. spring事件发布与监听的应用场景 当处理完一段代码逻辑,接下来需要同 ...
- vue中的computed(计算属性)和watch(监听属性)的特点,以及深度监听
//计算属性是根据data中已有的属性,计算得到一个新的属性, <div>全名:{{fullName}}</div> 创建计算属性通过computed关键字,它是一个对象 计算 ...
- vue computed计算属性 watch监听
计算属性 computed:{ 变量:function(){ return 计算好的值 } } 这时候计算好的值 就付给了你的变量 在实例中可以this.使用 注意 声明的变量的data中不可以重复声 ...
- vue computed计算属性和watch监听属性解疑答惑
computed计算属性 计算属性类似于方法,用于输出data中定义的属性数据的结果,data数据变化时,计算属性的结果会同步变化,需要注意的是计算属性不可与data定义的属性同名. 相比于方 ...
- vue里的watch 和 computed 监听的不同
1.computed里是偏向于通过监听data里的值变化后,经过运算返回一个新的计算结果, 所以k不能与data里的k重名,并且必须有return, 能够缓存,依赖的值不变化不会进行重复计算: 而wa ...
随机推荐
- c++的thread小测试
windows环境还用不了thread,得下一些mingw,弄了半天没弄好,直接用了商店中心就有的Ubuntu了,但是sudo install g++出现了下载不了的问题,解决方案:https://b ...
- GRU简介
一.GRU介绍 GRU是LSTM网络的一种效果很好的变体,它较LSTM网络的结构更加简单,而且效果也很好,因此也是当前非常流形的一种网络.GRU既然是LSTM的变体,因此也是可以解决RNN网络中的长依 ...
- WordPress回复/评论本文可见
给WordPress添加一个实用的小功能,那就是回复可见,评论文章才能见到隐藏内容. 在主题目录下找到functions.php文件,在合适位置添加下方的代码: // 回复可见 function re ...
- ACM-NEFUOJ-最小树-Prim算法
最小树1 Description 某省长调查交通情况,发现本省交通事故发生不断,于是决定在本省内全部修建地铁. 该省长得到的统计表中列出了任意两市之间的距离,为了确保任何两个市都可以直接 或者间接实现 ...
- ARM 详解
一.ARM 的发展史 ARM 的发展历史可以追溯到 1978 年,当年克里斯·库里(Chris Currry)所任职的公司遭遇财务危机,发展每况愈下,库里在和创始人深入沟通后,决定离职.当时的库里对微 ...
- C++ 标准库 sort() / stable_sort() / partial_sort() 对比
C++ STL标准库中提供了多个用于排序的Sort函数,常用的包括有sort() / stable_sort() / partial_sort(),具体的函数用法如下表所示: 函数 用法 std::s ...
- Java 开源项目整合
在JAVA学习过程中,学习到的简单项目,在这里记录下. SSM框架的整合 使用到的框架:SpringMVC + Spring + MyBatis 地址:https://github.com/liyif ...
- day17:内置方法&math模块&random模块&pickle模块
内置方法 1.round:四舍五入 正常遵守四舍五入,但在n.5结构中,n为偶数则舍去,n为奇数则进一. res1 = round(4.51) # 5 res2 = round(4.5) # 4 re ...
- handler+looper+messagequeue源码解析
https://www.jianshu.com/p/b4d745c7ff7ahandler机制源码1.handler机制的作用在多线程的场景中,将子线程中需要更新UI的操作信息传递到UI主线程.多个线 ...
- SQL优化(二)-- 慢查询
1.慢查询日志 MYSQL的慢查询日志是Mysql提供的一种日志记录方式,它主要是用来记录mysql执行语句过程中,响应时间超过阀值的语句,这个阀值可以通过long_query_time去指定,比如说 ...