摘要:的数据会在上显示出来,用户会根据上的内容进行操作,从而触发,接着再去影响是单向数据流的方式驱动的。当我们的应用遇到多个组件共享状态时,单向数据流的简洁性很容易被破坏。中的非常类似于事件每个都有一个字符串的事件类型和一个回调函数。
组件是Vue最强大的功能之一,而组件实例的作用域是相互独立的,意味着不同组件之间的数据是无法相互使用。组件间如何传递数据就显得至关重要,这篇文章主要是介绍Vuex。尽量以通俗易懂的实例讲述这其中的差别,希望对小伙伴有些许帮助。
一、Vuex 是什么?Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
二、什么是“状态管理模式”?一个简单的 Vue 计数应用开始:
new Vue({ // state data () { return { count: 0 } }, // view template: `{{ count }}`, // actions methods: { increment () { this.count++ } } })
这个状态自管理应用包含以下几个部分:
state,驱动应用的数据源;
view,以声明方式将 state 映射到视图;
actions,响应在 view 上的用户输入导致的状态变化。
state的数据会在 view上显示出来,用户会根据 view 上的内容进行操作,从而触发 actions,接着再去影响 state(vue 是单向数据流的方式驱动的)。
当我们的应用遇到多个组件共享状态时,单向数据流的简洁性很容易被破坏。下面的图,是把组件的共享状态抽取出来,以一个全局单例模式管理。
1. state
state:页面状态管理容器对象。集中存储Vue components中data对象的零散数据,以进行统一的状态管理。页面显示所需的数据从该对象中进行读取。
{{ $store.state.count }}console.log(this.$store.state.count)
2. getters
getters:Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。(getters从表面是获得的意思,可以把他看作在获取数据之前进行的一种再编辑,相当于对数据的一个过滤和加工。getters就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。)
定义getter:
getters: { done(state) { return state.count + 1; }, }
3. mutations
mutations:更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数:
const store = new Vuex.Store({ state: { count: 1 }, mutations: { increment (state) { // 变更状态 state.count++ } } })
组件通过commit提交mutations的方式来请求改变state
this.$store.commit("increment")
提交载荷(Payload)
mutations方法中是可以传参的,具体用法如下:
mutations: { // 提交载荷 Payload add(state, n) { state.count += n } }, this.$store.commit("add", 10)
4.Action
Action:类似于 mutation,不同在于Action 提交的是 mutation,而不是直接变更状态;Action 可以包含任意异步操作。
const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ } }, actions: { increment (context) { context.commit("increment") } } })
不同于mutations使用commit方法,actions使用dispatch方法。
this.$store.dispatch("incrementAsync")
context
context是与 store 实例具有相同方法和属性的对象。可以通过context.state和context.getters来获取 state 和 getters。
以载荷形式分发
incrementAsyncWithValue (context, value) { setTimeout(() => { context.commit("add", value) }, 1000) } this.$store.dispatch("incrementAsyncWithValue", 5)
5.Module
由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。
为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割:
const moduleA = { state: { ... }, mutations: { ... }, actions: { ... }, getters: { ... } } const moduleB = { state: { ... }, mutations: { ... }, actions: { ... } } const store = new Vuex.Store({ modules: { a: moduleA, b: moduleB } }) store.state.a // -> moduleA 的状态 store.state.b // -> moduleB 的状态
模块的局部状态
对于模块内部的 mutation 和 getter,接收的第一个参数是模块的局部状态对象。
const moduleA = { state: { count: 0 }, mutations: { increment (state) { // 这里的 `state` 对象是模块的局部状态 state.count++ } }, getters: { doubleCount (state) { return state.count * 2 } } }Vuex计数器的例子:
在src目录下创建一个store文件夹。
store/store.js import Vue from "vue" import Vuex from "vuex" Vue.use(Vuex) const store = new Vuex.Store({ state: { count: 0, show: "" }, getters: { counts: (state) => { return state.count } }, mutations: { increment: (state) => { state.count++ }, decrement: (state) => { state.count-- }, changVal: (state, v) => { state.show = v } } }) export default store
state就是我们的需要的状态,状态的改变只能通过提交mutations,例如:
increase() { this.$store.commit("increment") }
带有载荷的提交方式:
changObj () { this.$store.commit("changVal", this.obj) }
载荷也可以是一个对象,这样可以提交多个参数。
changObj () { this.$store.commit("changVal", { key:"" }) }
在main.js中引入store.js
import store from "./store/store" export default new Vue({ el: "#app", router, store, components: { App }, template: "" })
在组件中使用
在组建可以通过$store.state.count获得状态
更改状态只能以提交mutation的方式。
mapState、mapGetters、mapActions{{$store.state.count}}
{{$store.state.show}}
很多时候 , $store.state.dialog.show 、$store.dispatch("switch_dialog") 这种写法又长又臭 , 很不方便 , 我们没使用 vuex 的时候 , 获取一个状态只需要 this.show , 执行一个方法只需要 this.switch_dialog 就行了 , 使用 vuex 使写法变复杂了 ?使用 mapState、mapGetters、mapActions 就不会这么复杂了。
以 mapState 为例 :
相当于 :
mapGetters、mapActions 和 mapState 类似 , mapGetters 一般也写在 computed 中 , mapActions 一般写在 methods 中。
Vuex官方文档
Vue面试中,经常会被问到的面试题
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/98360.html
摘要:有兴趣的同学可以查看之前发布的文章学习系列一学习实践笔记附学习系列二学习实践笔记附学习系列三和网络传输相关知识的学习实践学习系列四打包工具的使用学习系列五从来聊聊学习系列项目地址项目暂时有点乱,之后会进行整理优化。 上次学习了vue-router的使用,让我能够在各个页面间切换,将页面搭建了起来。这次则要学习vue的状态管理模式——vuex。它类似于redux来应用的全局状态。 注:本...
摘要:创建项目直接在工作空间下用来创建安装依赖执行成功的话讲出现这个画面正式开始写项目首先修改项目结构目前的结构新建一个文件夹,用来管理部分状态,比如登录里面新建一个新建一个文件夹,用来写的请求借口里面放一个新建一个文件夹,用来存放或模拟数据, 创建项目 learn 直接在工作空间下用vue-cli来创建vue init webpack learnshowImg(https://segmen...
摘要:官网地址聊天机器人插件开发实例教程一创建插件在系统技巧使你的更加专业前端掘金一个帮你提升技巧的收藏集。我会简单基于的简洁视频播放器组件前端掘金使用和实现购物车场景前端掘金本文是上篇文章的序章,一直想有机会再次实践下。 2道面试题:输入URL按回车&HTTP2 - 掘金通过几轮面试,我发现真正那种问答的技术面,写一堆项目真不如去刷技术文章作用大,因此刷了一段时间的博客和掘金,整理下曾经被...
摘要:如果不熟悉,在这个教程里面,我们会通过构建一个笔记应用来学习怎么用。这个是我们要构建的笔记应用的截图你可以从下载源码,这里是的地址。每当用户点击笔记列表中的某一条时,组件会调用来分发这个会把当前选中的笔记设为。 原文:Learn Vuex by Building a Notes App,有删改。 本文假设读者熟悉 Vuex 文档 的内容。如果不熟悉,you definitely sho...
阅读 1837·2021-11-22 09:34
阅读 2961·2021-09-28 09:35
阅读 13206·2021-09-09 11:34
阅读 3555·2019-08-29 16:25
阅读 2767·2019-08-29 15:23
阅读 2008·2019-08-28 17:55
阅读 2405·2019-08-26 17:04
阅读 3021·2019-08-26 12:21