Vuex核心知识整理

目录

1 搭建vuex环境

2 求和案例

3 getters 配置项

4 mapState 和 mapGetters

5 mapMutations 和 mapActions

6 Vuex 模块化


1 搭建vuex环境

vuex工作原理图(摘自官网

什么时候使用Vuex:

1.当多个组件依赖于统一状态

2.来自不同组件的行为需要变更同一状态 


(1). 首先再src目录下创建store文件夹,然后创建index.js文件(该文件用于创建 vuex 中最为核心的 store), 然后在main.js中引入这个index.js文件

【index.js】

/* 该文件用于创建 vuex 中最为核心的 store */
// 引入Vue
import Vue from 'vue'

// 引入vuex
import Vuex from 'vuex'

// 使用插件
Vue.use(Vuex)

// 1. 准备actions: 用于响应组件中的动作
const actions = {

    /* 没有业务逻辑的,可以直接跳过这步,直接commit */
    // jia(context, num) {
    //     context.commit('JIA', num)
    // },
    // jian(context, num) {
    //     context.commit('JIAN', num)
    // },

    /* 有业务逻辑的 */
    jiaOdd(context, num) {
        if (context.state.sum % 2) {
            context.commit('JIA', num)
        }
    },
    jiaWait(context, num) {
        setTimeout(() => {
            context.commit('JIA', num)
        }, 1000)
    },
}

// 2. 准备mutations: 用于操作数据(state)
const mutations = {
    JIA(state, num) {
        // console.log(num)
        state.sum += num
    },
    JIAN(state, num) {
        state.sum -= num
    }
}

// 3. 准备state: 用于保存数据
const state = {
    sum: 0,  // 当前的和
}


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

2 求和案例

【Count】

<template>
  <div>
    <h1>当前求和为:{{ $store.state.sum }}</h1>
    <select v-model.number="num">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
    </select>
    <button @click="add">+</button>
    <button @click="sub">-</button>
    <button @click="addIfOdd">当前求和为奇数再加</button>
    <button @click="addWait">等一等再加</button>
  </div>
</template>

<script>
    export default {
        name: 'Count',
        data() {
            return {
                num: 1, //用户选择的数字
            }
        },
        methods: {
            /* 没有业务处理,直接commit, 联系mutations */
            add() {
                this.$store.commit('JIA', this.num)
            },
            sub() {
                this.$store.commit('JIAN', this.num)
            },

            /* 有业务处理,先dispatch, 联系actions,再commit, 联系mutations */
            addIfOdd() {
                this.$store.dispatch('jiaOdd', this.num) 
            },
            addWait() {
                this.$store.dispatch('jiaWait', this.num)
            }
        },
    }

</script>

<style>
    button {
        margin-left: 8px;
    }
</style>

在组件中使用处理过后的数据时(比如上方的sum ),用 {{ $store.state.sum }} 


3 getters 配置项

【index.js】

......
// 3. 准备state: 用于保存数据
const state = {
    sum: 0,  // 当前的和
    school: '北京大学',
    subject: '计算机'
}

// getters: 用于将state中的数据进行加工
const getters = {
    bigSum(state) {
        return state.sum * 10
    }
}

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

【Count】

在组件中使用getters中加工后的数据 

<h3>放大十倍的和为:{{ $store.getters.bigSum }}</h3>

4 mapState 和 mapGetters

在上述的案例中,当我们需要使用state或者getters中的数据时,在组件中的模板中,需要写 $store.state.xx, 这样写的话,不够精简。以下将介绍几种方法,利用计算属性去处理这种不足之处

【state和getters中的数据】

// 3. 准备state: 用于保存数据
const state = {
    sum: 0,  // 当前的和
    school: '北京大学',
    subject: '计算机'
}

// 。getters: 用于将state中的数据进行加工
const getters = {
    bigSum(state) {
        return state.sum * 10
    }
}

【在组件中导入】

import { mapState, mapGetters } from 'vuex'

1. 获取state中的数据: 

【方法1】靠程序员自己手写计算属性

.......
computed: {
    /* 1.靠程序员自己去写计算属性 */
    he() {
         return this.$store.state.sum
    },
    xuexiao() {
         return this.$store.state.school
    },
    xueke() {
         return this.$store.state.subject
    },
}

<h1>当前求和为:{{ sum }}</h1>
<h3>我在:{{ xuexiao}}, 学习{{ xueke}}</h3>

【方法2】使用vuex的mapState生成计算属性,从state中获取数据  (对象写法)

computed: {
    // .......


    ...mapState({he:'sum', xuexiao:'school', xueke:'subject'}),  // 使用扩展运算符展开对象
}

【方法3】使用vuex的mapState生成计算属性,从state中获取数据  (数组写法)

computed: {
    // ......

    ...mapState(['sum', 'school', 'subject']),
}

使用数组写法的前提是:计算属性的属性名和state中的数据的名称是相同的


2. 获取getters中的数据: 

【方法1】使用vuex的mapGetters生成计算属性,从getters中获取数据  (对象写法)

computed: {
    // ......

    ...mapGetters({bigSum:'bigSum'})
}

【方法2】使用vuex的mapGetters生成计算属性,从getters中获取数据  (数组写法)

computed: {
    // ......

    ...mapGetters(['bigSum'])
}

前提和上面一样


5 mapMutations 和 mapActions

当我们在组件中想要联系actions 或者 mutations 时,我们需要使用this.$store.dispatch(...) 或者 this.$store.commit(...) 这样写的话,如果有多个就会写很多重复的 this.$store.dispatch ......

所以我们可以使用mapMutations和mapActions来解决这种问题

【在组件中导入】

import { mapMutations, mapActions } from 'vuex'

1. 联系mapMutations:

【方法1】借助vuex的mapMutations生成方法,方法中调用commit方法去联系 mutations (对象的写法)

methods: {
    // ......

    ...mapMutations({add: 'JIA', sub: 'JIAN'}),
}

【方法2】借助vuex的mapMutations生成方法,方法中调用commit方法去联系 mutations (数组的写法)

methods: {
    // .......

    ...mapMutations(['JIA', 'JIAN']),  // 函数名也要改成对应的JIA、JIAN
}

2. 联系mapActions:

【方法1】借助mapActions 对象的写法

methods: {
    // ......
    
    ...mapActions({addIfOdd: 'jiaOdd', addWait: 'jiaWait'})
}

【方法2】借助mapActions 数组的写法

methods: {
    // ......    

    ...mapActions(['addIfOdd', 'addWait'])
}

但是使用上述方法时,并不会传递参数,如果不指定参数的话,会默认传递事件对象 event, 所以计算结果会出错,所以我们需要在 <template></template>中指定传递的参数

    <button @click="add(num)">+</button>
    <button @click="sub(num)">-</button>
    <button @click="addIfOdd(num)">当前求和为奇数再加</button>
    <button @click="addWait(num)">等一等再加</button>

6 Vuex 模块化

【index.js】

/* 该文件用于创建 vuex 中最为核心的 store */
// 引入Vue
import Vue from 'vue'

// 引入vuex
import Vuex from 'vuex'

import axios from 'axios'

import nanoid from 'nanoid'

// 使用插件
Vue.use(Vuex)

/* 1.求和功能相关的配置 */
const countOptions = {
    namespaced: 'true',
    actions: {
        jiaOdd(context, num) {
            if (context.state.sum % 2) {
                context.commit('JIA', num)
            }
        },
        jiaWait(context, num) {
            setTimeout(() => {
                context.commit('JIA', num)
            }, 1000)
        },
    },
    mutations: {
        JIA(state, num) {
            // console.log(num)
            state.sum += num
        },
        JIAN(state, num) {
            state.sum -= num
        },
    
        ADD_PERSON(state, person) {
            state.personList.unshift(person)
        },
    },
    state: {
        sum: 0,  // 当前的和
        school: '北京大学',
        subject: '计算机',
    },
    getters: {
        bigSum(state) {
            return state.sum * 10
        }
    }
}

/* 2.人员功能相关的配置 */
const personOptions = {
    namespaced: 'true',
    actions: {
        addPersonxie(context, person) {
            if (person.name.indexOf('谢') === 0) {
                context.commit('ADD_PERSON', person)
            } else {
                alert('添加的人必须姓谢')
            }
            
        }, 
        addPersonServer(context) {
            axios.get('https://api.uixsj.cn/hitokoto/get?type=social').then(
                response => {
                    context.commit('ADD_PERSON', {id: nanoid(), name: response.data})
                },
                error => {
                    console.log(error.message)
                }
            )
        }
    },
    mutations: {
        ADD_PERSON(state, person) {
            state.personList.unshift(person)
        }
    },
    state: {
        personList: [
            {id:'001', name:'zs'}
        ]
    },
    getters: {
        firstPersonName(state) {
            return state.personList[0].name
        }
    }
}



/* 创建并暴露store */
export default new Vuex.Store({
    modules: {
        count: countOptions,
        person: personOptions
    }
})

使用模块化时,state中就变成了count 和 person两个被导出的模块,而具体的数据就在对应的模块中

在模板中就可以使用以下方式使用数据  {{ count.xx}} 、 {{ person.xx}}

    <h1>当前求和为:{{ count.sum }}</h1>
    <h2>放大十倍的和为:{{ bigSum }}</h2>
    <h3>我在:{{ count.school }}, 学习{{ count.subject }}</h3>

    <h4 style="color: red;">Perosn组件的总人数是: {{ person.personList.length }}</h4>

但是这样写的话,模板中的写法还是过于繁琐,所以我们可以将所需要的数据指定所在的模块中,然后就可以直接用了。

// 这里以对象的写法为例
...mapState('count', ['sum', 'school', 'subject']),  // 需要配置namespaced:true


         methods: {
            ...mapMutations('count', {add: 'JIA', sub: 'JIAN'}),

            ...mapActions('count', {addIfOdd: 'jiaOdd', addWait: 'jiaWait'})

        },

模块化有一个好处就是,可以将每一个模块放入一个.js文件中,然后在store/index.js 文件中引入,这样方便多个程序员根据自己的需要操作对应放入模块

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.15日学习打卡----初学Zookeeper(二)

2.15日学习打卡 目录: 2.15日学习打卡一. Zookeeper部署运行伪集群安装集群安装服务管理 二. Zookeeper系统模型数据模型节点特性客户端命令行节点数据信息Watcher监听机制权限控制 ACL 三. 原生api操作Zookeeper四. zkclient库操作Zookeeper五. Apache Curator操作Zookeeper六…

不同的AI修改同一篇文章标题

提问AI 我写了一篇文章&#xff0c;请帮我把标题重新改一下&#xff1a;“比较不同AI分析同一个错误代码及给出解决方案的能力&#xff08;结果出我意料&#xff09;” 这篇文章的原地址为&#xff1a;https://blog.csdn.net/snans/article/details/136132211 答案对比结果&am…

RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?<= , (?= , (?<! , (?!

RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?< , (? , (?<! , (?! 有好多种称呼 (?< , (? , (?<! , (?! 有好多种称呼 , 我称为: 左限定, 右限定, 左否定, 右否定 (?<左限定)    (?右限定)(?<!左否定)    (?!右限定) 再…

Linux|centos7下的编译|ffmpeg的二进制安装

Windows版本的ffmpeg&#xff1a; ###注意&#xff0c;高版本可能必须要windows10以及以上才支持&#xff0c;win7估计是用不了的 下载地址&#xff1a;Builds - CODEX FFMPEG gyan.dev 或者这个下载地址&#xff1a;https://github.com/BtbN/FFmpeg-Builds/releases 这两个…

C++面试宝典第28题:寻找丢失的数字

题目 给定一个包含n个整数的数组nums,其中nums[i]在区间[1, n]内。请找出所有在[1, n]范围内,但没有出现在nums中的数字,并以数组的形式返回结果。 示例1: 输入:nums = [4, 3, 2, 7, 8, 2, 3, 1] 输出:[5, 6] 示例2: 输入:nums = [1, 1] 输出:[2] 解析 初看这道题,…

基于飞腾ARM+FPGA国产化计算模块联合解决方案

联合解决方案概述 随着特殊领域电子信息系统对自主创新需求的日益提升&#xff0c;需不断开展国产抗恶劣环境计算整机及模块产 品的研制和升级。特殊领域电子信息系统的自主创新&#xff0c;是指依靠自身技术手段和安全机制&#xff0c;实现信息系统从硬 件到软件的自主研发…

阿里云香港服务器详解_CN2线路测试_BGP多线精品测试

阿里云香港服务器中国香港数据中心网络线路类型BGP多线精品&#xff0c;中国电信CN2高速网络高质量、大规格BGP带宽&#xff0c;运营商精品公网直连中国内地&#xff0c;时延更低&#xff0c;优化海外回中国内地流量的公网线路&#xff0c;可以提高国际业务访问质量。阿里云服务…

【python】网络爬虫与信息提取--正则表达式

一、正则表达式 正则表达式是用来简洁表达一组字符串的表达式。是通用的字符串表达框架&#xff0c;简洁表达一组字符串的表达式&#xff0c;针对字符串表达“简洁”和“特征”思想的工具&#xff0c;判断某字符串的特征归属。 用处&#xff1a;表达文本类型的特征&#xff1b;…

【JavaEE】_HTTP请求报头header

目录 1. Host 2. Content-Length与Content-Type 2.1 Content-Length 2.2 Content-Type 3. User-Agent&#xff08;UA&#xff09; 4. Referer 5. Cookie header的整体格式是“键值对”结构&#xff0c;一行是一个键值对&#xff0c;这些键值对都是HTTP定义好的、有特殊含…

【Leetcode刷题笔记】27. 移除元素

原题链接 Leetcode 27. 移除元素 题目 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。…

算法练习-赎金信(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;哈希表 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨…

C#,整数转为短字符串(Short string)的加解密算法与源代码

1 整数转为短字符串的应用 网站生成的动态 URL 往往以内容序列号id为标识与参数&#xff0c;比如&#xff1a; http://www.jerry.com/tom.aspx?id1 使用 Web Rewrite&#xff0c;可以实现网页静态化&#xff0c;称为&#xff1a; http://www.jerry.com/content/1.html 对…

FlashMeeting(基于FFmpeg+openCV)视频语音通讯系统

Web端体验地址&#xff1a;https://download.csdn.net/download/XiBuQiuChong/88805337 客户端下载地址&#xff1a;https://download.csdn.net/download/XiBuQiuChong/88805337 FlashMeeting(基于FFmpegopenCV)是一整套先进的以FFmpegopenCV技术为基础的视频语音通讯系统。利…

数据库设计、JDBC、数据库连接池

数据库设计 数据库设计概念 数据库设计就是根据业务 系统的具体需求&#xff0c;结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。建立数据库中的表结构以及表与表之间的关联关系的过程。有哪些表?表里有哪些字段?表和表之间有什么关系? 数据库设计的步骤…

Java并发基础:ConcurrentSkipListSet全面解析!

内容概要 ConcurrentSkipListSet类在多线程环境下&#xff0c;它能够轻松应对大量的插入、删除和查找操作&#xff0c;同时保持数据的完整性和一致性&#xff0c;其内部基于跳表数据结构的实现&#xff0c;确保了即使在处理大规模数据时&#xff0c;也能具有出色的性能表现。 …

基于微信小程序的健身房私教预约系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

类的构造方法

在类中&#xff0c;出成员方法外&#xff0c;还存在一种特殊类型的方法&#xff0c;那就是构造方法。构造方法是一个与类同名的方法&#xff0c;对象的创建就是通过构造方法完成的。每个类实例化一个对象时&#xff0c;类都会自动调用构造方法。 构造方法的特点&#xff1a; 构…

文件上传漏洞--Upload-labs--Pass01--前端绕过

一、前端绕过原理 通俗解释&#xff0c;我们将写有恶意代码的php后缀文件上传到网页&#xff0c;网页中的javascript代码会先对文件的后缀名进行检测&#xff0c;若检测到上传文件的后缀名为非法&#xff0c;则会进行alert警告。若想上传php后缀的文件&#xff0c;就要想办法对…

Acwing---877. 扩展欧几里得算法

扩展欧几里得算法 1.题目2.基本思想3.代码实现 1.题目 给定 n n n 对正整数 a i ai ai, b i bi bi&#xff0c;对于每对数&#xff0c;求出一组 x i xi xi, y i yi yi&#xff0c;使其满足 a i x i b i y i g c d ( a i , b i ) aixibiyigcd(ai,bi) aixibiyigcd(ai,bi)…

K8s进阶之路-安装部署K8s

参考&#xff1a;&#xff08;部署过程参考的下面红色字体文档链接就可以&#xff0c;步骤很详细&#xff0c;重点部分在下面做了标注&#xff09; 安装部署K8S集群文档&#xff1a; 使用kubeadm方式搭建K8S集群 GitBook 本机&#xff1a; master&#xff1a;10.0.0.13 maste…