关于vuex的理解
刚开始学vue的时候,看到很多项目都有用vuex,抱着一种好奇的心态去看下vuex的官方文档,如下:
Vuex官方文档
Vuex 是什么?
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。
它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
。。。一看晕了,官方的文档果然是用官方的语言,让我们这些平民百姓小渣渣看得一脸懵逼,于是这篇文章呼之欲出。
每一个 Vuex 应用的核心就是 store(仓库)。
“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。
仓库是用来干嘛的,顾名思义仓库就是存储某些东西的,需要就从里面拿取出来。哦,那么我们就可以先理解为vuex是帮我们存储数据的。
一说到存储数据,我们会想到哪里可以存储数据? 变量、数组、cookie、localstorage、session等等 。那么store和这些有什么区别呢?我们先来看下store长什么样子
const store = new Vuex.Store({
state:{
count: 2
}
})
我们可以看到store对象里面包含了state,而state也是一个对象,所以"store”基本上就是一个容器。仔细一看,这个store就是用来存储数据而已,那么我们就会产生一个疑问,store和全局变量到底有什么区别呢?借用文档的话
Vuex 和单纯的全局对象有以下两点不同:
1.Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
2.你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。
好了,现在我们可以这样理解store:Vue的核心是组件,那么组件之间怎么进行通信呢?我们第一时间会想到父子组件之间的通信props和$emit,那非父子关系的组件怎么通信呢?当然办法还是有的,或许你会想到事件传参或者多层嵌套,但是这样就是使得代码臃肿并且难以维护。
因此Vuex应运而生,把组件共享状态抽取出来,以一个全局单例模式管理。另外,通过定义和隔离状态管理中的各种概念并强制遵守一定的规则,我们的代码将会变得更结构化且易维护。
简单来说,就是把组件需要共享的数据抽取出来,交给store来处理
此外,store是内存机制,而不是缓存机制,当前页面一旦刷新或者通过路由跳转亦或是关闭,都会导致store初始化。因此在之前就暂时把store看成一个多功能的全局变量.
那么store一般保存的是什么数据呢?
1.组件的初始数据 2.后台返回来的初始数据
现在相信大家对Vuex有了初步的了解,那么我们来进一步了解Vuex的核心概念,分别是
State、 Getter、 Mutation、 Action、 Module
为了方便我们了解Vuex的核心概念,我们需要动手实践.
我们一般是使用vue-cli搭建项目的,首先我们现在src目录下新建一个名为“store”的文件夹,然后在store目录下新建名为“index.js”文件。
那我们先引入vuex npm install vuex --save
通过package.json我们可以看到安装vuex是否成功引进
"dependencies": {
"element-ui": "^2.4.5",
"vue": "^2.5.2",
"vue-router": "^3.0.1",
"vuex": "^3.0.1"
},
接下来就分别需要在store->index.js和main.js分别配置
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex) //在创建Vue实例之前
const store = new Vuex.Store({
state:{
count: 2
}
})
export default store
//main.js
import store from './store'
new Vue({
el: '#app',
router,
store, //通过在根实例中注册 store 选项
render: h => h(App) //vue2.0的写法
})
好了,现在我们已经配置好了基本环境,开始实战了。
我们需要vue文件来实验,那么我在components下新建Test.vue文件,写入如下内容
// components/Test.vue
<template>
<div>
{{count}} //2
</div>
</template>
<script>
export default{
computed:{
count(){
return this.$store.state.count
}
}
}
</script>
由于 Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性computed中返回某个状态
通过在根实例中注册 store 选项(main.js),该 store 实例会注入到根组件下的所有子组件中,且子组件能通过 this.$store 访问到。
因此我们可以看到页面显示的是结果是2
当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键:
// components/Test.vue
<template>
<div>
{{count}} //2
</div>
</template>
<script>
// 在单独构建的版本中辅助函数为 Vuex.mapState
import { mapState } from 'vuex'
export default{
computed:{
...mapState({
// 使用对象展开运算符将此对象混入到外部对象中
// 第一种:箭头函数可使代码更简练
count: state => state.count
//第二种: 传字符串参数
count: 'count'
})
},
}
</script>
因为这里要提一下箭头函数使用的坑,所以先提前使用到getters。接下来把store/index.js和Test.vue修改一下
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)//在创建Vue实例之前
const store = new Vuex.Store({
state:{
//存放组件之间共享的数据
count: 2,
other: 5,
},
getters:{
//过滤state数据,function处理
filter : state => state.count ? 1 : 0
}
})
export default store
//Test.vue
<template>
<div>
{{count}} ..{{num}} ..{{other}} // 2 ..1 ..5
</div>
</template>
<script>
// 在单独构建的版本中辅助函数为 Vuex.mapState
import { mapState } from 'vuex'
export default{
computed:{
count(){
return this.$store.state.count
},
num(){
return this.$store.getters.filter
},
...mapState({
// 使用对象展开运算符将此对象混入到外部对象中
// 第一种:箭头函数可使代码更简练
other: state => state.other
// 第二种: 传字符串参数
other: 'other'
// 这里如果想得到num的值,是不能用state.num,因为没在state里定义
// 那么如果用箭头函数的话也不可以,因为箭头函数改变了this的指向
// 为了能够使用 `this` 获取局部状态,必须使用常规函数
other(){
return this.num
}
})
}
}
</script>
---------------------
作者:magic_xiang
来源:CSDN
原文:https://blog.csdn.net/magic_xiang/article/details/81460708
版权声明:本文为博主原创文章,转载请附上博文链接!
关于vuex的理解的更多相关文章
- vuex深入理解 modules
一.什么是module? 背景:在Vue中State使用是单一状态树结构,应该的所有的状态都放在state里面,如果项目比较复杂,那state是一个很大的对象,store对象也将对变得非常大,难于管理 ...
- vuex 深入理解
参考自:https://mp.weixin.qq.com/s?src=11×tamp=1528275978&ver=922&signature=ZeHPZ2ZrLir ...
- 转一篇关于vuex简单理解的文章
学习vuex半天摸不着头脑无意间发现了这篇文章 对vuex做了一个简单的阐述比较有助于我的理解 现在分享出来希望能给一些朋友一点帮助 这个是原文地址 http://www.ituring.com.c ...
- vuex简单化理解和安装使用
1.简单化理解 首先你要明白 vuex 的目的 就是为了 集中化的管理项目中 组件所有的 数据状态 (state) 0. 第一步你要明白 , store 的重要性 , store 类似一个中央基站, ...
- Vuex的理解以及它的辅助函数
理解:vue中的“单向数据流”,这里借用官网的图示: Vue是单向数据流,v-model只是语法糖而已.单向数据流就是:数据总是[向下传递]从父级组件传递给子组件,只能单向绑定.子组件内部不能直接修改 ...
- Vuex之理解Getters的用法
一.什么是getters在介绍state中我们了解到,在Store仓库里,state就是用来存放数据,若是对数据进行处理输出,比如数据要过滤,一般我们可以写到computed中.但是如果很多组件都使用 ...
- vuex的理解
首先需要了解vuex的基本概念和使用方式,vue的官网也有很详细的说明或者浏览:https://zhuanlan.zhihu.com/p/24357762. vue是单页应用所以当页面刷新时vuex的 ...
- Vuex深入理解
store下的index.js: import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) let store = new Vuex.St ...
- 简述对Vuex的理解
1.什么是Vuex: Vuex是一个专为Vue.js应用程序开发的状态管理模式. 2.使用Vuex的原因: 当我们遇到多个组件共享状 ...
随机推荐
- PyCharm创建文件时自动添加头文件
依次找到以下路径: File->settings->Editor->File and Code Templates->Python Script #!/usr/bin/env ...
- python-----列表生成式和列表生成器表达
列表表达式: 程序一: 常规写法: L = [] for x in range(1, 11): L.append(x * x) print(L) #[1, 4, 9, 16, 25, 36, 49, ...
- luogu3605晋升者计数
https://www.zybuluo.com/ysner/note/1282069 题面 给一颗带点权的树,求每个点的子树中比该点权值大的点的个数. \(n\leq10^5\) 解析 首先有个很无脑 ...
- Face alignment at 3000FPS via Regressing Local Binrary features 理解
这篇是Ren Shaoqing发表在cvpr2014上的paper,论文是在CPR框架下做的,想了解CPR的同学可以参见我之前的博客,网上有同学给出了code,该code部分实现了LBF,链接为htt ...
- Spring Theme简单应用
Spring MVC特性里由一个是关于Spring Theme主题的应用,所以写了个Demo 1.这里先看项目结构(Meven项目) 2.所需的POM依赖 <dependency> < ...
- Python机器学习算法 — 决策树(Decision Tree)
决策树 -- 简介 决策树(decision tree)一般都是自上而下的来生成的.每个决策或事件(即自然状态)都可能引出两个或多个事件,导致不同的结果,把这种决策分支画成图形很像一棵 ...
- P4556 [Vani有约会]雨天的尾巴(线段树合并)
传送门 一道线段树合并 首先不难看出树上差分 我们把每一次修改拆成四个,在\(u,v\)分别放上一个,在\(lca\)和\(fa[lca]\)各减去一个,那么只要统计一下子树里的总数即可 然而问题就在 ...
- Django day 33 vue中使用element-ui的使用,课程的相关介绍,vue绑定图片,课程列表接口,课程详情页面
一:vue中使用element-ui的使用, 二:课程的相关介绍, 三:vue绑定图片, 四:课程列表接口, 五:课程详情页面
- O(1)的快速乘
那么 有位神仙已经说了O(1)的算法(当然不是我) 这是一种骚操作 直接放代码了啊 inline LL mul(LL a,LL b,LL Mod){ LL lf = a * ( b >> ...
- c语言小项目-使用mysql数据库的图书管理系统
VS2013通过MySQL方式连接到MySQL MySQL官网上C++的API有两个.一个是很成熟的mysql++,另一个是MySQL Connector/C++,近两年才出的,模仿JDBC做的,封装 ...