Vue Vuex学习(搭建vuex环境、vuex求和案例)

news/2024/7/10 0:59:50 标签: vue

文章目录

  • 理解Vuex
  • 求和案例--纯vue
  • 搭建vuex环境
  • 求和案例--vuex版
  • 一些疑惑和问题

理解Vuex

Vuex介绍

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

何时使用
多个组件需要共享数据时
在这里插入图片描述
在这里插入图片描述

vue_11">求和案例–纯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_98">搭建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_155">求和案例–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 中的 jiajian方法里边什么都没做,直接就 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:
在这里插入图片描述
可以看到其中有dispatchcommitstate这些熟悉的身影。我们用 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配置项、多组件数据共享案例)


http://www.niftyadmin.cn/n/1816717.html

相关文章

requireJS基本配置相关

requireJS: (1)实现js文件的异步加载&#xff0c;避免页面失去响应&#xff1b; (2)管理模块之间的依赖性&#xff0c;便于代码的编写和维护。 加载&#xff1a; <script src"js/require.js" ></script> 由于加载的模块较多&#xff0c;可能会造成页…

SOA系列二:采用SOA的常见失误

一、构建类似传统分布式架构的面向服务架构 或许组织在实现SOA时所面临的第一大障碍是&#xff0c;一构建当代SOA为借口来构建传统的分布式架构&#xff1b;二、非标准化的SOA 有时可能需要在较大的组织中同时规划不同的IT项目&#xff0c;因此定制标准极其重要。如…

jquery ajax 请求中多出现一次OPTIONS请求及其解决办法

http://www.tangshuang.net/2271.html 在上一篇《服务端php解决jquery ajax跨域请求restful api问题及实践》中&#xff0c;我简单介绍了如何通过服务端解决jquery ajax的跨域请求问题&#xff0c;但是&#xff0c;在这个过程中&#xff0c;我们会发现&#xff0c;在很多post,…

Vue Vuex学习(vuex配置项、多组件数据共享案例)

文章目录getters 配置项mapState、mapGettersmapActions、mapMutations多组件共享数据没有看过上一篇的同学可以查看&#xff1a; Vue Vuex学习(搭建vuex环境、vuex求和案例)getters 配置项 index.js 中增加 getters 配置项 //准备getters&#xff0c;用于将state中的数据进行…

在Struts2中集成Spring详细讲解

Spring的官方定义是&#xff1a;一个轻量级的IoC和Aop容器框架&#xff0c;它使用了一种叫做依赖注入的技术。 所谓依赖注入&#xff0c;就是指将创建对象以及协议依赖对象之间合作的责任从对象自身中转移到“工厂”中去&#xff0c;这个“工厂”通常由IoC容器提供。 Struts2与…

微信图片上传,遇到一个神奇的jgp

微信图片上传&#xff0c;获取图片base64遇到一个神奇的 jgp var imgFn function (event) {event.preventDefault();var id #$(this).attr(id);wx.chooseImage({count: 1, // 默认9sizeType: [compressed], // original, 可以指定是原图还是压缩图&#xff0c;默认二者都有…

Vue Vuex学习(vuex模块化+命名空间namespace)

文章目录Count.vue 分组修改Person.vue 分组修改继续优化&#xff0c;分成文件引入actions联系后端api练习总结没有看过上一篇的同学可以查看&#xff1a; Vue Vuex学习(vuex配置项、多组件数据共享案例)Count.vue 分组修改 index.js 分组先用起来 我们观察 index.js&#xf…

Vue 路由的基本使用

文章目录路由的理解路由的基本使用一些注意点嵌套路由路由的理解 生活中的路由&#xff1a; vue-router的理解&#xff1a; vue 的一个插件库&#xff0c;专门用来实现SPA应用(single page web application) 对SPA应用的理解&#xff1a; 1.单页Web应用(single page web ap…