学习笔记之Vuex(五)

news2024/11/24 7:22:40

Vuex

    • (五)Vuex
      • 一、什么是Vuex
      • 二、Vuex工作原理
      • 三、搭建Vuex环境
      • 四、求和案例分析
        • 4.1 求和案例——vue实现
        • 4.2 求和案例——vuex实现

(五)Vuex

一、什么是Vuex

1.概念

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

在多组件中要共享数据 x,是由全局事件总线实现的,这样做会很麻烦,每个组件之间都要进行全局事件绑定,如下图所示:

image-20230225012815359

但是如果使用Vuex实现,就需要把 x 提取到vuex中,所有组件就都可以使用,如下图所示:

image-20230225013034369

Github 地址: https://github.com/vuejs/vuex

2.什么时候使用 Vuex

  • 多个组件依赖于同一状态;
  • 来自不同组件的行为需要变更同一状态。

二、Vuex工作原理

image-20230225013149912

Vuex有三个重要的组成部分:

  • actions(行为):发送ajax请求
  • mutations(加工)
  • state(状态):数据所在处

将数据写入state中后,由vc实例对象调用dispatch()方法,然后就会引起actions中对应函数的调用,之后再其中调用commit()方法,然后就会引起mutations中对应函数的调用,这个函数中就有state和所传参数,然后自动就会继续mutate,改变state中的数据,最后就会重新解析渲染。

image-20230225115257087

如果出现需要其他服务器传入参数,就需要在actions中进行,发送Ajax请求,但是如果对于参数已知,可以直接跳过actions,通过直接调用commit()方法到mutations。

Vuex中三个重要的组成部分的类型都是对象,它们都是在store下面进行管理的,也就是说dispatch()方法、commit()方法都是store提供的。

(1)state

  • vuex 管理的状态对象;

  • 它应该是唯一的;

  • 示例代码:

    image-20230225123028173

(2)actions

  • 值为一个对象,包含多个响应用户动作的回调函数;

  • 通过 commit( )来触发 mutation 中函数的调用, 间接更新 state;

  • 如何触发 actions 中的回调?

    在组件中使用: $store.dispatch('对应的 action 回调名') 触发

  • 可以包含异步代码(定时器, ajax 等等);

  • 示例代码:

    image-20230225123021239

(3)mutations

  • 值是一个对象,包含多个直接更新 state 的方法

  • 谁能调用 mutations 中的方法?如何调用?

    在 action 中使用:commit('对应的 mutations 方法名')触发;

  • mutations 中方法的特点:不能写异步代码、只能单纯的操作 state;

  • 示例代码:

    image-20230225123247198

三、搭建Vuex环境

1.安装vuex

由于在2022年2月7日,vue3称为了默认版本,如果执行npm i vue,就会直接安装为vue3的了,vue3的默认版本是vuex4,vue2的默认版本是vuex3,如果在vue2项目中安装vuex4版本就会报错:

image-20230225120906392

所以vue2中,要用vuex的3版本,vue3中,要用vuex的4版本。

指定版本安装: npm i vuex@3

2.使用步骤:

(1)创建文件:src/store/index.js,该文件用于创建Vuex中最为核心的store;

//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//应用Vuex插件
Vue.use(Vuex)

//准备actions对象一响应组件中用户的动作
const actions = {}
//准备mutations对象一修改state中的数据
const mutations = {}
//准备state对象一保存具体的数据
const state = {}

//创建并暴露store
export default new Vuex.Store({
    actions, 
    mutations,
    state
)}

(2)在main.js中创建vm时传入store配置项。

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

//创建vm	
new Vue({
    el:'#app',
    render: h =》h(App),
    store
})

注意:vue脚手架在执行的时候,会扫描整个文件,然后将所有的import语句先执行,所以就需要在src/store/index.js文件中引用并使用Vuex。

搭建完毕后,在vc中就会出现store:

image-20230225122503901

四、求和案例分析

4.1 求和案例——vue实现

Count.vue文件:

这里注意在绑定数据的适合,为了传入的数据是数字number,不是字符串String,这里可以使用 v-model.number绑定,或者在value前面加冒号::value="1"

<template>
    <div>
        <h1>当前求和为:{{sum}}</h1>
        <select v-model="n">
            <!-- 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>
    button{
        margin-left: 5px;
    }
</style>

App.vue文件中:

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

<script>
    //引入组件
    import Count from './components/Count.vue'
    
    
export default {
    name:'App',
    components:{Count},
}
</script>

页面显示结果:

image-20230225130106423

4.2 求和案例——vuex实现

Count.vue文件:

<template>
    <div>
        <h1>当前求和为:{{$store.state.sum}}</h1>
        <select v-model="n">
            <!-- 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, //用户选择的数字
            }
        },
        methods:{
            //前面两个函数中什么添加也没有,所以可以直接通过commit写在mutations中
            increment(){
                this.$store.commit('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>
    button{
        margin-left: 5px;
    }
</style>

App.vue文件中:

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

<script>
    //引入组件
    import Count from './components/Count.vue'
    
    
export default {
    name:'App',
    components:{Count},
}
</script>

main.js文件中:

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//引入插件
import VueResource from 'vue-resource'
//引入store
import store from './store'

//关闭Vue的生产提示
Vue.config.productionTip = false
//使用插件
Vue.use(VueResource)


//创建vm
new Vue({
    el:'#app',
    render: h => h(App),
    store,
    beforeCreate() {
        Vue.prototype.$bus = this
    },
})

src/store/index.js文件中:

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

//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//应用Vuex插件
Vue.use(Vuex)

//准备actions对象一响应组件中用户的动作
const actions = {
    // //前面两个函数中什么添加也没有,所以可以直接通过commit写在mutations中
    // jia(context, value) {
    //     console.log('actions中的jia被调用了')
    //     context.commit('JIA',value)
    // },
    // jian(context, value) {
    //     console.log('actions中的jian被调用了')
    //     context.commit('JIAN',value)
    // },
    //后面两个函数中都添加了条件
    jiaOdd(context, value) {
        console.log('actions中的jiaOdd被调用了')
        if(context.state.sum % 2){
            context.commit('JIA',value)
        }
    },
    jiaWait(context, value) {
        console.log('actions中的jiaWait被调用了')
        setTimeout(()=>{
            context.commit('JIA',value)
        },500)
    },
}
//准备mutations对象一修改state中的数据
const mutations = {
    JIA(state,value){
        console.log('mutations中的JIA被调用了')
        state.sum += value
    },
    JIAN(state,value){
        console.log('mutations中的JIAN被调用了')
        state.sum -= value
    }
}
//准备state对象一保存具体的数据
const state = {
    sum:0 //当前的和
}

//创建并暴露store
export default new Vuex.Store({
    actions, 
    mutations,
    state
})

页面显示结果:

image-20230225130658697

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/374022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二节类型转换、运算符

类型转换 自动类型转换&#xff1a; 类型小的变量可以赋值给大的类型变量。 表达式的自动类型转换&#xff1a; byte short char在表达式中是当做 int计算的。 强制类型转换&#xff1a; 大类型的变量转化为小类型的变量。 注&#xff1a;浮点型转换为整数是直接丢掉小数部…

nacos config

https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config 必须在 bootstrap.properties 配置 nacos server 的地址 data id : 对应一个微服务 namespace : 对应环境 dev prod 默认 public group : 对应一个项目&#xff0c;&#xff0c;默认 DEFUALT_GROUP 当你…

神经网络 线性回归从0开始实现的代码分析 --跟李沐学AI

3.2. 线性回归的从零开始实现 — 动手学深度学习 2.0.0 documentation 分析了好几天才懂,个人水平有限 如果有错请指出 1.导包 %matplotlib inline import random import torch from d2l import torch as d2ldef synthetic_data(w, b, num_examples): #save""&quo…

spring integration使用:消息转换器

系列文章目录 …TODO spring integration开篇&#xff1a;说明 …TODO spring integration使用&#xff1a;消息路由 spring integration使用&#xff1a;消息转换器 spring integration使用&#xff1a;消息转换器系列文章目录前言消息转换器&#xff08;或者叫翻译器&#x…

SQLserver 语句查询当前数据库版本型号

SQL执行语句select serverproperty(productversion) as 产品版本号,serverproperty(productlevel) as 产品层次,serverproperty(edition) as 版本SQL执行历史记录&#xff1a;select version as 版本号select serverproperty(productversion) as 产品版本号,serverproperty(pro…

【Redis】一文搞懂 Redis 中的缓存穿透、缓存击穿、缓存雪崩及其解决方案

一文搞懂 Redis 中的缓存穿透、缓存击穿、缓存雪崩及其解决方案1. 缓存穿透1.1 什么是缓存穿透1.2 缓存穿透的解决方案1.2.1 缓存空对象1.2.2 布隆过滤器布隆过滤器工作原理Redis 使用布隆过滤器2. 缓存击穿1.1 什么是缓存击穿1.2 缓存击穿的解决方案1.2.1 设置热点数据永不过期…

【无限思维画布】制作思维导图第三步,节点移动与编辑

正在为无限词典制作单词思维导图功能&#xff0c;实现无限单词导图&#xff0c;无限思维画布。目前制作到第三步&#xff0c;实现节点移动与编辑&#xff1a; 节点移动与编辑Details 第一步&#xff0c;搜索 github。 一个是比较完善的&#xff0c;基于普通dom&#xff0c;用…

Random(二)什么是伪共享?@sun.misc.Contended注解

目录1.背景简介2.伪共享问题3.问题解决4.JDK使用示例1.背景简介 我们知道&#xff0c;CPU 是不能直接访问内存的&#xff0c;数据都是从高速缓存中加载到寄存器的&#xff0c;高速缓存又有 L1&#xff0c;L2&#xff0c;L3 等层级。在这里&#xff0c;我们先简化这些复杂的层级…

对象创建的过程

对象创建的过程 在语言层面上&#xff0c;创建对象通常仅仅是一个new关键字而已&#xff08;例外&#xff1a;复制、反序列化&#xff09;&#xff1b; 而在虚拟机中&#xff0c;对象的创建又是怎样一个过程呢&#xff1f;&#xff08;文中讨论的对象限于普通Java对象&#xff…

Jetpack Compose 深入探索系列一:Composable 函数

Composable 函数的含义 如果我们只专注于简单的语法&#xff0c;任何标准的Kotlin函数都可以成为一个可组合函数&#xff0c;只需将其注解为Composable: 通过这样做&#xff0c;我们实际上是在告诉编译器&#xff0c;该函数打算将一些数据转换为一个Node节点&#xff0c;以便注…

Simulink建模:如何学习Simulink建模

本文介绍博主自己学习Simulink建模的方法。后续博客都会按照本文中的思路来记录博主学习的过程。 文章目录1 Simulink建模的分类1.1 连续模型建模1.2 物理模型建模1.3 控制算法建模2 控制算法建模的基本知识2.1 控制算法与电控软件架构2.2 控制算法与周期调度2.3 控制算法与其他…

分布式-分布式缓存笔记

分布式系统缓存 缓存分类 前端缓存 前端缓存包括页面和浏览器缓存&#xff0c;如果是 App&#xff0c;那么在 App 端也会有缓存。当你打开商品详情页&#xff0c;除了首次打开以外&#xff0c;后面重复刷新时&#xff0c;页面上加载的信息来自多种缓存。 页面缓存属于客户端…

61 - 进程互斥锁的详细设计

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 问题1.1 生活中的示例1.1.1 吃饭问题1.1.2 十字路口1.1.3 洗手间1.1.4 生产消费者问题1.2 结论2. 接下来的问题2.1 临界资源&#xff08;Critical Resource&#xff09;2.2 临界区&#xff08;Critical Section&#xff09;2.3 任…

【C3】cpu_wtd_sysfs

文章目录2.cpu_wtd_sysfs&#xff1a;switchboard.c &#xff08;fpga下i2c访问Switch CPLD1&#xff0c;Switch CPLD2 &#xff1a;CPLD, FPGA , QSFP&#xff09;scriptbmc_wtd&#xff1a;syscpld.c中wd_en和wd_kick节点对应寄存器&#xff0c;crontab&#xff0c;FUNCNAMEA…

Spring事务的隔离级别

事务的特性: 隔离性:多个事务在并发执行的时候&#xff0c;多个事务执行的一个行为模式&#xff0c;当一个事务执行的时候&#xff0c;另一个事务执行的一个行为模式是什么&#xff1f; 1)A&#xff0c;原子性&#xff0c;一个事务中的所有操作&#xff0c;要么全部执行成功&am…

I2C误码了怎么处理

我相信不少人有遇到I2C设备识别不到&#xff0c;或者概率性误码。 我相信大部分工程师的做法如下&#xff1a; 1.调整上拉电阻的大小&#xff0c;然后重新老化测试&#xff1b; 2.降低I2C速率&#xff0c;然后老化测试&#xff1b; 3.软件加入一定判断条件&#xff0c;将能…

Ncvicat 打开sql文件方法

Nacicat打开sql文件时&#xff0c;有比较多的文章介绍可以直接打开&#xff0c;方法介绍的比较多&#xff0c;但是我遇到了一个坑&#xff0c;就是如何配置环境都无法打开。 本机环境&#xff1a; windows10 mysql 5.7.40 Navicat12.1 一、遇到问题情况 1.1、通过navicat…

Kubernetes向集群外部暴露服务的方式你知道吗?

Kubernetes向进群外暴露服务的方式有三种&#xff1a;Ingress、LoadBlancer类型的Service、NodePort类型的Service。IngressIngress相当于service的service&#xff0c;可以将外部请求通过按照不同规则转发到对应的service。实际上&#xff0c;ingress相当于一个7层的负载均衡器…

面了一个月,终于让我总结出了这份最详细的接口测试面试题

目录 1、你们公司是如何做接口测试的&#xff1f; 2、什么时候开展接⼝测试&#xff1f; 3、接⼝测试和UI测试的工作是否重复&#xff1f; 4、接口测试框架怎么搭建&#xff1f; 5、接⼝之间有依赖时怎么处理&#xff1f; 6、如何判断接⼝测试的结果&#xff08;成功或失败&a…

【C进阶】指针的高级话题

文章目录:star:1. 字符指针:star:2. 指针数组2.1 指针数组的定义2.2 指针数组的使用:star:3. 数组指针3.1 数组的地址3.2 数组指针的使用:star:4. 数组参数和指针参数:star:5. 函数指针5.1 函数名和函数的地址5.2 练习:star:6. 函数指针数组6.1 转移表:star:7. 指向函数指针数组…