Vuex 面试题(2023-09-13更新)
谈谈你对 Vuex 的理解
什么是 Vuex?
vuex 是 Vue 应用程序开发的状态管理插件,它采用集中式存储,管理应用的所有组件的状态
Vuex 解决了什么问题?
- 多个组件依赖于同一状态时,多层嵌套的组件,传参将会非常繁琐
- 来自不同组件的行为需要变更同一状态
核心概念
Vuex 的 5 个核心属性是什么?
- state 数据源存放地
- getter 计算属性
- mutation 用于编写同步提交更改数据的方法
- action 用于编写异步操作
- module 模块化(分割模块)
State
怎么获取 state 中的数据?
this.$store.state.data
怎么在组件中批量使用 Vuex 的 state 数据?
使用 mapState 辅助函数,利用对象展开运算符将 state 混入 computed 中
import { mapState } from 'vuex'
export default {
computed: {
...mapState({
a: (state) => state.a,
b: (state) => state.b
})
}
}
getters
怎么在组件中批量使用 Vuex 的 getter 属性?
使用 mapGetters 辅助函数
import { mapGetters } from 'vuex'
export default {
computed: {
...mapGetters(['totalCount', 'totalPrice'])
}
}
如果你想将一个 getter 属性另取一个名字,使用对象形式
...mapGetters({
myCount: 'totalCount',
myPrice: 'totalPrice'
})
Mutation
怎么改变其中的数据?
更改 store 中的数据,唯一方法是提交 mutation,使用 store.commit()
this.$store.commit('update')
在组件中多次提交同一个 mutation,怎么写方便?
使用 mapMutations 辅助函数
import { mapMutations } from 'vuex'
export default {
methods: {
...mapMutations({
setNumber: 'SET_NUMBER'
})
}
}
然后调用 this.setNumber(10) 相当于调用 this.$store.commit('SET_NUMBER', 10)
Action
怎么提交一个 action?
使用 store.dispatch
this.$store.dispatch('update')
在组件中多次提交同一个 action,怎么写方便
import { mapActions } from 'vuex'
export default {
methods: {
...mapActions({
logout: 'logout'
})
}
}
然后调用 this.logout() 相当于调用 this.$store.dispatch('logout')
Vuex 中 action 通常是异步的,那么如何知道 action 是什么时候结束呢?
在 action 函数中返回 Promise,然后用 .then 处理
其他
Vuex 中 action 和 mutation 有什么区别?
- mutation 是同步操作,action 异步操作
- mutation 可以直接变更状态,action 不能直接变更状态,需要提交一个 mutation
- 两者提交方式不铜
- mutation 使用 commit 进行提交:
this.$store.commit('set_number', 10) - action 使用 dispatch 进行提交:
this.$store.dispatch('logout')
- mutation 使用 commit 进行提交:
模块化
Vuex 为什么要分模块?
由于使用单一状态树,应用的所有状态都会集中到一个对象里,当应用变得非常复杂时,store 对象就会变得相当臃肿
为了解决这个问题,vuex 允许将 store 对象分割成模块,每个模块拥有自己的属性
怎么访问模块中的 state、mutation、getter、action?
访问 state 需要加上模块的名称,访问其他属性不需要
this.$store.state.moduleName.data
命名空间
什么是命名空间?
默认情况下,模块内的 action、mutation、getters 是注册在全局命名空间的,state 除外,这样使得多个模块能对同一属性做出响应。
如果希望模块具有更高的封装度和复用性,可以通过添加 namespaced: true 的方式使其成为带命名的模块,当模块被注册后,内部属性会自动根据模块注册的路径调整命名
增加一个 moduleA 的文件,编写如下代码:
const mutation = {
set_number: (state, data) => {
state.number = data
}
}
export default {
namespaced: true,
mutations
}
调用命名空间模块的方法:
this.$store.commit('moduleA/set_number', 10)
怎么在带命名空间的模块内,访问全局的 mutation 或 action?
将 {root: true} 作为第三参数传给 dispatch 和 commit 即可
new Vuex.Store({
modules: {
foo: {
namespaced: true,
actions: {
fooAction({ dispatch, commit }) {
dispatch('someAction', null, { root: true })
commit('someMutation', null, { root: true })
}
}
}
}
})
怎么在带命名空间的模块内,注册全局 action?
在 action 函数中添加 root: true,并将这个函数定义放在 handler 中
new Vuex.Store({
modules: {
foo: {
namespaced: true,
actions: {
fooAction: {
root: true,
handler(context, data) {
//...
}
}
}
}
}
})
createNamespacedHelpers 是做什么的?
当时用 mapState、mapGetters、mapMutations、mapActions 这些函数来绑定来命名空间的模块是,写起来可能会比较繁琐,
如果是多层嵌套的 module,将会更为繁琐:
computed: {
...mapState({
a: state => state.module.a,
b: state => state.module.b
}),
...mapGetters([
'module/totalCount',
'module/totalPrice'
])
},
methods: {
...mapActions({
logout: 'module/logout'
})
}
对于这种情况,可以将模块的空间字符串作为第一个参数传给上述函数,这样就会自动将该模块绑定到上下文中,简化如下:
computed: {
...mapState('module', {
a: state => state.a,
b: state => state.b
}),
...mapGetters('module', [
'totalCount',
'totalPrice'
])
},
methods: {
...mapActions('module',{
logout: 'logout'
})
}
还可以使用 createNamespacedHelpers 创建基于某个命名空间的辅助函数:
import { createNamespacedHelpers } from 'vuex'
const { mapState, mapActions } = createNamespacedHelpers('module')
export default {
computed: {
...mapState({
a: (state) => state.a,
b: (state) => state.b
})
},
methods: {
...mapActions([
logout: 'logout'
])
}
}
其他
Vuex 和 localStorage 的区别?
- localStorage 数据存放在硬盘文件上,读写硬盘开销高;Vuex 数据存放在内存中,读写开销小,读写速度也会比 localStorage 快很多
- vuex 是状态管理,应该将依赖性比较高的变量数据存放到这里,方便查找维护,比较规范
- vuex 的数据是响应式的
Vuex 页面刷新丢失怎么解决?
需要做数据持久化
- 可以使用本地存储的方法来保存数据,设计存储方案
- 也可以使用第三方插件:
vuex-persist、vuex-persistedstate
Vuex 的严格模式是什么?有什么作用?怎么开启?
在严格模式,发生了状态变更且不是有 mutation 函数引起的,就会抛出错误,这样能保证所有的状态变更都能被调试工具跟踪到
在 Vuex.Store 构造器选项中开启:
const store = new Vuex.Store({
strict: true
})
Vuex 面试题(2023-09-13更新)的更多相关文章
- vue+vuex+axios+echarts画一个动态更新的中国地图
一. 生成项目及安装插件 # 安装vue-cli npm install vue-cli -g # 初始化项目 vue init webpack china-map # 切到目录下 cd china- ...
- 前端面试题总结——HTML(持续更新中)
前端面试题总结--HTML(持续更新中) 1.什么是HTML? HTML:HyperText Markup Language超文本标记语言 2.XHTML和HTML有什么区别 HTML是一种基本的WE ...
- 利用预编译解决C/C++重复定义的错误 -2020.09.13
利用预编译解决C/C++重复定义的错误 -2020.09.13 我们现在有main.c和function.h两个文件 main.c #include <stdio.h> #include ...
- 2023.1.13 [网络流24题] 餐巾计划问题 LuoguP1251
2023.1.13 今日完成的[餐巾计划问题],是一道最小费用最大流的模板题,本人太弱在第一次使用dinic + spfa 完成此题时,也出现了许多问题,在此总结和提醒. 大致题意 一个餐厅在相继的 ...
- Web前端面试题整合,持续更新【可以收藏】
饭后闲来无事,把这几年带学生用的一些面试题整合一下,供上!拿走,不客气!应付一般公司的二面基本上是够用了.祝你早日拿到心仪的offer. css相关 1. 万能居中 1.margin: 0 auto; ...
- java 面试题整理(不定期更新)
一.Java基础 1.Java面向对象的三个特征与含义 三大特征是:封装.继承和多态. 封装是指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为,而这个公布也是可以有选择性的公 ...
- python 试题归纳及答疑 更新中.....
一.Python基础篇(80题) 1.你为什么学习Python? 一.答题思路 1.阐述 python 优缺点 2.Python应用领域说明 3.根据自身工作情况阐述为什么会使用python 1)py ...
- Redis 面试题 - 收藏版 (持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- 解决IntelliJ IDEA 13更新FindBugs 0.9.993时JRE版本过低导致启动失败问题
今晚更新FindBugs 0.9.992(FindBugs 2)至FindBugs 0.9.993(FindBugs 3)后,按要求重启IntelliJ IDEA 13.本想看看更新后多了哪些功能,结 ...
- 剑指offer面试题-Java版-持续更新
最近在用Java刷剑指offer(第二版)的面试题.书中原题的代码采用C++编写,有些题的初衷是为了考察C++的指针.模板等特性,这些题使用Java编写有些不合适.但多数题还是考察通用的算法.数据结构 ...
随机推荐
- SpringBoot 集成 LDAP
LDAP协议具体是什么可以自行查看,简单来说就是单点登录的一种实现方式 LDAP只是一种协议,实现的有 openLDAP ,Microsoft active directory 等 openLDAP部 ...
- jpa 多条件模糊查询,分页并排序
jpa 多条件模糊查询,分页并排序很难吗,这样写不就几行代码的事吗?搞不明白你们写的怎么长篇大论花里胡哨的,看的一脸懵逼. jpa多字段模糊查询,持久层字段还是要一一对应的,但是你可以在service ...
- RabbitMQ协议基础及C++和Java混合开发
目前面对大多数的需要在异构系统间进行消息传递技术路线,大多会选择socket或webservice.这两种技术的共同特点是耦合紧,调试依赖双方同步,但是效率高.除此以外,使用消息队列(MQ)的应用场景 ...
- eBPF 概述:第 3 部分:软件开发生态
1. 前言 在本系列的第 1 部分和第 2 部分中,我们对 eBPF 虚拟机进行了简洁的深入研究.阅读上述部分并不是理解第 3 部分的必修课,尽管很好地掌握了低级别的基础知识确实有助于更好地理解高级别 ...
- 在 Exchange Server 中配置特定于客户端的消息大小限制
在 Exchange Server 中配置特定于客户端的消息大小限制 微软官方详细文档如下: https://learn.microsoft.com/zh-cn/exchange/architectu ...
- ajax下载二进制文件(导出Excel)
var url = 'http://127.0.0.1'; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // 也可以使用PO ...
- JS 转盘抽奖效果
阅读原文,微信扫描二维码, 手机关注公共号酒酒酒酒,搜索 JS 转盘抽奖效果 效果图 前置条件: 开发环境:windows 开发框架:js 编辑器:HbuilderX 正文开始 <!DOCTYP ...
- Python311新特性-特化指令specializing adaptive interpreter-typing-asyncio
Python3新特性 python3.11增加了许多特性,让python更快更加安全,本文从应用层面来讲一下python3.11的这些新特性 特化自适应解析器是什么,如何利用特化写出更高性能的代码 如 ...
- SICTF 2024 Round4 Crypto
SICTF-Round4--Crypto SignBase task: U0lDVEZ7ODI5MGYwZWYtNzAyYi00NTZmLTlmZjYtNGRhZjhhYTIzNWU1fQ== exp ...
- "安装VMware Tools"显示灰色的解决办法
用VMware Workstation Pro好几年了,期间这个问题也遇到过好几次,这次把解决方案记录一下,若后续有其他情况其他解决方案将在此博文更新. Step1:关闭虚拟机: Step2:在虚拟机 ...