当前位置: 首页 > news >正文

【vue(二)Vuex】

Vuex

  • 一、vuex使用步骤
    • 1.安装
    • 2.创建store文件
    • 3.main.js中引入
  • 二、Vuex原理
    • 1.原理
    • 2.求和案例
  • 三、Vuex存储数据的特点
  • 四、mutations里面不能发请求
  • 五、模块化开发和命名空间的开启

一、vuex使用步骤

1.安装

//vue2安装vuex3 
//vue3安装@vuex4
npm i vuex@3

2.创建store文件

  • 可以建立小仓库,最后在index.js中引入并导出
  • 在这里Vue.use(Vuex),main.js中的所有import语句都会提升到最开始执行。所以不能再main.js中引入vuex,否则会报错
//该文件用于创建Vuex中最为核心的store//引入Vue
import Vue from 'vue';
//引入Vuex
import Vuex from 'vuex';//引入插件并使用插件
Vue.use(Vuex); //使用插件后就可以在vm,vc里使用store配置项//准备actions,用于响应组件中的动作
const actions = {};//准备mutations,用于操作数据(state)
const mutations = {};//准备state,用于存储数据
const state = {};//创建store
const store = new Vuex.Store({actions: actions,mutations, //简写state //简写
});//导出store
export default store;

3.main.js中引入

//js文件里所有的import语句都会提升到最开始执行
// 引入Vue
import Vue from 'vue';
// 引入App
import App from './App.vue';
Vue.config.productionTip = false;//引入store
import store from './store/index.js';// 创建一个Vue实例
new Vue({render: (h) => h(App),store,
}).$mount("#app");
  • 创建组件实例的时候,Vue 会把 store 实例自动注入到整个组件树的所有子组件中
  • 意味着vm(Vue 实例)和所有 vc(Vue Components)都能通过 this.$store 访问到同一个全局唯一的 store 实例

二、Vuex原理

1.原理

  • Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式
  • 每一个 Vuex 应用的核心就是 store(仓库)

在这里插入图片描述

  • vc(组件):顾客
  • actions:服务员
  • mutations:厨师
  • state:菜的原料
  • vc来到店里,dispatch给actions要吃什么菜,然后actions把菜单commit给mutations,然后mutations把state进行mutate加工,最后render给vc

2.求和案例

1.先把求和数据给state

const state = {sum: 0,  //初始化数据
};

2.插值语法的使用

<h1>当前求和为:{{  $store.state.sum  }}</h1>

3.组件回调dispatch
(1)如果没有业务逻辑,就直接commit给mutations:例如只修改state里面的数据
(2)如果有业务逻辑,就得先dispatch给actions:例如要进行异步请求调用API

add() {this.$store.dispatch('jia', this.addnum);//如果没有业务逻辑,直接commit可以跳过actions直接给mutations//this.$store.commit('JIA', this.addnum);},

4.actions中使用jia函数commitmutations

  • context对一个对象,不是store本身,但是包含了store的一些关键方法和属性
  • 使用时可以进行解构

在这里插入图片描述

jia(context, value) {//第一个参数是浓缩版的$store,方便你在这里调用commit把东西给mutations//第二个参数是传过来的数据context.commit('JIA', value); },

5.在mutations使用JIA函数

JIA(state, value) {//第一个参数是state对象,第二个参数是传过来的数据console.log('mutations中的JIA被调用了 ', state, value);state.sum += value;
},

6.在getters里面可以简化数据
否则就得在组件中使用计算属性获取数据

(1)直接在组件获取收据

computed: {count() {return this.$store.state.count; // 直接从 store 中获取 count 状态}},

(2)使用vuex的辅助函数mapstate

import { mapState } from 'vuex';computed: {...mapState({count: state => state.count, // 映射 store.state.count 到局部计算属性 count}),// 或者更简单的方式:...mapState(['count'])// 如果store的状态名(count)和计算属性名(count)相同},

(3)在getters里面处理数据,然后在组件访问

const getters = {goodsList(state){//state.searchList.goodsList如果服务器数据回来了,没问题是一个数组//假如网络不给力|没有网state.searchList.goodsList应该返回的是undefined//计算新的属性的属性值至少给人家来一个数组return state.searchList.goodsList||[];}
}
import { mapGetters } from "vuex";computed: {//mapGetters里面的写法:传递的数组,因为getters计算是没有划分模块【home,search】...mapGetters(["goodsList"]),},

三、Vuex存储数据的特点

  • 存储在内存中,用于组件间的传值
  • 响应式:组件读取store状态,store中的状态改变,相应的Vue组件也会自动更新
  • 严格模式:严格模式下只能在mutations里面更改state,不能用actions
    • 在构造器中strict:true开启
  • 不永久性:刷新页面时vuex存储的值会丢失

四、mutations里面不能发请求

  • mutations必须是同步的:
    • 如果 mutation 支持异步操作,就没有办法知道状态是何时更新的,无法很好地进行状态的追踪,给调试带来困难

五、模块化开发和命名空间的开启

  • 如果state,actions等是服务于多个种类的,比如有管home,search等的,这样放到一起很乱,所以可以把它们拆开
    在这里插入图片描述
//引入Vuex -----相当于咱们最大的仓库
import Vuex from "vuex";
//引入Vue
import Vue from "vue";
//使用插件
Vue.use(Vuex);
//引入home|search模块的仓库
import home from "./home";
import search from "./search";
import detail from "./detail";
import shopcart from "./shopcart";
import user from "./user";
import trade from "./trade";
//需要暴露Vuex.Store类的实例(你需要暴露这个类的实例,如果你不对外暴露,外部是不能使用的)
export default new Vuex.Store({//模块:把小仓库进行合并变为大仓库modules: {home,search,detail,shopcart,user,trade,},
});
  • 命名空间
  • 避免名称冲突:最直接的作用就是避免不同模块中的 mutations、actions 和 getters 名称发生冲突。
const countAbout = {
namespaced:true,//开启命名空间
state:{x:1},
mutations: { ... },
actions: { ... },
getters: {...}
}
}const personAbout = {
namespaced:true,//开启命名空间
state:{ ... },
mutations: { ... },
actions: { ... }
}const store = new Vuex.Store({
modules: {countAbout,personAbout
}
})

读取数据

//方式一:自己直接读取
this.$store.state.personAbout.list
//方式二:借助mapState读取:
...mapState('countAbout',['sum','school','subject']), 
// 前边加个参数,意思是读取countAbout 里面的 sum,school.....
http://www.lryc.cn/news/618633.html

相关文章:

  • 解决微前端子应用嵌入后样式被覆盖
  • C++11语法(2)
  • python判断当天是否是当月最后一天
  • Python 常用的正则表达式
  • 未解决|服务的注册与发现|一个api怎么调用到另一个服务的API
  • Spring Boot部署万亿参数模型推理方案(深度解析)
  • gpt-5与gpt-5-fast
  • SQL 与 NoSQL 的核心区别
  • 力扣-739.每日温度
  • 高效解耦:自定义内核链表实现指南(简化版)
  • Java进阶学习之不可变集合
  • 数据分析学习总结之实例练习(双十一淘宝美妆)
  • 非凸科技受邀参加Community Over Code Asia 2025 Rust分论坛
  • C#教程之NPOI读写excel文件XLS,XLSX格式
  • FPGA自学——FIFO缓存器
  • VisionPro——1.VP与C#联合
  • 初识数据结构——优先级队列(堆!堆!堆!)
  • 模板打印技术——Office XLS 打印模板:为政务土地确权定制的纸张替换利器—仙盟创梦IDE
  • LE AUDIO---Volume Control Service
  • Kimi K2 架构深度解析:万亿MoE模型的效率革命与智能体突破
  • 用STM32单片机控制支持正反转的电调
  • 1、JVM内存模型剖析及优化
  • Altium Designer 22使用笔记(6)---板框导入、自绘板框、原点设置
  • 荣耀手机无法连接win11电脑,错误消息:“无法在此设备上加载驱动程序 (hn_usbccgpfilter.sys)。”解决方案
  • 【Linux】Ext系列文件系统
  • 数据结构:后缀表达式:结合性 (Associativity) 与一元运算符 (Unary Operators)
  • 现代化水库运行管理矩阵建设的要点
  • AI Agent——基于 LangGraph 的多智能体任务路由与执行系统实战
  • 【实时Linux实战系列】实时能耗监测与优化技术
  • 《吃透 C++ 类和对象(上):封装、实例化与 this 指针详解》