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,放弃吧!

vuex中文官网:https://vuex.vuejs.org/zh-cn/

以上教程全部原创,手打,难免有错误的地方,请各位指正!
如果想一起学习,加入我们的前端交流群:565996731(注明:博客园)
一只熊的北极    2018-01-23 

原文地址:https://www.cnblogs.com/liningstyle/p/8335129.html

时间: 2024-10-19 22:31:17

vuex使用心得分享(填坑)的相关文章

GC overhead limit exceeded填坑心得

我遇到这样的问题,本地部署时抛出异常java.lang.OutOfMemoryError:GC overhead limit exceeded导致服务起不来,查看日志发现加载了太多资源到内存,本地的性能也不好,gc时间消耗的较多.解决这种问题两种方法是,增加参数,-XX:-UseGCOverheadLimit,关闭这个特性,同时增加heap大小,-Xmx1024m.坑填了,but why? OOM大家都知道,就是JVM内存溢出了,那GC overhead limit exceed呢? GC ov

css 填坑常用代码分享

以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. /*强制不换行*/ white-space:nowrap; /*自动换行*/ word-wrap: break-word; word-break: normal; /*强制英文单词断行*/ word-break:break-all; 2. 两端对齐 text-align:justify;text-justify:inter-ideogra 3. 去掉Webkit(chrome)浏览器中input(文本框)或texta

css 填坑常用代码分享[居家实用型]

原文地址 http://www.cnblogs.com/jikey/p/4233003.html 以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. 一. css 2.x code 1. 文字换行 /*强制不换行*/ white-space:nowrap; /*自动换行*/ word-wrap: break-word; word-break: normal; /*强制英文单词断行*/ word-break:break-all; 2. 两端对齐 text-align:j

Android Tips – 填坑手册

出于: androidChina   http://www.androidchina.net/3595.html 学习 Android 至今,大大小小的坑没少踩,庆幸的是,在强大的搜索引擎与无私奉献的人们的帮助下,我遇到的坑都顺利地被填平了. 为了便于日后遇到同样的问题时,能免于再次搜索带来的麻烦,我养成了收藏书签的习惯,随着书签(Tips)的日积月累,我想,是时候该有这个项目了. 如果你是个 Android 新人,那么我希望这份列表,可以成为你踩到坑时的不完全手册. 当然,这份列表一定会有遗漏

一名Android开发者的微信小程序填坑之路(2)

前言 上一篇是九月二十七日写的,而这一篇我动笔的时间是十月十日(特殊的日子),中间相隔十三天--当然是因为国庆节.说老实话,这十三天里面我都没有碰和小程序有关的东西--毕竟学习小程序的开发也只是起于兴趣,而平时的工作并不会涉及与其相关的东西--但是在这十三天里,我能明显的感受到小程序热正在逐渐的消退,或者说大家正在逐渐以一种较为平和的姿态接受它的存在,其实这是一件好事.期待公测的到来. 接下来我就直接进入正题了,另外,文末我想和大家分享一下我的国庆节. PS:这篇文章是接着上一篇文章 一名And

踩坑(Running)填坑(ZSSURE):DevExpress的XtraTabControl、Telerik的OpenAccessContext以及StarUML

题记: 今天好友在朋友圈分享了一篇有深度的好文"请鼓励你的孩子做个幸福普通人",文章略显长,细细品读下来感触颇多.加之最近天天看着小外甥大睿睿的一步步的成长,已渐渐远离年轻稚嫩.走向成熟稳重的我对学习有了新的认识,回想起自己的成长过程,经验和技能并非是父母手把手教导的,反而是他们给我营造的"自由.开放.甚至略显放纵"的环境.他们以身作则的行动,让我从中体会.感悟出了所有的点点滴滴. 说到现在从事的软件研发工作,想想同学中毕业鲜有留下来做技术的(姑且认为IT民工也属于

Vue2.0 新手完全填坑攻略——从环境搭建到发布

本文作者 Jinkey(微信公众号 jinkey-love,官网 https://jinkey.ai) 原文链接 https://jinkey.ai/post/tech/vue2.0-xin-shou-wan-quan-tian-keng-gong-lue-cong-huan-jing-da-jian-dao-fa-bu 文章允许非篡改署名转载,删除或修改本段版权信息转载的,视为侵犯知识产权,我们保留追求您法律责任的权利,特此声明! 感谢 showonne.yubang 技术指导 Demo 地址

WindowsPhone&amp;amp;Windows8.1&amp;amp;Windows8&amp;amp;Unity3d 填坑日记

近期的游戏开发大体上接近尾声,总结了不少关于Unity3d面向Windows几大平台开发时遇到的各种坑以及怎样填坑的经验.总的来说,Windows8.1 Windows8/RT以及WindowsPhone这几个平台的开发人员很的少,文档也很的有限.甚至于MSDN的文档写的也是不清不楚.所以我认为有必要用一系列的文章具体的和大家分享一下. 这一篇仅仅是一个文件夹,先介绍一下我要写的一些部分: 1. Unity项目导出至各个平台注意事项. 2. API不兼容问题以及怎样解决. 3. Windows8

支付宝和微信支付的各种填坑

填坑 支付宝填坑是每个接入支付宝必经之路,下面是我接入支付宝遇到的问题汇总,希望大家在接入的路上少一点弯路 问题1. Util/base64.h:63:21: Cannot find interface declaration for ‘NSObject’, superclass of ‘Base64’ 解决办法: 这是base64.h中没有加入#import 系统库文件导致,这个错误报错方法直接想喷它一脸.报错方式太恶心. 1 2 解决办法: 这是base64.h中没有加入#import  系