vuex使用心得分享(填坑)
今天我们简单说一下vuex的使用,vuex是什么呢,相当于react的redux,如果项目使用数据过多的话,直接管理是非常不方便的,那么采用vuex,那些繁琐的问题就迎刃而解了,首先我们先看看官方对vuex的说明:
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。
说白了就是vue的状态管理,你只需要每次动态的改变这些状态就行,数据就会自动渲染,从第一步安装开始,
1、安装vue项目:
(1).vue init webpack Testporject
(2).cd Testporject
(3).npm i vuex --save
(4) npm run dev
这些指令就不用说了,作为一个vue开发者,如果不知道的话那就可以不用学了,前提是你需要依赖vue-cli,如果安装失败,那请先安装vue-cli 吧
2、vuex的引入
项目安装成功以后,初始的文件目录格式都是一样的,像我这样:

然后我们简单的使用,在main.js中引入vuex
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
记得一定要挂载使用它,就是这一句:Vue.use(Vuex)
3、在main.js中加入
var store = new vuex.Store({//store对象
state:{
count:0
}
})
4、把刚才的store对象实例化到Vue中
new Vue({
el: '#app',
router,
store,//加入store对象
template: '<App/>',
components: { App }
})
完成这一步我们就可以使用了,一个简单的vuex的state就可以了,怎么用呢
<div id="hello">
<p>{{$store.state.count}}</p>
</div>
5、很明显,刚才只是简单的一例子,如果你需要做大型的项目,不可能把store对象写在main.js里,这样是非常不方便管理的,所以我们需要在src下新建一个文件夹store专门存放store对象,然后我们新建一个文件index.js
//index.js
import Vue from 'vue'
import vuex from 'vuex'
Vue.use(vuex);
export default new vuex.Store({
state:{
count:0
}
})
相应的main,js就需要做修改了
import store from './store/index'
new Vue({
el: '#app',
router,
store,//加入store对象
template: '<App/>',
components: { App }
})
这样做就是为了把store对象分离出去,方便管理,但是你会发现这个store对象是全局的所有组件都可以使用,如果我们的组件多了,数据多了,全部堆放在一起,是不是特别臃肿,所以现在我们就该使用modules
首页我们新建一个js文件存放一个组件可能用到的store对象,比如我新建heade.js,在这里我们不需要引用vuex了,只需要默认export default就行了
//heade.js
export default {
state: {
count: 0
}
}
然后我们把在index.js中使用modules
import Vue from 'vue'
import vuex from 'vuex'
Vue.use(vuex); import HeadeStore from './heade';//引入刚才的heade.js export default new vuex.Store({
modules: {
Heade: HeadeStore
}
})
现在我们管理起来就方便多了,比如还有其他的呢我们放在modules下就可以了,比如,我们除了heade.js里管理的是一个组件的store对象,我们还有一个content.js来管理另外一个组件的store对象,那么我们在store文件夹下载新建一个content.js,和heade.js一样,只需要默认输出就可以了
//content.js
export default {
state: {
cont: '这是content内容'
}
}
然后我们在index.js中引入挂在modules下就可以啦
import Vue from 'vue'
import vuex from 'vuex'
Vue.use(vuex); import HeadeStore './heade';//引入刚才的heade.js
import ContentStore from './content' //引入content.js export default new vuex.Store({
modules: {
Heade: HeadeStore,
Content: ContentStore
}
})
这样是不是方便多了,但是怎么用呢,很简单,现在需要通过modules去找他,之前的方法:$store.state.count改成$store.state.Heade.count就行了,很明显这是找到了heade.js下的count值,那么找content.js下cont的值呢?一样的,换一下modules的名就行$store.state.Content.cont
//heade组件
<p>{{$store.state.Heade.count}}</p>
//content组件
<p>{{$store.state.Content.cont}}</p>
输出结果分贝为:0,这是content内容
6、那么接下来你觉得问题解决了吗,难道你们的项目组件所有的状态都用这一个,那如果我需要动态的改变他的状态呢,怎么办?没事,这不mutations来了吗,问题就好多了,怎么用呢,这是干嘛的呢,说白了就是动态的改变state的值完成页面的同步渲染,看看用法吧,直接在state对象后面加就行了
//heade.js
export default {
state: {
count: 0
},
mutations: {
Count (state) {
state.count =1
}
}
}
解释一下,mutations对象是函数,默认传值是state,也就是上面的state,所以可以直接操作state.count
怎么用呢,很简单,比如页面有一个按钮,点击改变state的count
<a href="javascript:;" @click="$store.commit('Count ')">click</a>
此时页面渲染为1
commit('Count ')调用mutations的固定方法,参数为mutations的方法名,当然commit不止传一个参数,也可以传很多,比如:
<a href="javascript:;" @click="$store.commit('Count',10)">click</a>
可以在heade.js的mutations下Count方法接受它
//heade.js
export default {
state: {
count: 0
},
mutations: {
Count (state,n) {
state.count =state.count+n
}
}
}
此时输出结果为10
到这一步为止,我们已经可以正常的动态的修改state来渲染在页面了,你会发现,mutations是同步的,只要你在一个组件执行mutations的方法了,那所有的组件只要用到mutations的方法都会同步进行改变,这并不是我们想要的结果,所以,actions来解决问题了,写法一样,
//heade.js
export default {
state: {
count: 0
},
mutations: {
Count (state,n) {
state.count =state.count+n
}
},
actions: {
Acount (context) {
context.commit('Count ')
}
}
}
接着解释,actions和mutations的写法一样,都是函数,但是actions的默认参数是context,context.commit('Count ')的意思是触发mutations下的Count函数,那么怎么触发actions的函数呢,方法就是
//heade组件
<a href="javascript:;" @click="$store.dispatch('Acount')">click</a>
dispatch方法是官方固定触发actions下函数的方法
官方推荐 , 将异步操作放在 action 中
还有一个属性我觉得也没有必要说了,getters,解释一下它的作用
getters 和 vue 中的 computed 类似 , 都是用来计算 state 然后生成新的数据 ( 状态 ) 的。比如我们heade.js的state有一个值show:false getters就是计算与false相反的,但是它计算的值是不能直接修改的, 需要对应的 state 发生变化才能修改。
//heade.js
export default {
state: {
count: 0,
show: false
},
mutations: {
Count (state,n) {
state.count =state.count+n
}
},
actions: {
Acount (context) {
context.commit('Count ')
}
},
getters:{
not_show(state){
return !state.show;
}
},
}
它也是默认接受state
最后一点就是为了方便操作开发,一般情况$store.state.Heade.show,$store.state.show写起来不是很方便,那么vuex的辅助函数mapState、mapGetters、mapActions就可以解决这个问题,办stroe对象那个映射到this
<template>
<div class="Heade">
<p>{{msg}}</P>
</div>
</template> <script>
import {mapState} from 'vuex';
export default {
name: 'Heade',
data () {
return {
msg: ''
}
},
computed:{
//这里的三点叫做 : 扩展运算符
...mapState([
count:state=>state.Heade.count
]),
},
created () {
this.msg = this.count
}
}
</script>
现在我们就直接可以用this.count去找到state下count的值了,created方法是页面刚载入加载完事执行的方法,完后动态的赋值给msg,mapState一般放在computed计算属性中,mapActions一般放在methods下,
到这一步为止vuex的学习使用就结束了,你可以尽情的去操作数据了,也不用担心会混乱,如果您连我写的文档都看不懂,那你不适合学习vue,放弃吧!
demo地址:https://github.com/Ningstyle/VuexTest
vuex中文官网:https://vuex.vuejs.org/zh-cn/
以上教程全部原创,手打,难免有错误的地方,请各位指正!
如果想一起学习,加入我们的前端交流群:565996731(注明:博客园)
一只熊的北极 2018-01-23
vuex使用心得分享(填坑)的更多相关文章
- uni-app学习心得和填坑,关于uni-app 打包h5 页面的坑
第一次使用博客园写博客 1.我写博客的原因,梳理知识,整理思路,好记性不如烂笔头做个记录吧!记录生活! 1.了解 大概在我使用hbuilder的时候,在官网浏览下载的hbuilder时候无意中发现了u ...
- GC overhead limit exceeded填坑心得
我遇到这样的问题,本地部署时抛出异常java.lang.OutOfMemoryError:GC overhead limit exceeded导致服务起不来,查看日志发现加载了太多资源到内存,本地的性 ...
- css 填坑常用代码分享
以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. 因为提交比较麻烦,后来转置github:https://github.com/jsfront/src/blob/mast ...
- css 填坑常用代码分享[居家实用型]
原文地址 http://www.cnblogs.com/jikey/p/4233003.html 以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. 一. css 2.x ...
- Android Tips – 填坑手册
出于: androidChina http://www.androidchina.net/3595.html 学习 Android 至今,大大小小的坑没少踩,庆幸的是,在强大的搜索引擎与无私奉献的 ...
- windows下jenkins常见问题填坑
没有什么高深的东西,1 2天的时间大多数人都能自己摸索出来,这里将自己遇到过的问题分享出来避免其他同学再一次挖坑. 目录 1. 主从节点 2. Nuget自动包还原 3. powershell部署 4 ...
- 【过程改进】 windows下jenkins常见问题填坑
没有什么高深的东西,1 2天的时间大多数人都能自己摸索出来,这里将自己遇到过的问题分享出来避免其他同学再一次挖坑. 目录 1. 主从节点 2. Nuget自动包还原 3. powershell部署 4 ...
- Docker基本概念填坑
Docker的基本概念填坑 Docker的基本概念填坑 1. Docker的基本组成 Docker Client客户端 Docker Daemon守护进程 Docker Image镜像 Docker ...
- 持续集成 windows下jenkins常见问题填坑
[过程改进]持续集成 windows下jenkins常见问题填坑 没有什么高深的东西,1 2天的时间大多数人都能自己摸索出来,这里将自己遇到过的问题分享出来避免其他同学再一次挖坑. 目录 1. 主从节 ...
随机推荐
- 关于vue 框架与后台框架的混合使用的尝试------转载
这几天我在研究前台框架和后台框架融合的问题,进行了一些尝试; 我前台选择的是 vue,当然也可以选择 react 等其他 mvvm 框架,不过 vue 对于我来说是最熟悉的; 后台话,我选择的是 ph ...
- 用vue实现简单分页
在这个demo中,我用vue对一个json文件中的数据进行了简单的分页,没用用到交互,一下是我的实现过程. 基础逻辑 1.将json文件引入app.vue,并作为data返回 data(){ var ...
- ASP.NET Core 一步步搭建个人网站(4)_主页和登录验证
上章节我们已经定制好动态配置的菜单,用户登录网站的第一步就是进入首页内容,那我们先搭建一下我们的首页内容.想着自己的网站内容主要是个人博客类型,所以,首页就展示博主本人的一些基本信息吧,哈哈.当然,做 ...
- 基于Docker的ELK日志平台搭建
1.安装Docker Docker可简单理解为一个轻量级的虚拟机.Docker对进程进行封装隔离,隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器.Docker和传统虚拟化方式的不同.传统虚拟 ...
- 程序猿的日常——HashMap的相关知识
背景知识 哈希冲突 哈希是指通过某种方法把数据转变成特定的数值,数值根据mod对应到不同的单元上.比如在Java中,字符串就是通过每个字符的编码来计算.数字是本身对应的值等等,不过就算是再好的哈希方法 ...
- windows的ReactNative挖坑一分钟爬坑一小时
其实开发并不需要Android Studio来开发,因为命令行都是要自己手打的,所以就开始了我的挖坑爬坑之旅 首先安装React Native要用到的git.nodejs等等这里不讲了,主要讲在手机上 ...
- 【官方文档】Nginx模块Nginx-Rtmp-Module学习笔记(三)流式播放Live HLS视频
源码地址:https://github.com/Tinywan/PHP_Experience HTTP Live Streaming(HLS)是由Apple Inc.实施的非常强大的流视频协议.HLS ...
- C#设计模式之一单例模式(Singleton Pattern)【创建型】
一.引言 看了李建忠老师的讲的设计模式已经有一段时间了(这段时间大概有一年多了),自己还没有写过自己的.有关设计模式的文章.这次想写一些关于设计模式的文章,用自己的理解和代码来写,算是复习一遍 ...
- 搭建Vue.js开发环境(window10)
我在配置Vue.js环境的时候遇到了很多的问题,希望能把这些解决方法也介绍给大家,希望能帮到大家,共同学习. 如果要转发,请注明原作者和原产地,谢谢! 注释:下面任何命令都是在windows的命令行工 ...
- 机器学习笔记3-Tensorflow简介
前言 前面两篇主要写了一些机器学习的基础概念,从本篇开始我们来了解下深度学习.深度学习是机器学习的一个子集,是一种特殊的数学模型.同样是从输入到输出,深度学习在这两者之间会有很多层称为"隐层 ...