vuex初探
WW(是什么、为什么)
什么是vuex? 如果你学过react,那么你就更容易理解vuex,因为vuex相当于react中的redux,它是用于管理数据的工具。我们看一看官网的介绍:
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。
为什么要使用vuex? 因为如果不用vuex,我们也可以控制组件之间的通信,但是会非常的难以管理,而通过vuex我们可以更为方便的控制数据在组件之间的通信。 尤其是对于父组件向子组件传递数据,我们可以通过props,而子组件向父组件传递数据,我们可以使用events up。 但是如果希望组件之间的通信(这往往也是最为需求的), 我们就很难处理,这是vuex就派上用场了。
如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的 global event bus 就足够您所需了。但是,如果您需要构建是一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。
VUEX核心
vuex的核心就是一个store(仓库),这个仓库中包含了所有的状态。 关键词: 状态 --- vue中使用了状态这个词,实际上就是数据,只是这个数据是响应式的, 当store中的状态发生变化时,依赖这个store的组件也会得到高效的更新,值得注意的是: 我们不能随意的改变这个状态,而必须通过特有的方式 --- 显式地提交(commit) mutations。这种方式的好处在于我们可以方便的管理状态的改变。
VUEX简单实例
在使用下面的实例过程中我们需要先安装vuex,通过npm的方式或者通过使用cdn的方式都是可以的。下面是一个最简单的的例子:
// 如果在模块化构建系统中,请确保在开头调用了 Vue.use(Vuex) const store = new Vuex.Store({
state: {
count:
},
mutations: {
increment (state) {
state.count++
}
}
})
可以看到,我们再使用vue时,无论是vue,还是vue-router,或者是vuex,都需要创建一个实例来使用。
现在我们可以使用store.state.count的方式来访问状态对象、通过store.commit('increment')的方式触发状态变更 --- 这也是修改store中的状态的唯一方式,所以我们不能通过给store.state.count赋值的方式来修改仓库中的state,这样限制的好处在于我们可以更清晰、容易地来控制数据。
vuex核心概念之一 state
首先要理解的是vuex使用的是单一状态树,即vuex的状态管理处于一棵树,也许你的应用非常复杂,分为了很多不同的模块,但是每个应用也仅仅包含一个store实例, 我们可以将store分散到各个子模块中去。
那么我们如果读取到state呢? vuex的方式是将store注册到vue实例中(前提是使用vue.use(vuex)),然后才能获取到状态,
const app = new Vue({
el: '#app',
// 把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件
store,
components: { Counter },
template: `
<div class="app">
<counter></counter>
</div>
`
})
即创建了一个实例之后,我们将store注册进来,然后该 store 实例会注入到根组件下的所有子组件中,且子组件可以通过 this.$store访问到状态对象。
访问一个状态我们需要使用计算属性,但是如果我们需要访问到很多状态,那么每一个状态都通过计算属性得到就会非常麻烦,于是vuex提供了mapState。
vuex核心概念之二Getters
有时候我们需要从 store 中的 state 中派生出一些状态,例如对列表进行过滤并计数:
computed: {
doneTodosCount () {
return this.$store.state.todos.filter(todo => todo.done).length
}
}
如果有多个组件需要用到此属性,我们要么复制这个函数,或者抽取到一个共享函数然后在多处导入它 —— 无论哪种方式都不是很理想。
Vuex 允许我们在 store 中定义『getters』(可以认为是 store 的计算属性)。Getters 接受 state 作为其第一个参数。
const store = new Vuex.Store({
state: {
todos: [
{ id: , text: '...', done: true },
{ id: , text: '...', done: false }
]
},
getters: {
doneTodos: state => {
return state.todos.filter(todo => todo.done)
}
}
})
vuex核心概念之三mutations
更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutations 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数。
const store = new Vuex.Store({
state: {
count:
},
mutations: {
increment (state) {
// 变更状态
state.count++
}
}
})
然后通过store.commit('increment')就可以来更改state了。
提交载荷
我们使用mutations改变状态,同时在commit时我们可以传递参数,如:
mutations: {
increment (state, n) {
state.count += n
}
}
store.commit('increment', )
但是这里只传入了一个参数,但是对于复杂的页面,我们往往需要传入多个参数,那么传入一个对象是一个不错的选择,这就是payload。如下:
// ...
mutations: {
increment (state, payload) {
state.count += payload.amount
}
}
store.commit('increment', {
amount:
})
其中传入的这个对象就是payload。
当然,在使用提交时,我们还可以换一种风格,即只传一个对象作为参数,把mutations中的方法作为对象的type的值,如下所示:
store.commit({
type: 'increment',
amount:
})
并且handler是不变的。
值得注意的是: mutation必须是同步函数。
vuex核心概念之四actions
Action 类似于 mutation,不同在于:
- Action 提交的是 mutation,而不是直接变更状态。
- Action 可以包含任意异步操作。
下面就是一个简单的actions:
const store = new Vuex.Store({
state: {
count:
},
mutations: {
increment (state) {
state.count++
}
},
actions: {
increment (context) {
context.commit('increment')
}
}
})
可以看到action的提交时mutation而不是直接变更状态, 所以mutation是唯一可以变更状态的方法就是成立的了。
vuex核心概念之五modules
最开始我们说到了state是单一状态树,即整个应用使用一个状态树。 但是又提到了如果应用比较大时,我们的代码一般都是分模块的,那么这个状态树应当是分散的。
Vuex 允许我们将 store 分割到模块(module)。每个模块拥有自己的 state、mutation、action、getters、甚至是嵌套子模块——从上至下进行类似的分割:
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 的状态
项目结构
vuex并不会限制你的代码结构,但是它要求你必须遵守一定的规则:
应用层级的状态应该集中到单个 store 对象中。
提交 mutation 是更改状态的唯一方法,并且这个过程是同步的。
异步逻辑都应该封装到 action 里面。
只要你遵守以上规则,如何组织代码随你便。如果你的 store 文件太大,只需将 action、mutation、和 getters 分割到单独的文件。
即因为应用比较复杂,所以store的创建导出、action、mutation等代码都比较复杂时,为了使逻辑更为清晰,我们不是将vuex写在一个js文件中,而是分开写,并且放在store文件夹下。
结束
vuex初探的更多相关文章
- Vuex的初探与实战
1.背景 最近在做一个单页面的管理后台项目,为了提高开发效率,使用了Vue框架来开发.为了使各个部分的功能,独立结构更加清晰,于是就拆分了很多组件,但是组件与组件之间数据共享成了一个问题,父子组件实现 ...
- [vue]初探vue生态核心插件Vuex
为什么会有 Vuex 这个东西 ? 一个应用内部运行的机制,事件 -> 状态 -> UI,我们的前端常常会因为这两个过程而产生大量代码,从而变得难以维护. vue的声明式渲染,解决了从 状 ...
- 从壹开始前后端分离 [ vue + .netcore 补充教程 ] 二七║ Nuxt 基础:框架初探
缘起 哈喽大家好,又是周四了,俗话说周四来了,周末还远么哈哈,老张我也想下周请假,来个16天的大长假哟,不知道大家是怎么请假的,近来发现文章下边已经没有人评论了,赶脚比较凄凉了,大家看到的麻烦点个赞呀 ...
- 从壹开始前后端分离 [ vue + .netcore 补程 ] 三十一║ Nuxt终篇:基于Vuex的权限验证探究
缘起 哈喽大家好,今天周四啦,楼主明天要正式放假了,这里先祝大家节日快乐咯,希望在家里能继续研究点儿东西吧,今天呢是 nuxt 的最后一篇,主要是对权限登录进行研究,这一块咱们之前在说第一个项目的时候 ...
- 基于Vue、web3的以太坊项目开发及交易内幕初探 错误解决总结
基于Vue.web3的以太坊项目开发及交易内幕初探 本文通过宏观和微观两个层面窥探以太坊底层执行逻辑. 宏观层面描述创建并运行一个小型带钱包的发币APP的过程,微观层面是顺藤摸瓜从http api深入 ...
- 深入解析Vuex实战总结
这篇文章主要介绍了Vuex的初探与实战小结,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. 1.背景 最近在做一个单页面的管理后台项目,为了提高开 ...
- nuxt.js学习初探
项目目标 把我个人博客的前端界面部分使用nuxt框架进行服务端渲染 nuxt介绍 nuxt可以把spa根据路由将单页面分割成多页面,比起vue的ssr渲染要更容易使用 nuxt的使用 项目创建 npx ...
- 初探webpack之从零搭建Vue开发环境
初探webpack之搭建Vue开发环境 平时我们可以用vue-cli很方便地搭建Vue的开发环境,vue-cli确实是个好东西,让我们不需要关心webpack等一些繁杂的配置,然后直接开始写业务代码, ...
- 关于Vue.js 2.0 的 Vuex 2.0,你需要更新的知识库
应用结构 实际上,Vuex 在怎么组织你的代码结构上面没有任何限制,相反,它强制规定了一系列高级的原则: 应用级的状态集中放在 store 中. 改变状态的唯一方式是提交mutations,这是个同步 ...
随机推荐
- [学习笔记]_exit和exit深入理解
#include<stdio.h> #include<stdlib.h> #include<string.h> #include <unistd.h> ...
- 调试.NET CORE代码
前言 core也用了很长一段时间了,发现很多小伙伴不知道如何调试core的代码. 可想而知,以前使用mvc的时候,不需要发布代码,直接iis地址指向项目源码,然后附加到进程w3wp.exe就可以调试了 ...
- ACM 离散化处理
使用STL算法离散化: 思路:先排序,再删除重复元素,然后就是索引元素离散化后对应的值. 1. unique(): 头文件为algorithm unique的作用是“去掉”容器中相邻元素的重复元 ...
- 【图灵学院09】RPC底层通讯原理之Netty线程模型源码分析
1. dubbo 2.5.3 netty 3.2.5.Final
- django 学习之DRF (一)
Django框架基础DRF-01 前后端分离介绍 1.前后端不分离图解 2.前后端分离图解 3.为什么要学习DRF DRF可以帮助我们开发者快速的开发⼀个依托于Django的前后后端分离 ...
- 关于如何在Windows下测交互题
这里的交互题指的NOI风格的交互题,即交互库 codeforces风格的交互题...只能自己实现评测插件了 使用Cena,Lemon没有附加文件功能不能评测交互题 在编译选项g++编译命令源文件中加入 ...
- iOS端VR视频播放(转自简书http://www.jianshu.com/p/1ee1a0d1d320)
下面是我看了谷歌的一个VR在iOS端开发的文档写的一个demo. 第一步是需要用cocoaPods导入谷歌开发的一个第三方:CardboardSDK,怎么导入就不多说了,这里需要注意的一点是谷歌方面的 ...
- (一)ByteDance编程题
题目: 公司的程序员不够用了,决定把产品经理都转变为程序员以解决开发时间长的问题. 在给定的矩形网格中,每个单元格可以有以下三个值之一: 值0代表空单元格 值1代表产品经理 值2代表程序员 每分钟,任 ...
- linux curl命令:curl: (7) couldn't connect to host ?
linux curl命令:curl: (7) couldn't connect to host ? 使用linux命令 curl http://www.test.com 出现如下错误:curl: (7 ...
- 关于dubbo服务的xml配置文件报错的问题——The matching wildcard is strict, but no declaration can be found for element 'dubbo:application'
在配置dubbo服务的过程中,经常会遇到虽然程序能够跑起来,但是配置文件一堆红叉,虽然不影响功能,但是确实很让人恶心. 报错信息如下: 解决方案: 下载一个dubbo.xsd文件(就在dubbo.ja ...