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 ...
随机推荐
- Feign报错:The bean 'xxxxx.FeignClientSpecification' could not be registered.
解决方法: spring: main: allow-bean-definition-overriding: true 参考博客:https://www.cnblogs.com/lifelikeplay ...
- fpm模式下读取到is_cli为何为true
目录 问题出现和简单排查 排查 经过思考和猜测,严重怀疑是fpm读取到了cli下的opcache 原起 粗浅探索 测试代码 opcache配置 共享内存缓存与文件缓存 php-fpm下读取到is_cl ...
- java选择结构-if
java选择结构-if if单选泽结构 if双选择结构 if多选择结构 if嵌套结构 package charpter2; import com.sun.xml.internal.ws.address ...
- consumer goods cloud 之后续慢慢看系列
继之前的内容和帮助文档之外,整理一些其他有用的CG资源,有时间可以深入学习一下. 零售执行: https://rise.articulate.com/share/R9_PIF3mcNMuAi4iUtA ...
- 安装Windows10后电脑整体速度变慢
是不是觉得从旧版本Windows系统比如(Windows 7)升级到Windows10以后,感觉什么操作都变慢了.譬如打开文件夹,游戏加载速度变缓慢.尤其是腾讯WeGame软件进入游戏前的检测速度明显 ...
- SpringBoot集成海康网络设备SDK
目录 SDK介绍 概述 功能 下载 对接指南 集成 初始化项目 初始化SDK 初始化SDK概述 新建AppRunner 新建SdkInitService 新建InitSdkTask 新建 HCNetS ...
- IDEA2022中部署Tomcat Web项目
使用工具: IDEA2022 Tomcat9.0.4 1.下载Tomcat: 官网:https://tomcat.apache.org/ 找到需要的版本下载即可,下载完成解压即可用: Tomcat目录 ...
- 爬取网页的通用代码框架.py(亲测有效)
import requests def getHTMLText(url): try: kv = {'user-agent':'Mozilla/5.0'} r = requests.get(url,he ...
- SpringBoot Windows 自启动 - 通过 Windows Service 服务实现
SpringBoot 在Windows运行时,有个黑窗体,容易被不小心选中或关闭,或者服务器重启后,不能自动运行,注册为 Windows Service服务 可实现 SpringBoot 项目在Win ...
- WebDriver API及对象识别技术
html页面的iframe的切换: iframe框架在html页面:实际就是多个html页面的相互嵌套:如果存在多个,则操作对象一直停留在主文档页面: 如果需要操作子文档页面则需要实现ifram ...