Vuex介绍

概念

在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应用中多个组件的共享状态进行集中式的管理(读写),也是一种组件间通信的方式,且适用于任意组件间通信

何时使用

多个组件需要共享数据时

求和案例–纯vue版

新建 Count.vue 组件,并在 App.vue 中注册引用

<template>
  <div>
    <Count/>
  </div>
</template>

<script>
import Count from "@/components/Count";

export default {
  name: 'App',
  components: {Count},
}
</script>

<style>

</style>

我们主要关注 Count.vue

<template>
  <div class="category">
    <h1>当前求和为:{{ sum }}</h1>
    <select v-model="n">
      <!--这里的value前有冒号,否则value值是字符串-->
      <option :value="1">1</option>
      <option :value="2">2</option>
      <option :value="3">3</option>
    </select>

    <!--v-model.number收集到的数据强转为number-->
<!--    <select v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>-->
    <button @click="increment"> </button>
    <button @click="decrement">-</button>
    <button @click="incrementOdd">当前和为奇数再加</button>
    <button @click="incrementWait">等一等再加</button>
  </div>
</template>

<script>
export default {
  name: "Count",
  data() {
    return {
      n: 1,//用户选择的数字
      sum: 0,//当前和
    }
  },
  methods: {
    increment() {
      this.sum  = this.n
    },
    decrement() {
      this.sum -= this.n
    },
    incrementOdd() {
      if (this.sum % 2) {
        this.sum  = this.n
      }
    },
    incrementWait() {
      setTimeout(() => {
        this.sum  = this.n
      }, 500)
    }
  }
}
</script>

<style scoped>
select, button {
  margin-right: 5px;
}
</style>

搭建vuex环境

注意:

vue2 中要使用 vuex 的 3 版本
vue3 中要使用 vuex 的 4 版本

因为我们使用的是 vue2 所以我们需要安装 vuex 的 3 版本

  • 1、执行 npm i vuex@3 来安装 vuex 3 版本
  • 2、src 下创建 store 文件夹,在其中创建一个 index.js

index.js

//该文件用于创建vuex中最为核心的store

//引入vuex
import Vuex from 'vuex'
//引入vue
import Vue from "vue";
//应用vuex插件
Vue.use(Vuex)

//准备actions;用于相应组件中的动作
const actions = {}
//准备mutations;用于操作数据(state)
const mutations = {}
//准备state;用于存储数据
const state = {}

//创建并暴露store
export default new Vuex.Store({
    actions:actions,
    mutations,//key和value重名了,简写
    state,//key和value重名了,简写
});

3、main.js 中引入刚才写好的 store

......
//引入store
//import store from './store/index'
import store from './store'

......

//创建vm
new Vue({
    el: "#app",
    //store:store
    store,//触发简写形式
    ......
})

运行项目,我们可以打印 vm 和 vc,可以看到 $store

求和案例–vuex版

我们将求和的案例改为 vuex 版本

1、首先把数据交给 state

所以我们把 Count 组件中的数据 sum 变量剪切走放到 index.js 中的 state 中,同时 Count 组件中的方法,例如加法 increment 中使用 this.$store.dispatch("方法名",变量) 来替代原来的方法。这样就走完了流程图中以下部分

Count.vue

<template>
  <div class="category">
    <h1>当前求和为:{{$store.state.sum}}</h1>
    ......
  </div>
</template>

<script>
export default {
  name: "Count",
  data() {
    return {
      n: 1,//用户选择的数字
    }
  },
  methods: {
    increment() {
      this.$store.dispatch("jia",this.n);
    }
    ......
  }
}
</script>

同时 index.js 中的 action 中添加对应的方法名,从图上的流程图来看,actions 中的东西会交到 mutations 中处理,所以需要手动调用 commit方法

mutation 中也需要增加同样的方法名,这里可以都改成大写,做个区分。方法中第一个参数就是 state,方法中处理真实逻辑即可

index.js

//该文件用于创建vuex中最为核心的store

//引入vuex
import Vuex from 'vuex'
//引入vue
import Vue from "vue";
//应用vuex插件
Vue.use(Vuex)

//准备actions;用于相应组件中的动作
const actions = {
    /*jia:function () {
    }*/
    //简写为:
    jia(context,value){
        console.log("actions中的jia被调用了",context,value);
        context.commit("JIA",value)
    }
}
//准备mutations;用于操作数据(state)
const mutations = {
    JIA(state,value){
        console.log("mutations中的JIA被调用了",state,value);
        state.sum  = value;
    }
}

//准备state;用于存储数据
const state = {
    sum: 0,//当前和
}

//创建并暴露store
export default new Vuex.Store({
    actions:actions,
    mutations,//key和value重名了,简写
    state,//key和value重名了,简写
});

log 输出:

运行程序:

我们根据以上思路完善其他方法

Count.vue

<template>
  <div class="category">
    <h1>当前求和为:{{$store.state.sum}}</h1>
    <select v-model="n">
      <!--这里的value前有冒号,否则value值是字符串-->
      <option :value="1">1</option>
      <option :value="2">2</option>
      <option :value="3">3</option>
    </select>
    <button @click="increment"> </button>
    <button @click="decrement">-</button>
    <button @click="incrementOdd">当前和为奇数再加</button>
    <button @click="incrementWait">等一等再加</button>
  </div>
</template>

<script>
export default {
  name: "Count",
  data() {
    return {
      n: 1,//用户选择的数字
    }
  },
  methods: {
    increment() {
      this.$store.dispatch("jia",this.n);
    },
    decrement() {
      this.$store.commit("JIAN",this.n);
    },
    incrementOdd() {
      this.$store.dispatch("jiaOdd",this.n);
    },
    incrementWait() {
      this.$store.dispatch("jiaWait",this.n);
    }
  }
}
</script>

<style scoped>
select, button {
  margin-right: 5px;
}
</style>

index.js

//该文件用于创建vuex中最为核心的store

//引入vuex
import Vuex from 'vuex'
//引入vue
import Vue from "vue";
//应用vuex插件
Vue.use(Vuex)

//准备actions;用于相应组件中的动作
const actions = {
    /*jia:function () {
    }*/
    //简写为:
    jia(context,value){
        console.log("actions中的jia被调用了");
        context.commit("JIA",value)
    },
    jiaOdd(context,value){
        console.log("actions中的jianOdd被调用了");
        if(context.state.sum % 2){
            context.commit("JIA",value)
        }
    },
    jiaWait(context,value){
        console.log("actions中的jianWait被调用了");
        setTimeout(() => {
            context.commit("JIA",value)
        }, 500)
    }
}
//准备mutations;用于操作数据(state)
const mutations = {
    JIA(state,value){
        console.log("mutations中的JIA被调用了",state,value);
        state.sum  = value;
    },
    JIAN(state,value){
        console.log("mutations中的JIAN被调用了",state,value);
        state.sum -= value;
    }
}

//准备state;用于存储数据
const state = {
    sum: 0,//当前和
}

//创建并暴露store
export default new Vuex.Store({
    actions:actions,
    mutations,//key和value重名了,简写
    state,//key和value重名了,简写
});

到此为止,功能就实现了,你发现了吗,这里做了些优化,由于 index.js 中的 jia、jian方法里边什么都没做,直接就 commit 给了 mutation,而 vc 是可以直接对话 Mutations 的,如下图:

所以我们把 index.js 中 actions 中的 jian方法去掉,在 Count 中直接调用 mutation 中的方法,也就是我们把 jian方法去掉,在 Count 的 decrement 方法中直接调用 commit 了

decrement() {
    this.$store.commit("JIAN",this.n);
},

若没有网络请求或其他业务逻辑,组件中也可以越过 actions,即不写 dispatch,直接编写 commit

一些疑惑和问题

index.js 中的上下文有什么作用?我们可以打印下 context:

可以看到其中有dispatch、commit、state这些熟悉的身影。我们用 jiaOdd 举例,当方法逻辑处理复杂时,可以继续 dispatch 其他方法来分担。而有了 state 我们可以拿到其中的 sum 值:

    jiaOdd(context,value){
        console.log("actions中的jianOdd被调用了",context);
        if(context.state.sum % 2){
            context.commit("JIA",value)
        }
        context.dispatch("demo",value)
    },
    demo() {
        //处理一些事情
    },

到此这篇关于Vue Vuex搭建vuex环境及vuex求和案例分享的文章就介绍到这了,更多相关Vue Vuex 搭建内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Vue Vuex搭建vuex环境及vuex求和案例分享的更多相关文章

  1. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  2. vue自定义加载指令v-loading占位图指令v-showimg

    这篇文章主要为大家介绍了vue自定义加载指令和v-loading占位图指令v-showimg的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. vue使用动画实现滚动表格效果

    这篇文章主要为大家详细介绍了vue使用动画实现滚动表格效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  4. 关于Vue 监控数组的问题

    这篇文章主要介绍了Vue 监控数组的示例,主要包括Vue 是如何追踪数据发生变化,Vue 如何更新数组以及为什么有些数组的数据变更不能被 Vue 监测到,对vue监控数组知识是面试比较常见的问题,感兴趣的朋友一起看看吧

  5. Vue子组件props从父组件接收数据并存入data

    这篇文章主要介绍了Vue子组件props从父组件接收数据并存入data的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  6. 如何在PHP环境中使用ProtoBuf数据格式

    这篇文章主要介绍了如何在PHP环境中使用ProtoBuf数据格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  7. Vue h函数的使用详解

    本文主要介绍了Vue h函数的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  8. VUE响应式原理的实现详解

    这篇文章主要为大家详细介绍了VUE响应式原理的实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

  9. vue+Element ui实现照片墙效果

    这篇文章主要为大家详细介绍了vue+Element ui实现照片墙效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. vue+elemet实现表格手动合并行列

    这篇文章主要为大家详细介绍了vue+elemet实现表格手动合并行列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部