Vuex的学习内容

news2024/11/23 12:30:21

本教程使用的是vue3

1.核心概念

  • 官网地址:https://vuex.vuejs.org/
  • 安装(固定)
  • 配置项(固定)
    在这里插入图片描述

2. 图示关系

单一定义store对象,里面5个配置项,在任意组件可以使用.
在这里插入图片描述

3.案例准备

准备两个组件AddItem.vueSubItem.vueMain.vue
展示效果如下:
在这里插入图片描述
AddItem代码

<template>
<div>
  <h3>AddItem组件</h3>
  <p>已知库存数:0</p>
  <button>库存数+1</button>
</div>
</template>

<script>
export default {
  name: "AddItem"
}
</script>

<style scoped>

</style>

SubItem代码

<template>
<div>
  <h3>SubItem组件</h3>
  <p>已知库存储0</p>
  <button>库存1</button>
</div>
</template>

<script>
export default {
  name: "SubItem"
}
</script>

<style scoped>

</style>

Main代码:

<template>
<div id="app">
  <h1>根组件</h1>
  <span>库存总数:</span>
  <input type="text">
  <div style="border:1px solid black;width: 300px">
    <AddItem></AddItem>
  </div>
  <hr>
  <div style="border: 1px solid black;width: 300px;">
    <sub-item></sub-item>
  </div>
</div>



</template>

<script>
import AddItem from "@/views/vuexlearn/AddItem";
import SubItem from "@/views/vuexlearn/SubItem";
export default {
  name: "main",
  components: {SubItem, AddItem}
}
</script>

<style scoped>
#app{
  width: 300px;
  margin: 20px auto;
  border:1px solid #ccc;
  padding: 4px;
}
</style>

4.vuex-store准备

目标

  • 创建store仓库
  • 注入到vue项目中

4.1store概念

每个Vuex应用的核心strore(仓库),包含5个核心概念
在这里插入图片描述

  • state:存储数据
  • getters:相当于计算属性,会对计算结果进行缓存
  • mutations:同步请求
  • actions:异步请求
  • modules:模块

4.2vuex目录

与路由模块router/index.js-类似,维护项目目录的整洁,新建src/store/index.js

当然,这个步骤并不是必需的

在这里插入图片描述

4.3使用步骤

  • 1工程中-下载vuex
// 使用npm下载
npm install vuex@3.5.1
// 使用yarn下载
yarn add vuex
  • 2.store/index.js-创建定义导出store对象
import {createStore} from 'vuex'
//创建数据仓库
export default createStore({  
state:{},
getter:{},
mutations:{},
actions:{},
modules{}
})
  • 3.main.js-导入注入到vue中
import {createApp} from 'vue'
import App from './App.vue'
//引进数据仓库
import createStore from './store/index.js'
const app = createApp(App)
app.use(createStore)
app.mount('#app')

5.vuex-state数据源

目标

  • 定义state
  • 直接使用state
  • 辅助函数mapstate

state是唯一的数据源,统一存储

5.1 定义state

store/index.js中定义state
语法:

//创建数据仓库
export default createStore({
    //数据仓库的内容,名称不能乱写
    state:{变量名:初始值}
})

具体代码:

//创建数据仓库
export default createStore({
    //数据仓库的内容,名称不能乱写
    state:{name:'马云',company:'阿里巴巴'}
})

5.2 使用state的使用方法

  • 方式1:组内-直接使用
    语法:
this.$store.state.变量名
  • 方式2:组件内-映射使用(推荐)
    语法:
<script>
import {useStore} from "vuex";
export default {
  name: "SubItem",
  setup(){
    const store=useStore();
    let count=store.state.count;
    return{
      count
    }
  }
}
</script>

6.getter方法的使用

6.1 定义getter

import {createStore} from 'vuex'
//创建数据仓库
const store = createStore({
    //数据仓库的内容,名称不能乱写
    state: {name: '马云', company: '阿里巴巴', count: 100},
    getters: {
        newName(state){
            return state.name+"您好"
        }
    }
})
export default store

6.2 使用getter

  • 方法1:直接调用
<template>
<div>
  <h3>SubItem组件</h3>
  <p>{{$store.getters.newName}}</p>
  <p>{{$store.getters['newName']}}</p>
</div>
</template>
  • 方法2:间接调用
import {useStore} from "vuex";
export default {
  name: "SubItem",
  setup(){
    const store=useStore();
    console.log(store.getters.newName);
    return{
      count
    }
  }
}

7.mutations方法的使用

7.1定义mutations

import {createStore} from 'vuex'
//创建数据仓库
const store = createStore({
    //数据仓库的内容,名称不能乱写
    state: {name: '马云', company: '阿里巴巴', count: 100},
    getters: {
        newName(state){
            return state.name+"您好"
        }
    },
    //同步调用
    mutations: {
        trigger(state) {
            console.log('我是被actions调用的')
            state.name = '马化腾'
        },
        exchange(state, val) {
            state.company = val
        },
        updatecount(state){
            state.count=10000
        }
    }
})
export default store

7.2 使用mutations

<template>
<div>
  <h3>SubItem组件</h3>
  <p>已知库存储{{count}}</p>
  <button>库存1</button>
  <button @click="mutationFn">改变数字</button>
</div>
</template>

<script>
import {useStore} from "vuex";
export default {
  name: "SubItem",
  setup(){
    const store=useStore();
    const mutationFn=()=>{
      store.commit("updatecount")
    }
    return{
      mutationFn
    }
  }
}
</script>

8.使用actions

8.1 定义actions方法

在使用actions方法的时候,必须先要调用mutations方法

import {createStore} from 'vuex'
//创建数据仓库
const store = createStore({
    //数据仓库的内容,名称不能乱写
    state: {name: '马云', company: '阿里巴巴', count: 100},
    getters: {
        newName(state){
            return state.name+"您好"
        }
    },
    //--------------------使用以下方法调用数据仓库里的数据-------------------------------
    //同步调用
    mutations: {
        trigger(state) {
            console.log('我是被actions调用的')
            state.name = '马化腾'
        }
    },
    //异步调用:必须要调用同步调用
    actions: {
        sub(store) {
            //使用commit调用同步调用
            store.commit('trigger');
        }
    },modules: {}
})
export default store

8.2使用actions方法

<template>
<div>
  <h3>AddItem组件</h3>
  <p>{{$store.state.name}}</p>
  <button @click="changename">修改名字</button>

</div>
</template>

<script>
import {useStore} from "vuex";
//直接使用
export default {
  name: "AddItem",
  setup(){
    const store=useStore();
    const changename=()=>{
      store.dispatch("sub")
    }
    return{
      changename
    }
  }
}
</script>

9.Vuex模块处理

如果我们把所有状态都存储到state中,后期的维护会变来得困难,Store也会变的非常臃肿,为了解决这个问题Vuex允许我们将store分隔成模块.每一个模块都有自己的State,Mutation,Actions,Getter等.
在store中创建模块A和模块B,并且在index中注册模块
在这里插入图片描述

  • 开启命名空间的模块化
    modulesA代码
export default {
    namespaced:true,//开启命名空间
    state: {
        name: '马云',
        company: '阿里巴巴',
        count: 100
    },
    getter: {
        newName(state) {
            return state.name + "您好"
        }
    },
    mutations: {
        trigger(state) {
            console.log('我是被actions调用的')
            state.name = '马化腾'
        },
        exchange(state, val) {
            state.company = val
        },
        updatecount(state) {
            state.count = 10000
        }
    },
    actions: {
        sub(store) {
            //使用commit调用同步调用
            store.commit('trigger');
        }
    }
}

模块化在组件中进行调用:
AddItem代码:

<template>
<div>
  <h3>AddItem组件</h3>
  <p>模块A开启的命名空间</p>
  <p>{{$store.state.moudleA.name}}</p>
  <p>已知库存数:{{$store.state.moudleA.count}}</p>
  <p>{{$store.getters["moduleB/newName"]}}</p>
  <button @click="btn">修改count</button>
  <button>库存数+1</button>
</div>
</template>

<script>
import {useStore} from "vuex";
//直接使用
export default {
  name: "AddItem",
  setup(){
    const store=useStore();
    const btn=()=>{
      store.commit('moudleA/updatecount');
    }
    return {btn}
  }
}
</script>
  • 关闭命名空间的模块化
    moduleB代码:
export default {
    namespaced:false,//没有开启命名空间,除开state外,其他的都是注册在全局下的
    state: {
        username:"moudleB"
    },
    getter: {
        newName(state) {
            return state.name + "已经被修改"
        }
    },
    mutations: {
        update(state, val) {
            state.username =val;
        }
    },
    actions: {
        exchange(store,val) {
            //使用commit调用同步调用
            store.commit('update',val);
        }
    }
}

模块化在组件中进行调用:
moudleB代码:

<template>
<div>
  <h3>SubItem组件</h3>
  <p>username:{{username}}</p>
  <button @click="btn">修改用户名</button>
  <button @click="btn2">修改用户名-异步</button>
</div>
</template>

<script>
import {useStore} from "vuex";
import moudleB from "@/store/modules/moduleB";
export default {
  name: "SubItem",
  setup(){
    const store=useStore();
    const username=store.state.moudleB.username;
    const btn=()=>{
      //同步调用
      console.log('进入btn')
      store.commit('update','马化腾')
    }
    const btn2=()=>{
      //异步调用
      console.log('进入btn')
      store.dispatch('exchange','刘强东')
    }
    return{
      username,
      btn,btn2
    }
  }
}
</script>
  • 总结
    调用state中的数据的时候,都需要使用格式$store.state.module.参数名,如果开启了命名空间,则其他方法也得这么调用,未开启命名空间的则直接调用即可,因为他进行了全局注册.

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

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

相关文章

STL - String容器

1. string基本概念 本质&#xff1a; string是C风格的字符串&#xff0c;而string本质上是一个类 string和char *的区别&#xff1a; char *是一个指针 string是一个类&#xff0c;类内部封装了char *,管理这个字符串&#xff0c;是一个char *型的容…

本地小说阅读网站打造

目录 一、本地小说网站总体组织框架 1、所需的VUE库和elementLib以及JQ库 2、本地目录设计 3、整体代码样式 二、正文核心代码 1、引入element 样式&#xff0c;和自定义的样式 2、引入JS 3、自定义Header组件 1&#xff09;vue 定义MyHeader组件 2&#xff09;MyHead…

Mapstruct的具体介绍与使用

我是 ABin-阿斌&#xff1a;写一生代码&#xff0c;创一世佳话&#xff0c;筑一览芳华。 如果小伙伴们觉得我的文章不错&#xff0c;记得一键三连哦 文章目录一、mapstruct简介二、mapstruct与其他映射对比三、mapstruct底层原理解析1、Java动态编译四、具体使用1、依赖导入2、…

Linux开发工具的使用(三)

文章目录Linux开发工具的使用&#xff08;三&#xff09;1. 缓冲区1.1 理解\r和\n1.2 缓冲区的初步理解1.3 倒计时小程序实现1.4 进度条小程序实现2. 分布式版本控制系统-git使用2.1 git历史2.2 git版本控制理解2.3 git使用2.3.1 gitee搭建远程仓库2.3.2 开始配置3. Linux调试器…

Revit教程:创建“幕墙竖梃族”的方法步骤

幕墙竖梃族分为两个组成部分&#xff1a;“幕墙竖梃”和“公制轮廓-竖梃”&#xff0c;前者是基于后者轮廓的一个实体拉伸&#xff0c;两者的关系类似于实体与草图。轮廓族及门窗族 (公制门-幕墙&#xff0c;公制窗-幕墙而非公制门与公制窗)可以嵌套入CAD详图或Revit详图&#…

93、【树与二叉树】leetcode ——222. 完全二叉树的节点个数:普通二叉树求法+完全二叉树性质求法(C++版本)

题目描述 原题链接&#xff1a;222. 完全二叉树的节点个数 解题思路 1、普通二叉树节点个数求法 &#xff08;1&#xff09;迭代&#xff1a;层序遍历BFS 遍历一层获取一层结点 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode …

【九】Netty HTTP+XML协议栈开发

HTTP协议介绍业务场景流程图技术栈设计流程图的分析:Step 1Step2Step3Step4Step5分析结果开发开发流程图代码jar 依赖代码结构如图pojo 包request包response 包client 包server包编码解码基类代码说明测试服务端打印结果客户端打印结果总结介绍 由于HTTP协议的通用性&#xff…

使用js实现一个可以【放烟花】的小游戏

放烟花游戏需求&#x1f447;核心玩法&#x1f447;&#x1f447;界面原型&#x1f447;&#x1f447;成品演示&#x1f447;游戏开发1.游戏素材准备2.代码实现1.创建index.html页面2.首页-开始3.加载烟花音效4.重玩儿放烟花的小游戏。点击页面放烟花。兼容移动端。 游戏需求 …

作为普通网民,这些“实用电脑神器”,值得你知道

国内软件夹缝里求生存&#xff0c;由于某些不良软件&#xff0c;许多人对于国产软件认识多为“流氓、捆绑、多广告”&#xff0c;其实并非如此&#xff0c;下面几款让你刮目相看&#xff0c;扭转观念。 1、图片视频画质增强器 这是一款功能极其强大的图片与视频画质增强器&…

阿里云数据湖3.0解决方案两度登上InfoQ 2022年度榜单

经过一个多月的层层竞选&#xff0c;【阿里云数据湖 3.0 解决方案】从 130 多个方案中脱颖而出&#xff0c;荣获 InfoQ 2022 年度中国技术力量年度榜单《十大云原生创新技术方案》&《云原生十大场景化落地方案》双料大奖&#xff0c;这是头部技术媒体对阿里云存储的再一次认…

低代码是什么?有什么优势?一文看懂LowCode

低代码到底是什么&#xff1f;用最简单的方式告诉我&#xff1f;低代码是近两年来一个很热门的概念&#xff0c;尤其是疫情的影响&#xff0c;市场对低代码的需求不断增加&#xff0c;但到底什么是低代码&#xff1f;它到底有什么好处&#xff1f;这篇就为大家解答这个问题&…

vue2.0 插槽不是响应性的

请注意插槽不是响应性的。如果你需要一个组件可以在被传入的数据发生变化时重渲染&#xff0c;我们建议改变策略&#xff0c;依赖诸如 props 或 data 等响应性实例选项。-- vm.$slots 问题描述 项目中自定了组件 widget&#xff0c;作为容器&#xff0c;其中 header 部分做了预…

SCI投稿:MDPI旗下期刊Mathematics投稿经历

最近写了篇论文&#xff0c;由于国内期刊现状&#xff08;懂的都懂&#xff09;&#xff0c;打算投国外的期刊&#xff0c;看来看去选择投MDPI旗下的Mathematics。手稿经过一轮大修之后顺利收到了Accepted&#xff0c;过程还是比较顺利的&#xff0c;记录一下投稿过程。 论文撰…

Matlab实现的FEMIC的说明书

FEMIC程序是用来反演小回路频域电磁感应数据的。要启动代码,在Matlab命令窗口中输入start,然后点击“Enter”或“返回”按钮。然后会出现FEMIC的主界面,见图1。 它由几个输入区域组成,这几个区分别实现了:加载数据,反演过程控制和最终显示。 图1 主界面 下面对这些输入…

[oeasy]python0045_四种进制_binary_octal_decimal_hexadecimal

四种进制 回忆上次内容 上次研究了 通过 八进制数值 转义 \ooo把(ooo)8进制对应的ascii字符输出 转义序列 \n、\t 是 转义序列\xhh 也是 转义序列\ooo 还是 转义序列 现在 总共有 几种进制 了呢&#xff1f;&#x1f914; 先数一下 树 数树 树 就是这么多棵树 用八进制的…

Redis持久化Redis主从

Redis持久化 RDB持久化 RDB: Redis数据备份文件。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后&#xff0c;从磁盘读取快照文件&#xff0c;恢复数据。 主要流程 bgsave开始时会fork主进程得到子进程&#xff0c;子进程共享主进程的内存数据。完成f…

误删的文件不在回收站如何找回?分享一些恢复数据的教程

电脑清理的文件数据&#xff0c;一般都会经过回收站。如果想要恢复回来&#xff0c;可以直接打开电脑的回收站来寻找。可凡事都有万一&#xff0c;我们删除的文件不在回收站里面。这是什么原因&#xff1f;误删的文件不在回收站如何找回&#xff1f;今天就来分享如何恢复不在回…

git快速学习笔记

1.目标 了解Git基本概念能够概述git工作流程能够使用Git常用命令熟悉Git代码托管服务能够使用idea操作git 2.概述 2.1开发中的实际场景 场景一&#xff1a;备份 小明负责的模块就要完成了&#xff0c;就在即将Release之前的一瞬间&#xff0c;电脑突然蓝屏&#xff0c;硬盘光…

C语言进阶(6)——结构体

文章目录1.结构体的基础知识2.结构体的声明3.特殊的声明4.结构体的自引用6. 结构体的内存对齐7.修改默认对齐数8.结构体传参位段1、位段定义2. 位段的内存分配3.位段的跨平台问题4.位段的运用场景1.结构体的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的…

51单片机——LED基础

从小就对电器元件比较感兴趣吧&#xff0c;经常拿坏的电器里面的芯片拆下来玩&#xff0c;甚至那些没坏的电器&#xff0c;比如我家的电视&#xff0c;也会希望它能坏掉&#xff0c;我好去看看里面是什么样子的&#xff0c;为什么能播放节目……&#xff0c;所以我第一眼看到51…