这篇文章主要介绍了Vuex入门到上手教程,小编以为挺不错的,如今分享给你们,也给你们作个参考。一块儿跟随小编过来看看吧vue
1、前言webpack
当咱们的应用遇到多个组件共享状态时,会须要多个组件依赖于同一状态。传参的方法对于多层嵌套的组件将会很是繁琐,而且对于兄弟组件间的状态传递无能为力。在搭建下面页面时,你可能会对 vue 组件之间的通讯感到崩溃 ,特别是非父子组件之间通讯。此时就应该使用vuex,轻松能够搞定组件间通讯问题。web
2、什么是Vuexvuex
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的全部组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。这里的关键在于集中式存储管理。 这意味着原本须要共享状态的更新是须要组件之间通信的,而如今有了vuex,就组件就都和store通信了 。vue-cli
3、何时使用Vuexnpm
虽然 Vuex 能够帮助咱们管理共享状态,但也附带了更多的概念和框架。这须要对短时间和长期效益进行权衡。 若是您的应用够简单,您最好不要使用 Vuex,由于使用 Vuex 多是繁琐冗余的。一个简单的global event bus就足够您所需了。可是, 若是您须要构建一个中大型单页应用,您极可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为天然而然的选择。数组
4、Vuex安装(限定开发环境为 vue-cli)app
首先要安装vue-cli脚手架,对于大陆用户,建议将npm的注册表源设置为国内的镜像(淘宝镜像),能够大幅提高安装速度。框架
`npm config` `set` `registry https:``//``[registry.npm.taobao.org](http:``//registry``.npm.taobao.org/)` `npm config get registry``//``配置后可经过下面方式来验证是否成功` `npm` `install` `-g cnpm --registry=[https:``//registry``](https:``//registry/``).npm.taobao.org` `//cnpm``安装脚手架` `cnpm` `install` `-g vue-cli` `vue init webpack my-vue` `cd` `my-vue` `cnpm` `install` `cnpm run dev` 脚手架安装好后,再安装vuex cnpm install vuex --save
5、如何使用Vuex异步
1.如何经过Vuex来实现以下效果?
①建立一个store.js文件
`import Vue from` `"vue"` `import Vuex from` `"vuex"` `Vue.use(Vuex)` `const store =` `new` `Vuex.Store({` `state: {` `//这里的state必须是JSON,是一个对象` `count: 1` `//这是初始值` `},` `mutations: {``//突变,罗列全部可能改变state的方法` `ad(state) {` `state.count++;` `//直接改变了state中的值,而并非返回了一个新的state` `},` `reduce(state){` `state.count--;` `}` `}` `});` `export` `default` `store;``//用export default 封装代码,让外部能够引用` ②在main.js文件中引入store.js文件 `import store from` `"./vuex/store"` `new` `Vue({` `router,` `store,` `el:` `'#app'``,` `render: h => h(App)` `})` ③新建一个模板count.vue `<``template``>` `<``div``>` `<``h2``>{{msg}}</``h2``><``hr``/>` `<``h2``>{{$store.state.count}}-{{count}}</``h2``>//这两种写法均可以` `<``button` `@``click``=``"addNumber"``>+</``button``>` `<``button` `@``click``=``"reduceNumber"``>-</``button``>` `</``div``>` `</``template``>` `<``script``>` `import {mapState} from 'vuex'` `export default {` `data() {` `return {` `msg: "Hello Vuex"` `};` `},` `methods: {` `addNumber() {` `return this.$store.commit("add");` `},` `reduceNumber() {` `return this.$store.commit("reduce");` `}` `},` `computed: mapState(['count'])// 映射 this.count 到 this.$store.state.count` `mapState 函数能够接受一个对象,也能够接收一个数组` `};` `</``script``>`
因为 store 中的状态是响应式的,当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地获得高效更新。 在组件中调用 store 中的状态简单到仅须要在计算属性中返回便可。改变store 中的状态的惟一途径就是显式地提交 (commit) mutations。
这样,咱们就能够实现自增1或是自减1,那假如咱们想要点击一次实现自增2,这该如何实现,也就是如何向Mutations传值?
2.如何在Mutations里传递参数
先store.js文件里给add方法加上一个参数n
`mutations: {` `add(state,n) {` `state.count+=n;` `},` `reduce(state){` `state.count--;` `}` `}` 而后在Count.vue里修改按钮的commit( )方法传递的参数 `addNumber() {` `return` `this``.$store.commit(``"add"``,2);` `},` `reduceNumber() {` `return` `this``.$store.commit(``"reduce"``);` `}`
3.getters如何实现计算过滤操做**
getters从表面是得到的意思,能够把他看做在获取数据以前进行的一种再编辑,至关于对数据的一个过滤和加工。你能够把它看做store.js的计算属性。
例如:要对store.js文件中的count进行操做,在它输出前,给它加上100。
首先要在store.js里Vuex.Store()里引入getters
getters:{
count:state=>state.count+=100
}
而后在Count.vue中对computed进行配置,在vue 的构造器里边只能有一个computed属性,若是你写多个,只有最后一个computed属性可用,因此要用展开运算符”…”对上节写的computed属性进行一个改造。
`computed: {` `...mapState([``"count"``]),` `count() {` `return` `this``.$store.getters.count;` `}` `}`
须要注意的是,此时若是点击'+',就会增长102,若是点击'-',就会增长99,最后的结果是mutations和getters共同做用的。
4.actions如何实现异步修改状态
actions和上面的Mutations功能基本同样,不一样点是, actions是异步的改变state状态,而Mutations是同步改变状态 。
①在store.js中声明actions
`actions: {` `addAction(context) {` `context.commit(``'add'``, 2);``//一开始执行add,并传递参数2` `setTimeout(() => {` `context.commit(``'reduce'``)` `}, 2000);``//两秒后会执行reduce` `console.log(``'我比reduce提早执行'``);` `},` `reduceAction({` `commit` `}) {` `commit(``'reduce'``)` `}` `}`
actions是能够调用Mutations里的方法的,调用add和reduce两个方法。在addAction里使用setTimeOut进行延迟执行。在actions里写了两个方法addAction和reduceAction,两个方法传递的参数也不同。
context:上下文对象,这里你能够理解称store自己。 {commit}:直接把commit对象传递过来,可让方法体逻辑和代码更清晰明了
②模板中的使用
`<``p``>` `<``button` `@``click``=``"addNumber"``>+</``button``>` `<``button` `@``click``=``"reduceNumber"``>-</``button``>` `</``p``>` `<``p``> ` `<``button` `@``click``=``"addAction"``>+</``button``>//新增` `<``button` `@``click``=``"reduceAction"``>-</``button``>//新增` `</``p``>` `import { mapState, mapGetters, mapActions } from` `"vuex"``;` `methods:{` `...mapMutations([` `'add'``,``'reduce'` `]),` `...mapActions([``'addAction'``,``'reduceAction'``])` `}`
最后获得以下效果:点击addAction按钮事件时,先累加2,两秒后再减去1,而addNumber事件则不能实现异步效果。
以上就是本文的所有内容,但愿对你们的学习有所帮助。