NO.01---今天聊聊Vuex的简单入门
作为一款个人认为非常牛x的框架,个人使用起来得心应手,所以近期就记录一下这款框架吧。
首先说一说
官方给出的解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化
相信很多新选手看完这段话有种绝望的感觉。开始我也是这样的,后来我想到了一个比方!
比如某年级有5个小班,每个小班有25个同学,但是只有一个老师授课,假如5个小班就对应着5个组件,每个班的25个同学就相当于每个组件中的25条数据,这个老师就相当于 vuex ,老师讲的课就相当于每一条数据。要保证每个同学受到同样的教育,就需要这个老师把每节课分别讲5遍,还不能保证每个班的同学听到的效果相同。一段时间后,老师觉得这样特别麻烦还很累,就想了一个办法,找了一个大教室,把这5个小班的同学合并到一起,这样每个课程只需要讲一次就好啦,而且还保证了每个班的同学听到的效果相同。这就是 vuex 的作用,把各个组件中用到的数据统一管理,同步发放,省时省心省力。
那这个 vuex 怎么用呢?让我们从一个简单的 Vue 计数应用开始
一、基本用法
1. 初始化并创建一个项目
vue init webpack-simple vuex-demo
cd vuex-demo
npm install
2. 安装 vuex
npm install vuex -S
3. 在 src 目录下创建 store.js 文件,并在 main.js 文件中导入并配置
store.js 中写入
import Vue from 'vue'
//引入 vuex 并 use
import Vuex from 'vuex'
Vue.use(Vuex)
main.js 文件
import Vue from 'vue'
import App from './App.vue'
import store from './assets/store' //导入 store 对象
new Vue({
//配置 store 选项,指定为 store 对象,会自动将 store 对象注入到所有子组件中,在子组件中通过 this.$store 访问该 store 对象
store,
el: '#app',
render: h => h(App)
})
4. 编辑 store.js 文件
在应用 vuex 之前,我们还是需要看懂这个流程图,其实很简单。

① Vue Components 是我们的 vue 组件,组件会触发(dispatch)一些事件或动作( Actions);
② 我们在组件中发出的动作,肯定是想获取或者改变数据的,但是在 vuex 中,数据是集中管理的,我们不能直接去更改数据,所以会把这个动作提交(Commit)到 Mutations 中;
③ 然后 Mutations 就去改变(Mutate)State 中的数据;
④ 当 State 中的数据被改变之后,就会重新渲染(Render)到 Vue Components (组件)中去, Vue Components (组件)展示更新后的数据,完成一个流程。
Vuex 的 核心 是 Store(仓库),相当于是一个容器,一个 Store 实例中包含以下属性的方法:
state 定义属性(状态 、数据)
getters 用来获取属性
actions 定义方法(动作)
commit 提交变化,修改数据的唯一方式就是显示的提交 mutations
mutations 定义变化,处理状态(数据)的改变
mapGetters 用来获取属性(数据)
mapActions 用来获取方法(动作)
store.js 中写入
// 定义属性(数据)
var state = {
count:6
}
// 创建 store 对象
const store = new Vuex.Store({
state
})
// 导出 store 对象
export default store;
方式1、 在 app.vue 中就能通过 this.$store 访问该 store 对象 ,获取该 count 。
其中需要注意的是
this.$store中的 store 与 main.js 中配置的 store 相对应,一定要注意大小写
<template>
<div id="app">
//把 count 方法直接写入,可自己执行
<h1>{{count}}</h1>
</div>
</template>
<script>
export default {
name: 'app',
computed:{
count(){
//返回获取到的数据
return this.$store.state.count
}
}
}
</script>
执行
npm run dev
就能在页面中看到传过来的数据了
方式2、vuex 提供的 mapGetters 和 mapActions 来访问
mapGetters 用来获取属性(数据)
① 在 app.vue 中引入 mapGetters
import {mapGetters} from 'vuex'
② 在 app.vue 文件的计算属性中调用 mapGetters 辅助方法,并传入一个数组,在数组中指定要获取的属性 count
<script>
import {mapGetters,mapActions} from 'vuex'
export default {
name: 'app',
computed:mapGetters([
//此处的 count 与以下 store.js 文件中 getters 内的 count 相对应
'count'
])
}
</script>
③ 在 store.js 中定义 getters 方法并导出
getters 用来获取属性
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
// 定义属性(数据)
var state = {
count:6
}
// 定义 getters
var getters={
//需要传个形参,用来获取 state 属性
count(state){
return state.count
}
}
// 创建 store 对象
const store = new Vuex.Store({
state,
getters
})
// 导出 store 对象
export default store;
这样页面上就会显示传过来的数据了!接下来我们来通过动作改变获取到的数据
④在 store.js 中定义 actions 和 mutations 方法并导出
actions 定义方法(动作)
commit 提交变化,修改数据的唯一方式就是显示的提交 mutations
mutations 定义变化,处理状态(数据)的改变
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
// 定义属性(数据)
var state = {
count:6
}
// 定义 getters
var getters={
count(state){
return state.count
}
}
// 定义 actions ,要执行的动作,如流程的判断、异步请求
const actions ={
// ({commit,state}) 这种写法是 es6 中的对象解构
increment({commit,state}){
//提交一个名为 increment 的变化,名字可自定义,可以认为是类型名,与下方 mutations 中的 increment 对应
//commit 提交变化,修改数据的唯一方式就是显式的提交 mutations
commit('increment')
}
}
// 定义 mutations ,处理状态(数据) 的改变
const mutations ={
//与上方 commit 中的 ‘increment’ 相对应
increment(state){
state.count ++;
}
}
// 创建 store 对象
const store = new Vuex.Store({
state,
getters,
actions,
mutations
})
// 导出 store 对象
export default store;
⑤ 在 app.vue 中引入 mapActions ,并调用
mapActions 用来获取方法(动作)
import {mapGetters,mapActions} from 'vuex'
调用 mapActions 辅助方法,并传入一个数组,在数组中指定要获取的方法 increment
<template>
<div id="app">
//这个 increment 方法与下面 methods 中的 increment 相对应
<button @click="increment">增加</button>
<button>减少</button>
<h1>{{count}}</h1>
</div>
</template>
<script>
import {mapGetters,mapActions} from 'vuex'
export default {
name: 'app',
computed:mapGetters([
'count'
]),
methods:mapActions([
//该 increment 来自 store.js 中导出的 actions 和 mutations 中的 increment
'increment',
])
}
</script>
这样就能通过 button 来改变获取到的 count 了。
现在你可以通过
storel.state来获取状态对象,以及通过store.commit方法触发状态变更注意:我们通过提交
mutation的方式,而非直接改变store.state.count,是因为我们想更明确地追踪到状态的变化。
这是通过点击事件让 count++ ,不妨自己试着写一下 count-- 吧!
看起来确实是挺绕的,需要在理解了原理的情况下,再细细琢磨,加深理解。
NO.01---今天聊聊Vuex的简单入门的更多相关文章
- vue的挖坑和爬坑之vuex的简单入门
首先vuex的中文文档https://vuex.vuejs.org/zh-cn/ 首先vuex是什么,官方解释是 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应 ...
- vuex最简单、最直白、最全的入门文档
前言 我们经常用element-ui做后台管理系统,经常会遇到父组件给子组件传递数据,下面一个简单的例子,点击按钮,把弹框显示变量数据通过子组件的props属性传递,子组件通过$emit事件监听把数据 ...
- vuex最简单、最详细的入门文档
如果你在使用 vue.js , 那么我想你可能会对 vue 组件之间的通信感到崩溃 . 我在使用基于 vue.js 2.0 的UI框架 ElementUI 开发网站的时候 , 就遇到了这种问题 : 一 ...
- Springmvc整合tiles框架简单入门示例(maven)
Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...
- Web---演示Servlet的相关类、表单多参数接收、文件上传简单入门
说明: Servlet的其他相关类: ServletConfig – 代表Servlet的初始化配置参数. ServletContext – 代表整个Web项目. ServletRequest – 代 ...
- Vue的简单入门
Vue的简单入门 一.什么是Vue? vue.js也一个渐进式JavaScript框架,可以独立完成前后端分离式web项目 渐进式:vue可以从小到控制页面中的一个变量后到页面中一块内容再到整个页面, ...
- Python 简单入门指北(一)
Python 简单入门指北(一) Python 是一门非常容易上手的语言,通过查阅资料和教程,也许一晚上就能写出一个简单的爬虫.但 Python 也是一门很难精通的语言,因为简洁的语法背后隐藏了许多黑 ...
- scons 简单入门
scons 简单入门 摘自:https://www.jianshu.com/p/e4bd3ab9e5d6 0.2042019.01.20 12:58:44字数 1201阅读 3021 简单入门 hel ...
- 一篇文章带你了解网页框架——Vue简单入门
一篇文章带你了解网页框架--Vue简单入门 这篇文章将会介绍我们前端入门级别的框架--Vue的简单使用 如果你以后想从事后端程序员,又想要稍微了解前端框架知识,那么这篇文章或许可以给你带来帮助 温馨提 ...
随机推荐
- HDU 2096 小明A+B(%的运用)
传送门: 小明A+B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2086 P - A1 = ?(推表达式)
传送门:http://acm.geekxiong.tech/vjudge/contest/view.action?cid=14#problem/P P - A1 = ? Time Limit:1000 ...
- GoBelieve IM 服务端编译
#部署im1. 安装go编译环境参考链接:https://golang.org/doc/install 2. 下载im_service代码 cd $GOPATH/src/github.com/GoBe ...
- EDA风格与Reactor模式
本文将探讨如下几个问题: Event-Driven架构风格的约束 EDA风格对架构属性的影响 Reactor架构模式 Reactor所解决的问题 redis中的EventDriven 从观察者模式到E ...
- oracle系列(一)sqlplus命令
该系列是向 韩顺平 老师学习的笔记 高级权限账号:scott pwd sysdba 新建一个 Command Window,也可以 开始,运行 sqlplus 连接命令 --1.0 切换账号 SQ ...
- 红帽RHEL6.8离线环境下升级到RHEL7.3
Red Hat Enterprise Linux 7 (RHEL 7) 是第一个支持从前一个 RHEL 主发行版本(RHEL 6)进行原位(in-place)升级的 RHEL 主版本.原位升级(in- ...
- spring-quartz 定时器 给targetMethod传递参数
今天在做一个项目的时候,要给一个定时器任务的执行方法传递参数,在网上找了一下资料,可以使用arguments参数: <bean id="subsidyJobDetail" ...
- 怎么将oracle的sql文件转换成mysql的sql文件
怎么将sql文件导入PowerDesigner中的方法(将oracle的sql文件转换成mysql的sql文件)呢? 怎么将xx.sql文件的数据库结构导入powerdesigner 的方法呢? 现讲 ...
- ASP.NET Core学习网站推荐
跟大家推荐一个不错的学习.NET Core 的网站,这个网站的视频是付费的,但是录视频的都是.NET Core的大佬们,个人觉得很不错推荐出来 video.jessetalk.cn
- hadoop生态搭建(3节点)-16.elk配置
# ==================================================================ELK环境准备 # 修改文件限制 # * 代表Linux所有用户 ...