Vuex的基础

文章目录

  • vuex概述
    • 构建vuex[多组件数据共享]环境
    • 创建一个空仓库
      • ps.创建仓库时遇到的错误
    • 核心概念 - state状态
    • 核心概念 - mutations
      • 辅助函数 - mapMutations
    • 核心概念 - actions
      • 辅助函数 - mapActions
    • 核心概念 - getters
    • 核心概念 - 模块module(进阶语法)


vuex概述

vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

状态管理模式:把组件的共享状态抽取出来,以一个全局单例模式管理。这种模式下,我们的组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为。
在这里插入图片描述

通俗来讲:vuex是一个vue的状态管理工具,状态就是数据。(vuex是一个插件,可以帮我们管理vue通用的数据)。

场景:

  1. 某个状态在很多组件来使用(个人信息)
  2. 多组件共讨那个维护一份数据(购物车)

优势:

  1. 共同维护一份数据,数据集中化管理
  2. 响应式变化
  3. 操作简洁(vuex提供了一些辅助函数)

构建vuex[多组件数据共享]环境

目标:基于脚手架创建项目,构建vuex多组件数据共享环境。

效果:多个组件共享一份数据

  • 任意一个组件都可以修改数据
  • 三个组件的数据是同步的

创建一个空仓库

目标:安装vuex插件,初始化一个空仓库

  1. 安装vuex:npm i vuex@3(vue2对应vuex3,vue3对应vuex4)
  2. 新建store/index.js专门存放vuex
  3. Vue.use(Vuex)创建仓库new Vue.Store()
  4. 在main.js中导入挂载到Vue实例上

ps.创建仓库时遇到的错误

在这里插入图片描述

如果安装vuex时出现如上错误,可以通过命令行npm i vuex@3 --legacy-peer-deps尝试安装。

出现这个问题的原因大概是因为node的版本太高,或者是npm版本不对。

通过在App.vue中打印this.$store来查看仓库是否创建成功,如果打印的是undefined,则仓库创建失败。

核心概念 - state状态

  1. 提供数据:

    State提供唯一的公共数据源,所有共享的数据都要统一放到Store中的State中存储。在state对象中可以添加我们要共享的数据。

    const store = new Vuex.Store({
        state: {
            count: 101
        }
    })
    
  2. 使用数据:

    1. 通过store直接访问

      获取store

      (1)this.$store

      (2)import导入store

      模板中:{{ $store.state.xxx }}

      组件逻辑中:this.$store.state.xxx

      JS模块中:store.state.xxx

    2. 通过辅助函数(简化)

      mapState是辅助函数,帮助我们把store中的数据自动映射到组件的计算属性中。
      在这里插入图片描述

核心概念 - mutations

目标:明确vuex同样遵循单向数据流,组件中不能直接修改仓库的数据。

this.$store.state.count++是错误的写法,有时虽然能运行成功,但项目大起来后很难维护,我们很难找到仓库的数据在哪里被修改。

这个错误vue默认不会监测,因为监测需要成本。

通过 strict: true 可以开启严格模式,有利于初学者写代码,上线时需要关闭,因为它会消耗运行性能。

目标:掌握mutations的操作流程,来修改state数据。(state数据的修改只能通过mutations)

  1. 定义mutations对象,对象中存放修改state的方法

    const store = new Vue.Store({
        state: {
            count: 0
        },
        mutations: {
            addCount (state, n) {
                this.state.count += n
            }
        }
    })
    
  2. 组件中提交调用mutations

    this.$store.commit('addCount', n)
    

注意:mutations参数有且只能有一个,如果需要多个参数,包装成一个对象。

辅助函数 - mapMutations

mapMutations和mapState很像,它是把位于mutations中的方法提取了出来,映射到组件methods中。

mutations: {
    subCount (state, n){
        state.count -= n
    },
}
import { mapMutations } from 'vuex'

methods: {
    ...mapMutations(['subCount'])
}
this.subCount(10) // 调用

相当于:

methods: {
    subCount (n) {
        this.$store.commit('subCount', n)
    },
}

核心概念 - actions

目标:明确action的基本语法,处理异步操作。

说明:mutations必须是同步的(便于监测数据变化,记录调试)

  1. 提供action方法

    mutations: {
        changeCount (state, newCount) {
            state.count = newCount
        }
    }
    
    actions: {
        aetAsyncCount (context, num) {
            setTimeout(() => {
                context.commit('changeCount', num)
            }, 1000)
        }
    }
    
  2. 页面中调用dispatch调用

    this.$store.dispatch('setAsyncCount', 200)
    

辅助函数 - mapActions

mapActions是把位于actions中的方法提取出来,映射到组件methods中。

actions: {
    aetAsyncCount (context, num) {
        setTimeout(() => {
            context.commit('changeCount', num)
        }, 1000)
    }
}
import { mapActiosn } from 'vuex'

methods: {
    ...mapActions(['changCountAction'])
}
this.changeCountAction(99) // 调用

核心概念 - getters

除了state之外,有时我们还需要从state中派生出一些状态,这些状态是依赖state的,此时会用到getters(getters类似于计算属性)。

例如:state中定义了list为1-10的数组,需要显示所有大于5的数据。

  1. 定义getters

    getters: {
        filterList (state) {
            return state.list.filter(item => item > 5)
        }
    }
    
  2. 访问getters

    • 通过store访问getters

      {{ $store.getters.filterList }}
      
    • 通过辅助函数mapGetters映射

      computed: {
          ...mapGetters(['filterList'])
      }
      

核心概念 - 模块module(进阶语法)

由于vuex使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store对象很有可能变得相当臃肿,难以维护。

模块拆分:

user模块:store/modules/user.js

const state = {
    userInfo: {
        name: 'zs',
        age: 18
    }
}
const mutations = {}
const actions = {}
const getters = {}
export default {
    state,
    mutations,
    actions,
    getters
}
import user from './modules/user'
const store = new Vuex.Store({
    modules: {
        user
    }
})

使用模块中的数据:

  1. 直接通过模块名访问:

    $store.state.模块名.xxx

    $store.getters['模块名/xxx']

    $store.commit('模块名/xxx', 额外参数)

    $store.dispatch('模块名/xxx', 额外参数)

  2. 通过mapState映射

    默认根级别的映射:
    mapState(['xxx'])
    mapGetters(['xxx'])
    mapMutations(['xxx'])
    mapActions(['xxx'])

    子模块的映射:
    mapState('模块名', ['xxx'])
    mapGetters('模块名', ['xxx'])
    mapMutations('模块名', ['xxx'])
    mapActions('模块名', ['xxx'])

    • 需要开启命名空间:

        export default {
            namespaced: true, // 开启命名空间
            state,
            mutations,
            actions,
            getters
        }
      

默认模块中的mutation和actions会被挂载到全局,需要开启命名空间,才会挂载到子模块。

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

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

相关文章

Python(pandas库2)

DateFrame的添加 上文中DateFrame的增加中,因版本弃置append函数 如果你想要向 DataFrame 添加一行,建议的方法是首先创建一个新的 DataFrame 来表示这行数据,然后使用 pd.concat() 函数来合并它们。 concat 语法: objs: 要连…

基于协同过滤算法的个性化课程推荐系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

JDBC: Java数据库连接的桥梁

什么是JDBC? Java数据库连接(Java Database Connectivity,简称JDBC)是Java提供的一种API,允许Java应用程序与各种数据库进行交互。JDBC提供了一组标准的接口,开发者可以利用这些接口执行SQL语句、处理结果集…

「C/C++」C++ STL容器库 之 std::multiset 键的集合容器

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

腾讯云跨AZ部署FortigateHA备忘录

随时保存配置 config system globalset admintimeout 480set alias "FortiGate-VM64-KVM"set gui-auto-upgrade-setup-warning disableset hostname "FG-Slave"set revision-backup-on-logout enableset revision-image-auto-backup enableset timezone &…

【 thinkphp8 】00006 启动 内、外置服务器

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【 t…

Java学习Day53:铲除紫云山金丹原料厂厂长(手机快速登录、权限控制)

1.手机快速登录 手机快速登录功能,就是通过短信验证码的方式进行登录。这种方式相对于用户名密码登录方式,用户不需要记忆自己的密码,只需要通过输入手机号并获取验证码就可以完成登录,是目前比较流行的登录方式。 前端页面&…

centos7.x安装openCV 4.6.0版本

## 从源代码编译安装 1.更新系统 sudo yum update -y 2.安装依赖项 sudo yum groupinstall "Development Tools" sudo yum install cmake gcc-c git libjpeg-turbo-devel libpng-devel libtiff-devel libwebp-devel openexr-devel gstreamer1-plugins-base-devel…

iTerm2 保持SSH远程连接

1、保持SSH远程连接的稳定,防止因闲置时间过长而断开连接 When idle, send ASCII code 35 every 60 seconds每60秒 输入# 2、客户端设置保持活动 设置客户端每隔60秒发送一次保活信号,总共尝试3次。 vim ~/.ssh/configHost *ServerAliveInterval 60…

uniapp 底部导航栏tabBar设置后不显示的问题——已解决

uniapp 底部导航栏tabBar设置后不显示的问题——已解决 网上找了一堆解决办法,挨个对着试吧 解决办法一:tabBar里的list第一项和page中的第一项要相同,确实就能显示了。但是问题来了,page中的第一项是入口页,那就意味…

鲸鱼优化算法(Whale Optimization Algorithm, WOA)原理与MATLAB例程

鲸鱼优化算法(Whale Optimization Algorithm, WOA)是一种基于鲸鱼捕食行为的智能优化算法。它模拟了座头鲸在狩猎时的“气泡网”捕食策略。 文章目录 1.适应度函数2. 更新公式2.1 突袭行为2.2 螺旋更新3.线性递减参数4. 边界处理 MATLAB 实现示例代码说明…

HarmonyOS 5.0应用开发——Navigation实现页面路由

【高心星出品】 文章目录 Navigation实现页面路由完整的Navigation入口页面子页面 页面跳转路由拦截其他的 Navigation实现页面路由 Navigation:路由导航的根视图容器,一般作为页面(Entry)的根容器去使用,包括单页面&…

前端构建工具vite的优势

1. 极速冷启动 Vite 使用原生 ES 模块 (ESM) 在开发环境下进行工作。相比于传统构建工具需要打包所有的文件,Vite 只在浏览器请求模块时动态加载所需的文件。无打包冷启动:无需预先打包,项目启动非常快,尤其对于大型项目效果更明…

Arduino Uno 同时控制多路舵机

Arduino Uno同时控制4个舵机 舵机可以在0~180度内指定角度的控制。常用于航模、机器人、遥控玩具等物品,然而,很多时候要一次性控制多个舵机,今天以控制4个舵机为例进行说明 接线方式如下图: 舵机的信号线分别接A0,A1,A2,A3。控制舵机从0旋转到180度,再由180度旋转到0度,…

基于NERF技术重建学习笔记

NeRF(Neural Radiance Fields)是一种用于3D场景重建的神经网络模型,能够从2D图像生成逼真的3D渲染效果。它将场景表征为一个连续的5D函数,利用了体积渲染和神经网络的结合,通过学习光线穿过空间时的颜色和密度来重建场…

机器视觉-相机、镜头、光源(总结)

目录 1、机器视觉光源概述 2、光源的作用 3、光谱 4、工业场景常见光源 4.1、白炽灯 4.2、卤素灯 4.3、 荧光灯 4.4、LED灯 4.5、激光灯 5、光源的基本性能 5.1、光通量 5.2、光效率 5.3、发光强度 5.4、光照度 5.5、均匀性 5.6、色温 5.7、显色性 6、基本光学…

openpnp - 解决“底部相机高级校正成功后, 开机归零时,吸嘴自动校验失败的问题“

文章目录 openpnp - 解决"底部相机高级校正成功后, 开机归零时,吸嘴自动校验失败的问题"概述笔记问题现象1问题现象2原因分析现在底部相机和吸嘴的位置偏差记录修正底部相机位置现在再看看NT1在底部相机中的位置开机归零,看看是否能通过所有校…

python csv库

python csv库 水一水又是一篇,乐 读取 import csv # 打开 CSV 文件 with open(example.csv, moder, newline) as file: csv_reader csv.reader(file) # 读取文件头(可选) headers next(csv_reader) print(f"Headers: {heade…

golang将指针传给cgo后还能被回收吗?

问题&#xff1a; 如果把golang分配的变量&#xff0c;其指针通过cgo传给c&#xff0c;并被c存储&#xff0c;那这个变量还能被gc回收吗&#xff1f; 实验代码&#xff1a; test_memory_leak.go package main/* #include <stdlib.h> #include <string.h> #incl…

基于docker-compose编排部署微服务快速开发框架

1. 规划节点 节点规划&#xff0c;见表1。 表1 节点规划 IP主机名节点10.24.2.10masterdocker-compose节点 2. 基础准备 Docker和Docker Compose已安装完成&#xff0c;将提供的软件包Pig.tar.gz上传至master节点/root目录下并解压。 案例实施 1. 基础环境准备 &#x…