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 ...
随机推荐
- 别再傻傻分不清 AVSx H.26x MPEG-x 了
在音视频发展的历程中,编解码无疑是其最核心的功能,编解码标准的更新换代也极大促进了音视频技术的发展以及行为模式的变更.从电视到网络视频以及现在的网络直播.点播.音视频会议等等,这些变化的背后都离不开音 ...
- C++ 用户输入验证
在编写程序时,请考虑用户将如何滥用您的程序,尤其是在文本输入方面.对于每个文本输入点,请考虑: 会不会提取失败? 用户可以输入比预期更多的输入吗? 用户可以输入无意义的输入吗 用户可以溢出输入吗? 以 ...
- 亚马逊商品页面爬取(使用headers字段).py(亲测有效)
import requests def getHTMLText(url): try: kv = {'user-agent':'Mozilla/5.0'} # 请求头;指定访问浏览器为Mozilla5. ...
- 11.getshell常见思路与技巧
getshell常见思路与技巧 1.常规打点思路 信息收集: 绕开CDN找到所有靶标的真实IP 找到所有目标真实的C段 对所有的C段进行基础服务器的探测,端口的扫描.识别 对所有目标的子域名进行收集 ...
- php in_array 遍历,in_array大数组查询性能问题
问题最近在实现一个项目接口的时候发现当数组过大的时候,数据返回的速度有点慢.接口数据返回最长反应时间2s,经过反复调试发现代码段耗时最长的部分在in_array()函数.解决过程在stackoverf ...
- ArcMap安装OSM路网数据编辑插件ArcGIS Editor for OSM的方法
本文介绍在ArcGIS下属的ArcMap软件中,ArcGIS Editor for OpenStreetMap这一工具集插件的下载与安装的具体方法. ArcGIS Editor for Ope ...
- 第一推动|2023年VSCode插件最新推荐(54款)
本文介绍前端开发领域常用的一些VSCode插件,插件是VSCode最重要的组成部分之一,本文列出了我自己在以往工作经验中积累的54款插件,个人觉得这些插件是有用或有趣的,根据它们的作用,我粗略的把它们 ...
- python自动化测试pyautogui,pywinauto和pywin32组合使用初级
1 前言PC 端自动化测试使用到的 python 模块主要有 pywinauto.win32gui.pyautogui,主要功能如下: pywinauto:主要使用到 Application 类,用于 ...
- [J2EE:中间件]LOG4J及配置文件(log4j.properties)详解
1 简介 日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录.在apache网站:jakarta.apache.org/log4j 可以免费下 ...
- pandas技巧
1. 计算月初.2022-05-03 得到2022-05-01 df['month']=df['purchase_date'].apply(lambda x : x.replace(day=1))