Vuex

vuex的作用是在vue的项目中方便与页面与页面之间值的传递。

一. 安装vuex,使用命令

npm install vuex --save

二. 引入vuex

在项目src文件夹中创建一个目录store,在该目录下新建一个index.js文件,我们用来创建vuex实例,然后在该文件中引入vue和vuex,创建Vuex.Store实例保存到变量store中,最后使用export default导出store:

import Vue from "vue"; //引入vue
import Vuex from "vuex"; //引入vuex

//使用vuex
Vue.ues(Vuex);

//创建vuex实例
const store = new Vuex.store({

})
export default store

三. 在主文件添加上面创建的文件

在main.js文件中引入该文件,在文件里面添加 import store from ‘./store’;,再在vue实例全局引入store对象


State

vuex中的数据源,我们需要保存的数据就保存在store/index.js,可以在页面通过 this.$store.state来获取我们定义的数据;

import Vue from "vue"; //引入vue
import Vuex from "vuex"; //引入vuex

//使用vuex
Vue.ues(Vuex);

//创建vuex实例
const store = new Vuex.store({
  state: {
     count: 1
  }
})
export default store

Getters:

Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果。
vue文件内容:

<div>我是从页面上直接获得的: {{this.$store.state.count}}</div>
<div>我是从getter获取的计算的值: {{this.$store.getters.getStateCount}}</div>

store/index.js文件如下:

import Vue from "vue"; //引入vue
import Vuex from "vuex"; //引入vuex

//使用vuex
Vue.ues(Vuex);

//创建vuex实例
const store = new Vuex.store({
  state: {
     count: 1
  },
  getters: {
    getStateCount: function(state) {  //为上面的state
       return state.count ++;
    }
  }
})
export default store

Mutations:

如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值:

<div>count的值: {{this.$store.state.count}}</div>
<button @click="addFun">加</button>
<button @click="reductionFun">减</button>

<script>
  export default {
    name: "HelloWorld",
    data() {
      return {}
    },
    methods: {
      addFun() {
        this.$store.commit("add");
      },
      reductionFun() {
        this.$store.commit("reduction");
      }
    }
  }
</script>

在store/index.js文件中,添加mutations,并定义两个函数add和reduction

import Vue from "vue"; //引入vue
import Vuex from "vuex"; //引入vuex

//使用vuex
Vue.ues(Vuex);

//创建vuex实例
const store = new Vuex.store({
  state: {
     count: 1
  },
  getters: {
    getStateCount: function(state) {  //为上面的state
       return state.count ++;
    }
  },
  mutations: {
    add(state) {
      state.count ++;
    },
    reduction(state) {
      state.count --;
    },
  }
})
export default store

Actions:

我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数:

import Vue from "vue"; //引入vue
import Vuex from "vuex"; //引入vuex

//使用vuex
Vue.ues(Vuex);

//创建vuex实例
const store = new Vuex.store({
  state: {
     count: 1
  },
  getters: {
    getStateCount: function(state) {  //为上面的state
       return state.count ++;
    }
  },
  mutations: {
    add(state) {
      state.count ++;
    },
    reduction(state) {
      state.count --;
    },
  },
  actions: { //注册actions,类似vue中的methods
    addFun(context) { //接受一个与store实例具有相同方法的属性的context对象
      context.commit("add");
    },
    reductionFun(context) {
      context.commit("reduction");
    },
  }
})
export default store

然后我们去修改Hello World.vue文件

<div>count的值: {{this.$store.state.count}}</div>
<button @click="addFun">加</button>
<button @click="reductionFun">减</button>

<script>
  export default {
    name: "HelloWorld",
    data() {
      return {}
    },
    methods: {
      addFun() {
        //this.$store.commit("add");
        this.$store.dispatch("addFun");
      },
      reductionFun() {
        //this.$store.commit("reduction");
        this.$store.dispatch("reductionFun");
      }
    }
  }
</script>

如果我们需要指定加减的数值,那么我们直接传入dispatch中的第二个参数,然后在actions中的对应函数中接受参数在传递给mutations中的函数进行计算:

<div>count的值: {{this.$store.state.count}}</div>
<button @click="addFun">加</button>
<button @click="reductionFun">减</button>

<script>
  export default {
    name: "HelloWorld",
    data() {
      return {}
    },
    methods: {
      addFun() {
        //this.$store.commit("add");
        this.$store.dispatch("addFun");
      },
      reductionFun() {
        var n = 10
        //this.$store.commit("reduction");
        this.$store.dispatch("reductionFun", n);
      }
    }
  }
</script>

store/index.js修改如下

import Vue from "vue"; //引入vue
import Vuex from "vuex"; //引入vuex

//使用vuex
Vue.ues(Vuex);

//创建vuex实例
const store = new Vuex.store({
  state: {
     count: 1
  },
  getters: {
    getStateCount: function(state) {  //为上面的state
       return state.count ++;
    }
  },
  mutations: {
    add(state) {
      state.count ++;
    },
    reduction(state, n) {
      //state.count --;
      state.count = state.count - n; //传入需要减掉的值
    },
  },
  actions: { //注册actions,类似vue中的methods
    addFun(context) { //接受一个与store实例具有相同方法的属性的context对象
      context.commit("add");
    },
    reductionFun(context, n) {
      context.commit("reduction", n);
    },
  }
})
export default store

mapState、mapGetters、mapActions

如果我们不喜欢这种在页面上使用“this.stroe.state.count”和“this.store.dispatch('funName')”这种很长的写法,那么我们可以使用mapState、mapGetters、mapActions就不会这么麻烦了;

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

推荐阅读更多精彩内容

  • 上一章总结了 Vuex 的框架原理,这一章我们将从 Vuex 的入口文件开始,分步骤阅读和解析源码。由于 Vuex...
    你的肖同学阅读 1,786评论 3 16
  • 目录 - 1.什么是vuex? - 2.为什么要使用Vuex? - 3.vuex的核心概念?||如何在组件中去使用...
    我跟你蒋阅读 4,110评论 4 51
  • vuex是一个专门为vue.js设计的集中式状态管理架构,——数据仓库。 状态:在这可以理解为在data中的属性需...
    晏子小七阅读 159评论 0 0
  • vuex 场景重现:一个用户在注册页面注册了手机号码,跳转到登录页面也想拿到这个手机号码,你可以通过vue的组件化...
    sunny519111阅读 8,015评论 4 111
  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 2,934评论 0 7