六、Vuex介绍

一、Vuex介绍

当我们在Vue对象中定义一个变量时,想要在其他的Vue对象或者js文件中想使用这个变量往往是很不容易的,而且Vue对象中的变量随着Vue销毁而销毁,所以需要一个全局的公共的数据仓库来管理这些变量,让这些变量的可以在任意组件中使用,它有着自身的生命周期,不会随着某一个Vue对象的销毁而销毁
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它用以在不同的Vue对象中维护一个统一的数据仓库,并记录用户对数据仓库的操作,便于开发者随时了解和追踪数据仓库的变化和来源

二、Vuex基本使用

  1. 在codesandbox创建一个Vue项目
    打开https://codesandbox.io/s/vue
    在上面注册一个账号,并新建一个Vue项目

2.添加Vuex依赖

添加Vuex依赖

点击左侧 Add Dependency蓝色按钮,搜索Vuex


选择Vuex依赖

点击第一个Vuex添加


添加Vuex依赖成功

如上图箭头所示Vuex依赖已成功添加
  1. 引入vuex和初始化vuex仓库

在src目录下新建store文件夹和index.js


vuex仓库

并向index.js增加如下代码

import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    CHANGE(state, value) {
      state.count = value;
    }
  },
  actions: {
    add({ commit, state }) {
      commit("CHANGE", state.count + 1);
    },
    reduce({ commit, state }) {
      commit("CHANGE", state.count - 1);
    }
  }
});

export default store;


在src/main.js新增如下代码

import store from "./store/index";

new Vue({
  store,
  render: h => h(App)
}).$mount("#app");

修改App.vue为如下代码

<template>
  <div id="app">
    <button @click="reduce">-</button>
    <div>{{count}}</div>
    <button @click="add">+</button>
  </div>
</template>

<script>
export default {
  name: "App",
  computed: {
    count() {
      return this.$store.state.count;
    }
  },
  methods: {
    add() {
      this.$store.dispatch("add");
    },
    reduce() {
      this.$store.dispatch("reduce");
    }
  }
};
</script>

<style>
#app {
  display: flex;
  justify-content: center;
}
</style>

我们的vuex计数器便完成了,点击右侧刷新来查看这个计数器


计数器

三、Vuex概念介绍

  1. state

state是vuex中的数据仓库,我们把需要存放的数据放到state中,并在页面中通过使用this.$store.state来获取这个数据


定义state

使用state中的数据
  1. mutations

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件,我们通过定义mutations中的方法来修改state,如下图所示,定义了CHANGE方法,它会把传入的value赋值给state.count


mutations
  1. action

action 类似于 mutation,不同在于:

  • Action 提交的是 mutation,而不是直接变更状态
  • Action 可以包含任意异步操作

如下图所示,我们定义了两个action,一个是add负责增加count,另一个是reduce负责减少count,它们通过调用commit('名称', 值)的方式来调用上面定义的mutation实现对state的修改


action定义

在页面中我们通过调用this.$store.dispath('action名称')来调用action


action使用

三、Vuex在不同页面中使用
  1. 新建一个操作组件,如下图所示我们在components文件夹下新建一个operate.vue组件


    操作组件
  2. 在operate.vue中添加如下代码
<template>
  <div class="operate_box">
    <input type="number" v-model="count">
  </div>
</template>

<script>
export default {
  computed: {
    count: {
      get: function() {
        return this.$store.state.count;
      },
      set: function(value) {
        this.$store.dispatch("setCount", value);
      }
    }
  }
};
</script>
  1. 在App.vue中引入该组件,新增如下代码导入组件
<template>
  <div>
    <operate></operate>
  </div>
</template>
<script>
import operate from "./components/operate.vue";
export default {
  components: {
    operate
  }
};
</script>
  1. 修改Vuex的store新增setCount方法
const store = new Vuex.Store({
  actions: {
    setCount({ commit }, value) {
      commit("CHANGE", value);
    }
  }
});

5.可以看到我们在operate.vue中也可以展示和改变Vuex中的数据


Vuex不同组件

codesandbox代码

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

推荐阅读更多精彩内容

  • 标签:Vuex iplas 介绍 每一个 Vuex 应用的核心就是 store(仓库), 是一个专为 Vue.js...
    傑仔阅读 1,088评论 0 1
  • vuex是一个状态管理模式,通过用户的actions触发事件,然后通过mutations去更改数据(你也可以说状态...
    Ming_Hu阅读 2,014评论 3 3
  • Vuex 概念篇 Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式...
    Junting阅读 3,062评论 0 43
  • Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应...
    白水螺丝阅读 4,652评论 7 61
  • vuex 场景重现:一个用户在注册页面注册了手机号码,跳转到登录页面也想拿到这个手机号码,你可以通过vue的组件化...
    sunny519111阅读 8,007评论 4 111