Vuex 入门到入门

u=2107628671,2584778861&fm=193.jpg

vuex五大核心 1.State 2.Getters 3.Mutations 4.Actions 5.Module 我们项目中需要的都是:state、getters、mutations、actions里面的东西 调用方法和使用的位置也是有区别的分别是 不过vuex给我们提供了辅助函数:mapState , mapMutations , mapActions , mapGetters

调用 方法 辅助函数
state this.$store.state. xxx mapState
getters this.$store.getters. xxx mapGetters
mutations this.$store.cmmit((xxx) mapMutations
actions this.$store.dispatch(xxx) mapActions

==注意== mapStatemapGetter的使用只能在computed计算属性中, mapMutationsmapActions使用的时候只能在methods中调用否则报错

一 、项目引入

1.安装Vuex到项目中;

npm intsall vuex --save

添加上--save是因为这个包我们在生产环境中是要使用的。

2.创建store文件夹,位置与router同一层级;

添加代码:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)
// 创建Vuex实列
const store = new Vuex.Store({
  state:{
    count:1,
    name:"张三",
    age:20,
    gender:"男"
  },
  getters:{// 类似vue的computed
    getStateCount:function (state) { // 上面的state
      return state.count+1;
    }
  },
  mutations:{
    add(state){//上面定义的state对象
      state.count = state.count+1;
    },
    reduction(state){//上面定义的state对象
      state.count = state.count-1;
    }
  },
  actions:{// 注册action。类似vue里的methods
    addFun(context){//接收一个与store实列相同的方法
      context.commit("add");
    },
    reductionFun(context){
      context.commit("reduction");
    }
  }
})

export default store

3.引入到main.js文件中;

import store from './store'

new Vue({
  el: '#app',
  store,
  router,
  components: { App },
  template: '<App/>'
})

4.Vuex实际运用;

4.1 关于states属性引用

方式一

<h2>{{this.$store.state.count}}</h2>

方式二

<template>
  <div class="home">
    {{nickname}}
  </div>
</template>
<script>
export default {
  name: 'home',
  computed:{
    nickname(){
      return this.$store.state.nickname
    }
  }
}
</script>
computed: mapState({
    count: 'count'
}),
...mapState({
    count: state => state.count,
    name: state => state.name
  })

方式三 - mapState 辅助函数

<script>
import {mapState} from 'vuex'
export default {
  name: 'home',
  computed: mapState(['nickname','age','gender'])
}
</script>

记住:用mapState等这种辅助函数的时候,前面的方法名和获取的属性名是一致的。

4.2 关于getters引用

getters相当于vue中的计算属性,通过getters进一步处理,得到我们想要的值,而且允许传参,第一个参数就是state.

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
 
export default new Vuex.Store({
  state: { //存放状态
    nickname:'Simba',
    firstname:'张',
    lastname:'三丰',
    age:20,
    gender:'男',
    money:1000
  },
  getters:{
    realname(state){
      return state.firstname+state.lastname
    },
    money_us(state){
      return (state.money/7).toFixed(2)
    }
  },
  mutations: {},
  actions: {},
  modules: {}
})

Vue部分

方式一:

<h2>我是从Getters的计算属性的值:{{this.$store.getters.getStateCount}}</h2>

方式二:使用mapGetter

mapGetter 仅仅是将 store 中的 getter 映射到局部计算属性

computed: {  
 ...mapGetters({
 realnameALise: 'realname' // realname 不是字符串,对应的是getter里面的一个方法名字 然后将这个方法名字重新取一个别名 realnameALise
    money_usALise: 'money_us' // money_us 不是字符串,对应的是getter里面的一个方法名字 然后将这个方法名字重新取一个别名 money_usALise
 })
}
4.3 关于mutation引用

mutations需要通过commit来调用其里面的方法,它也可以传入参数,第一个参数是state,第二个参数是载荷(payLoad),也就是额外的参数.

(我们代码中定义的时候需要些mutations,它类似于vue中的methods.) 代码如下:

mutations: { //类似于methods
  addAge(state,payLoad){
     state.age+=payLoad.number
  }
}

template部分

<div class="home">
   <div><button @click="test">测试</button></div>
</div>

js部分

methods:{
 test(){
   this.$store.commit('addAge',{
     number:5
   })
 }
}

调用的时候第二个参数最好写成对象形式,这样我们就可以传递更多信息。

但是,这样写还是会遇到同样的问题,就是如果需要操作多个数据,就会变的麻烦,这时候我们就需要mapMutations,通过它将方法映射过来

mapMutations运用

mapMutations 其实跟mapState 的作用是类似的,将组件中的 methods 映射为 store.commit 调用

methods:{
 ...mapMutations(['addAge'])
}

mapMutations(['addAge'])这一句就相当于下面的代码

addAge(payLoad){
  this.$store.commit('addAge',payLoad)
}

参数我们可以在调用这个方法的时候写入

<button @click="addAge({number:5})">测试</button>
4.4 关于actions引用

action类似于mutation

但区别在于:action可以提交mutation

action也不要直接去操作state,而是去操作mutation

action包含异步操作,类似于axios请求,可以都放在action中写

action中的方法默认的就是异步,并且返回promise。举例代码如下:

store部分代码 - 在actions中定义一个方法:getUserInfo,并且返回一个对象

actions: {
  getUserInfo(){
    return {
      nickname:'Simba',
      age:20
    }
  }
}

vue部分

方法一:

created(){
  var res = this.getUserInfo()
  console.log(res)
 
},
methods:{
  ...mapActions(['getUserInfo'])
}
<script>
methods: {

 ...mapMutations({

 totalAlise: 'clickTotal' // clickTotal 是mutation 里的方法,totalAlise是重新定义的一个别名方法,本组件直接调用这个方法

 }),

   ...mapActions({

 blogAdd: 'blogAdd' // 第一个blogAdd是定义的一个函数别名称,挂载在到this(vue)实例上,后面一个blogAdd 才是actions里面函数方法名称

 }) 

} } 
</script>

mapActions(['getUserInfo']) 相当于以下代码

getUserInfo(){
  return this.$store.dispatch(‘getUserInfo’)
}

mapActions, action的一个辅助函数,将组件的 methods 映射为 store.dispatch 调用

方法二:

store部分:

actions: {
  // 登录
  Login({ commit }, userInfo) {
    const username = userInfo.username.trim()
    return new Promise((resolve, reject) => {
      login(username, userInfo.password).then(response => {
        const data = response.data
        const tokenStr = data.tokenHead+data.token
        setToken(tokenStr)
        commit('SET_TOKEN', tokenStr)
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  }
}

vue部分:

  methods: {
    this.$store.dispatch('Login', this.loginForm).then(() => {
       
      }).catch(() => {
      
      }) 
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354