VueX
# Vuex
# 介绍一下Vuex
的工作原理特别重要
组件触发(
dispatch
)一些事件或动作,就是action
数据不能直接修改,要把这个动作提交(
commit
)给mutations
mutation
去改变state
的数据state
被改变会重新render
# Vuex
中action
和mutation
的区别特别重要
mutation
专注于修改state
理论是修改state
的唯一途径,action
进行业务处理和异步请求mutation
必须同步执行 而action
可以异步但不能直接操作state
在视图更新时,先触发
actions
,actions
再触发mutation
mutation
的参数是state
,它包含store
中的数据;actions
的参数是context
,它是state
的父级,包含state
、getters
# Vuex
和localStorge
的区别特别重要
存储形式不同:
vuex
存储在内存,而localstorge
以文件形式存储在本地,只能存储字符串(JSON.stringify
和parse
处理过的),读取内存比读取硬盘的速度快应用场景不同:
vuex
存储管理应用的所有组件状态,用于组件之间的传值,而localstorge
将数据存储到浏览器,一般用于跨页面传输数据,vuex
可以做到数据响应式,而localstorge
不能永久性:刷新页面时
vuex
存储的值会丢失,但localstorge
不会
替换
理论上localstorge
可以代替vuex
,当两个组件共用数据源时,如果一个组件改变了该数据源,而利用localstorge
存储的数据做不到响应式,原因还是得益于vue
中的mvvm
的双向绑定
# Redux
和vuex
的区别和共同思想
区别:vuex
弱化了dispatch
,通过commit
进行store
的状态变更,不用传入action
形式进行指定变更;弱化了reducer
,基于commit
参数直接对数据进行转变
共同思想:都是单一数据源,都是基于mvvm
思想,将视图和数据分离,形式上vuex
借鉴了redux
,将store
作为全局的数据中心,进行mode
管理
# Vuex
和单纯全局对象有什么区别
vuex
状态存储是响应式的,当vue
组件从store
读取状态,若store
中状态改变,相应的组件得到更新
不能直接改变store
的状态,改变store
唯一途径是提交mutation
,可以方便跟踪每一个状态的变化
# Vuex
页面刷新数据丢失怎么解决
- 在
created
周期中读取sessionstorage
中的数据存储在store
中,此时用vuex.store
的replaceState
方法,替换store
的根状态 - 在
beforeunload
方法中将store.state
存储到sessionstorage
中。
export default {
name: 'App',
created() {
//在页面加载时读取sessionStorage里的状态信息
if (sessionStorage.getItem("store")) {
this.$store.replaceState(Object.assign({},
this.$store.state, JSON.parse(sessionStorage.getItem("store"))))
}
//在页面刷新时将vuex里的信息保存到sessionStorage里
window.addEventListener("beforeunload", () => {
sessionStorage.setItem("store", JSON.stringify(this.$store.state))
})
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# 为什么Vuex
的mutation
不能做异步操作重要
因为vuex
所有状态更新唯一途径都是mutation
,异步操作通过action
提交mutation
实现,方便跟踪每一个状态的变化,如果mutation
支持异步,就没有办法知道状态是何时更新的,给调试带来困难
# 为什么在组件中用this.$store.xxx
可以访问到Vuex
的数据
因为Vue
将 $store
挂载到实例上:
Vue.js
提供了Vue.use()
方法用来给Vue.js
安装插件
当调用Vue.use(Vuex)
时,内部通过调用Vuex
插件的install
方法来进行插件的初始化。
install
方法执行applyMixin
执行初始化Vuex
的方法,也就是vuexInit
,同时将该方法混淆进Vue
的beforeCreate(Vue2.0)
或_init
方法(Vue1.0)
中。
# Vuex
是如何实现数据响应式的?
用一个 resetStoreVM
方法初始化 store
的 vm(store_vm)
。
将所有getter
放入computed
对象,以便后续在 Vue
实例中将它们注册为 computed
。
同时通过Object.defineProperty
为每一个getter
设置get
方法,那么我们在组件里访问store
的getter
上的数据就相当于访问store._vm
上的数据,也就是Vue
对象的computed
属性。
完成后,让store._vm
指向一个新的Vue
实例,而该新的Vue
实例目的是将Vuex
中的state
和getters
分别注册到Vue
实例的data
和computed
中,然后删除store._vm
的旧引用。