Vuex 入门教程


Posted in Javascript onJanuary 10, 2018

Vuex 是什么?

官方给出的解释: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 之前,我们还是需要看懂这个流程图,其实很简单。

Vuex 入门教程

vuex

① Vue Components 是我们的 vue 组件,组件会触发(dispatch)一些事件或动作,也就是图中的 Actions;
② 我们在组件中发出的动作,肯定是想获取或者改变数据的,但是在 vuex 中,数据是集中管理的,我们不能直接去更改数据,所以会把这个动作提交(Commit)到 Mutations 中;
③ 然后 Mutations 就去改变(Mutate)State 中的数据;
④ 当 State 中的数据被改变之后,就会重新渲染(Render)到 Vue Components 中去,组件展示更新后的数据,完成一个流程。

Vuex 的核心是 Store(仓库),相当于是一个容器,一个 Store 实例中包含以下属性的方法:

state 定义属性(状态 、数据)

store.js 中写入

// 定义属性(数据)
var state = {
 count:6
}
// 创建 store 对象
const store = new Vuex.Store({
 state
})

// 导出 store 对象
export default store;

方式1、 在 app.vue 中就能通过 this.$store 访问该 store 对象 ,获取该 count 。

<template>
 <div id="app">
 //把 count 方法直接写入,可自己执行
 <h1>{{count}}</h1>
 </div>
</template>

<script>
export default {
 name: 'app',
 computed:{
 count(){
  //返回获取到的数据
  return this.$store.state.count
 }
 }
}
</script>

方式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 了。

看起来确实是挺绕的,需要在理解了原理的情况下,再细细琢磨,加深理解。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery截取指定长度字符串的实现原理及代码
Jul 01 Javascript
JavaScript返回网页中超链接数量的方法
Apr 03 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
Dec 06 Javascript
微信小程序 两种为对象属性赋值的方式详解
Feb 23 Javascript
详解JS中的立即执行函数
Feb 24 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
Mar 20 Javascript
element UI upload组件上传附件格式限制方法
Sep 04 Javascript
微信小程序8种数据通信的方式小结
Feb 03 Javascript
vue实现简单计算商品价格
Sep 14 Javascript
详细分析JavaScript中的深浅拷贝
Sep 17 Javascript
JavaScript对象访问器Getter及Setter原理解析
Dec 08 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
js实现上传并压缩图片效果
Jan 10 #Javascript
web前端vue之CSS过渡效果示例
Jan 10 #Javascript
Vue.js分页组件实现:diVuePagination的使用详解
Jan 10 #Javascript
利用ECharts.js画K线图的方法示例
Jan 10 #Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
Jan 10 #Javascript
微信小程序实现传参数的几种方法示例
Jan 10 #Javascript
React中常见的动画实现的几种方式
Jan 10 #Javascript
You might like
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
分享别人写的一个小型js框架
2007/08/13 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
详解微信小程序用定时器实现倒计时效果
2019/04/30 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
python递归计算N!的方法
2015/05/05 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
一款利用纯css3实现的win8加载动画的实例分析
2014/12/11 HTML / CSS
Agoda中文官网:安可达(低价预订全球酒店)
2021/01/18 全球购物
C#笔试题集合
2013/06/21 面试题
新闻记者个人求职的自我评价
2013/11/28 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
干部个人考察材料
2014/12/24 职场文书
校长一岗双责责任书
2015/05/09 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
导游词之湖北武当山
2019/09/23 职场文书
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL