VUE--VUEX

一、什么是Vuex

Vuex就是一个vue的状态(数据)管理工具,是vue项目实现大范围数据共享的技术方案。能够方便、高效的实现组件之间的数据共享。

Vuex的好处

        (1)数据的存储一步到位,不需要层层传递

        (2)数据的流动十分清晰

        (3)存储在Vuex中的数据都是响应式的(数据更新后,使用数据的组件也会自动更新) 

适合存储到Vuex中的数据----需要共享的数据

Vuex的使用场景:

        频繁、大范围的数据共享。

        (1)某个状态在很多个组件中使用

        (2)多个组件共同维护一份数据 

 

二、Vuex的安装及配置

        1、执行以下命令,安装Vuex 

        注:我的项目是vue2的项目,所以安装的是3.6.2版本的vuex

npm i vuex@3.6.2

         2、新建src/store/index.js,专门存放vuex

        在src目录下新建store文件夹,并在store文件夹下新建index.js文件

        3、创建仓库 

        index.js 内容如下:

// 导入 vue
import Vue from 'vue'
// 导入 vuex
import Vuex from 'vuex'
// vuex也是vue的插件, 需要use一下, 进行插件的安装初始化
Vue.use(Vuex)// 创建仓库实例对象 store
const store = new Vuex.Store()// 导出仓库对象
export default store

        4、挂载到main.js中

         在main.js中导入,并挂载到Vue示例上

        main.js中的内容如下:

import Vue from 'vue'
import App from './App.vue'
import store from './store'Vue.config.productionTip = falsenew Vue({render: h => h(App),store
}).$mount('#app')

        4、测试仓库是否创建成功

        在App.vue中,打印store对象,控制台查看结果

created(){console.log(this.$store)
}

        若控制台输出如下内容,则代表创建仓库成功 

三、state的基础使用 

 state作用:state属性的值是一个对象,用于存储全局共享的数据

        1、存储数据

        在store/index.js中添加如下内容: 

const store = new Vuex.Store({//这里配置vuex// state 用于存储数据(存储状态)(Vuex状态管理)state: {age: 18,name: 'Tom',list: [{ id: 1, name: 'John', isDone: true },{ id: 2, name: 'Juliy', isDone: true },{ id: 2, name: 'Lily', isDone: true },],},
})

        2、vue页面中使用

  <div>组件1<p>{{ $store.state.name + '--' + $store.state.age }}</p></div>

       3、js中使用

import store from "@/store"console.log(store.state.age)

       4、 结果

 

        5、严格模式

开启严格模式,防止在组件中直接修改state数据,开启后,若直接修改state数据,会报错 

        开启方法:

const store = new Vuex.Store({//这里配置vuex// 开启严格模式,防止在组件中直接修改state数据strict: true,
})

四、mutations的基础使用 

mutations作用: 修改state数据,且是修改state数据的唯一途径

        1、定义方法 

        在store/index.js中添加如下内容:

const store = new Vuex.Store({mutations: {updateAge (state, newAge) {state.age = newAge},},
})

        2、vue页面中使用 

<button @click="$store.commit('updateAge', 20)">更新年龄</button>

        3、结果

        页面点击更新年龄按钮,页面中年龄会发生变化

 

五、actions的基础使用

mutations是同步更新数据 (便于监测数据的变化, 更新视图等, 方便于调试工具查看变化),

actions则负责进行异步操作

        1、定义方法 

        在store/index.js中添加如下内容:

const store = new Vuex.Store({// mutations里面放同步方法mutations: {updateAge (state, newAge) {state.age = newAge},},// actions里面放异步方法actions: {updateAgeAfter3s (store, newAge) {setTimeout(() => {// 只有mutations可以修改数据,所以这里调用mutations的方法store.commit('updateAge', newAge)}, 3000)},},
})

        2、vue页面中的使用 

<button @click="$store.dispatch('updateAgeAfter3s', 30)">3s后更新年龄</button>

         3、结果

        页面点击3s后更新年龄按钮,页面中年龄会在3s后发生变化

六、getters的基础使用

getters作用:getters是Vuex中的计算属性(和组件中的计算属性意义一样,但不支持set修改) 

        1、定义方法

        在store/index.js中添加如下内容:

  // 为了方便获取state中的数据,vuex会给每个计算属性的方法,传递一个state参数getters: {ageComputed (state) {return state.age * 2},},

        2、vue页面中使用

<p>{{ $store.getters.ageComputed }}</p>

        3、结果

七、借助辅助方法使用state和getters

mapState和mapGetters是辅助函数,帮助我们把store中的数据映射到组件的计算属性中, 它属于一种方便的用法。

        store/index.js中的内容不变,还是上方的内容,只有vue页面的使用需要修改。

        1、 导入mapState和mapGetters

import { mapState, mapGetters } from 'vuex'

        2、利用展开运算符映射到computed计算属性中 

  computed: {...mapState(['age', 'name']),...mapGetters(['ageComputed']),},

         注:若state中字段名与data中字段名重复,可采用以下方法引入

...mapState({ ages: 'age', uname: 'name' })

        3、vue页面中使用

<p>{{ ages + '---' + uname }}</p>
<p>{{ ageComputed }}</p>

         4、结果

八、借助辅助方法使用mutations和actions

 mapMutations和mapActions,把位于mutations和actions中的方法提取了出来,我们可以将它导入到methods中方便使用。

        1、导入mapMutations和mapActions 

import { mapMutations, mapActions } from 'vuex'

        2、利用展开运算符映射到methods方法中 

  methods: {...mapMutations(['updateAge']),...mapActions(['updateAgeAfter3s']),},

         3、vue页面中使用

<button @click="updateAge(22)">更新年龄</button>
<br />
<button @click="updateAgeAfter3s(24)">3s后更新年龄</button>

         4、结果

九、vuex模块化---modules 

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

即,如果把所有的状态都放在state中,当项目变得越来越大的时候,Vuex会变得越来越难以维护。

由此,又有了Vuex的模块化。

 

        1、模块定义

        在store文件夹下,新建modules文件夹,在modules文件夹中新建user.js和todo.js文件,文件目录如下:

 

        user.js 的内容如下:

// 存储用户相关数据
export default {// 开启命名空间,必须的操作namespaced: true,// state 用于存储数据(存储状态)(Vuex状态管理)state: {age: 18,name: 'Tom',},// mutations是修改state数据的唯一途径// 所有方法不支持一步更新,只支持同步方法mutations: {updateAge (state, newAge) {state.age = newAge},},// actions里面放异步方法actions: {updateAgeAfter3s (store, newAge) {setTimeout(() => {// 只有mutations可以修改数据,所以这里调用mutations的方法store.commit('updateAge', newAge)}, 3000)},},// getters是Vuex中的计算属性(和组件中的计算属性意义一样,但不支持set修改)// 为了方便获取state中的数据,vuex会给每个计算属性的方法,传递一个state参数getters: {ageComputed (state) {return state.age * 2},},
}

        todo.js的内容如下:

// 存储列表相关数据
export default {// 开启命名空间,必须的操作namespaced: true,// state 用于存储数据(存储状态)(Vuex状态管理)state: {list: [{ id: 1, name: 'John', isDone: true },{ id: 2, name: 'Juliy', isDone: true },{ id: 3, name: 'Lily', isDone: true },],},
}

        2、在index.js中导入并注册modules模块

         store/index.js 内容如下:

// 导入 vue
import Vue from 'vue'
// 导入 vuex
import Vuex from 'vuex'// 导入小模块
import user from './modules/user'
import todo from './modules/todo'// vuex也是vue的插件, 需要use一下, 进行插件的安装初始化
// 将vuex注册为插件
Vue.use(Vuex)// 创建仓库 store
// 创建store实例对象
const store = new Vuex.Store({// 这里配置vuex// 开启严格模式,防止在组件中直接修改state数据strict: true,// modules模块注册modules: {user,todo,},
})// 导出仓库/对象
export default store

        3、vue页面中直接使用

<template><div>组件1<p>{{ $store.state.user.name + '--' + $store.state.user.age }}</p><p>{{ $store.getters['user/ageComputed'] }}</p><button @click="$store.commit('user/updateAge', 20)">更新年龄</button><br /><button @click="$store.dispatch('user/updateAgeAfter3s', 30)">3s后更新年龄</button></div>
</template><script>
export default {}
</script><style lang="less" scoped></style>

        4、利用辅助方法调用 

<template><div>组件2<p>{{ age + '---' + name }}</p><!-- <p>{{ ages + '---' + uname }}</p> --><p>{{ ageComputed }}</p><ul><li v-for="item in list" :key="item.id">{{ item.name }}</li></ul><br /><button @click="updateAge(22)">更新年龄</button><br /><button @click="updateAgeAfter3s(24)">3s后更新年龄</button></div>
</template><script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
export default {computed: {...mapState('user', ['age', 'name']),...mapState('todo', ['list']),// 若state中字段名与data中字段名重复,可采用以下方法引入// ...mapState({ ages: 'age', uname: 'name' }),...mapGetters('user', ['ageComputed']),},methods: {...mapMutations(['user/updateAge']),...mapActions(['user/updateAgeAfter3s']),},
}
</script><style lang="less" scoped></style>

十、state、getters、mutations、actions的对比

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

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

相关文章

权威媒体报道 | 百分点科技谈“数据要素×”

近日&#xff0c;国家数据局等17部门联合印发《“数据要素”三年行动计划&#xff08;2024—2026年&#xff09;》&#xff0c;引起广泛关注&#xff0c;作为数据要素技术厂商代表&#xff0c;百分点科技CTO刘译璟接受经济日报、中国高新技术产业导报采访&#xff0c;结合产业现…

<蓝桥杯软件赛>零基础备赛20周--第17周--并查集

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

《微信小程序开发从入门到实战》学习九十三

7.1 视图容器组件 7.1.3 swiper与swiper-item组件 swiper组件的显示效果如下图所示&#xff1a; indicator-dots、indicator-color和indicator-active-color三个属性用于设置swiper组件下方的指示点。设置指示点的颜色时&#xff0c;可以使用HexColor&#xff0c;也可以使用r…

读懂比特币—bitcoin代码分析(五)

今天的代码分析主要是 bitcoin/src/init.cpp 文件中的三个函数&#xff1a;AppInitSanityChecks、AppInitLockDataDirectory、AppInitInterfaces&#xff0c;下面我们来说明这三个函数是用来干什么的&#xff0c;并逐行解读函数代码&#xff0c;先贴出源代码如下&#xff1a; …

C++ 程序使用 OpenCV 库来创建一个图像金字塔,然后将这些图像合并成一张大图

文章目录 源码文件功能解读编译文件 源码文件 #include <iostream> #include <vector> #include <string> #include <opencv2/opencv.hpp>int main() {// 这里应该有代码来生成或加载一系列图像到 imagePyramidstd::vector<cv::Mat> imagePyram…

AWS 专题学习 P10 (Databases、 Data Analytics)

文章目录 专题总览1. Databases1.1 选择合适的数据库1.2 数据库类型1.3 AWS 数据库服务概述Amazon RDSAmazon AuroraAmazon ElastiCacheAmazon DynamoDBAmazon S3DocumentDBAmazon NeptuneAmazon Keyspaces (for Apache Cassandra)Amazon QLDBAmazon Timestream 2. Data & …

8.12用最少数量的箭引爆气球(LC452-M)

452. 用最少数量的箭引爆气球 - 力扣&#xff08;LeetCode&#xff09; 算法&#xff1a; 局部最优&#xff1a;当气球出现重叠&#xff0c;一起射&#xff0c;所用弓箭最少。 全局最优&#xff1a;把所有气球射爆所用弓箭最少。 为了让气球尽可能的重叠&#xff0c;需要对…

5JS语句

表达式在JavaScript中是短语&#xff0c;那么语句&#xff08;statement&#xff09;就是JavaScript整句或命令。 表达式计算出一个值&#xff0c;但语句用来执行以使某件事发生。诸如赋值和函数调用这些有副作用的表达式&#xff0c;是可以作为单独的语句的&#xff0c;这种把…

光控自动照明灯电路原理图

原理图&#xff1a; 电路原理&#xff1a; R1和R2构成分压电路&#xff0c;当环境光线较强时&#xff0c;光敏电阻阻值较小&#xff0c;R2上的电压较小&#xff0c;无法使三极管Q1导通&#xff0c;此时三极管的集电极没有电流通过&#xff0c;发光二极管DS不亮。当光线较暗时&…

Spring Boot3整合MyBatis Plus

目录 1.前置条件 2.导坐标 3.配置数据源 4.mybatis-plus基础配置 5.配置mapper扫描路径 6.MyBatis Plus代码生成器整合 1.导坐标 2.编写代码生成逻辑 7.整合Druid连接池 1.前置条件 已经初始化好一个spring boot项目且版本为3X&#xff0c;项目可正常启动 初始化教程…

昂首资本闪耀石家庄交易技术峰会,尽释行业进取之姿

“2024年石家庄交易技术峰会”在中国河北石家庄举办&#xff0c;Anzo Capital昂首资本作为2024年交易峰会的独家赞助商出席本次活动&#xff0c;Anzo Capital 魄力超前&#xff0c;尽显行业进取之姿。 “开门红”——作为2024年的首场交易技术峰会&#xff0c;“石家庄交易技术…

幻兽帕鲁专用服务器设置,与好友畅玩

创建幻兽帕鲁服务器1分钟部署教程&#xff0c;阿里云和腾讯云均推出幻兽帕鲁服务器专属优惠服务器和部署教程&#xff0c;4核16G和4核32G配置可选&#xff0c;阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程&#xff0c;附阿里云和腾讯云专属幻兽帕鲁优惠价格表&a…

DAY10_SpringBoot—SpringMVC重定向和转发RestFul风格JSON格式SSM框架整合Ajax-JQuery

目录 1 SpringMVC1.1 重定向和转发1.1.1 转发1.1.2 重定向1.1.3 转发练习1.1.4 重定向练习1.1.5 重定向/转发特点1.1.6 重定向/转发意义 1.2 RestFul风格1.2.1 RestFul入门案例1.2.2 简化业务调用 1.3 JSON1.3.1 JSON介绍1.3.2 JSON格式1.3.2.1 Object格式1.3.2.2 Array格式1.3…

cocos creator 碰撞系统

设置碰撞组件 * 添加组件中添加碰撞组件 3种组件类型&#xff0c;矩形碰撞&#xff0c;圆形碰撞&#xff0c; 多边形碰撞 开启碰撞检测 start() {//开启碰撞管理器let cm cc.director.getCollisionManager()cm.enabled true//绘制碰撞检测边界线。用于调试cm.enabledDebug…

01 Redis的特性+下载安装启动

1.1 NoSQL NoSQL&#xff08;“non-relational”&#xff0c; “Not Only SQL”&#xff09;&#xff0c;泛指非关系型的数据库。 键值存储数据库 &#xff1a; 就像 Map 一样的 key-value 对。如Redis文档数据库 &#xff1a; NoSQL 与关系型数据的结合&#xff0c;最像关系…

GUN/Linux时间同步服务之chrony配置管理

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;相关配置操作是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

ICMP协议详解

ICMP&#xff08;Internet Control Message Protocol&#xff09;协议是一个网络层协议。 一个新搭建好的网络&#xff0c;往往需要先进行一个简单的测试&#xff0c;来验证网络是否畅通&#xff1b;但是IP协议并不提供可靠传输。如果丢包了&#xff0c;IP协议并不能通知传输层…

Java中Integer(127)==Integer(127)为True,Integer(128)==Integer(128)却为False,这是为什么?

文章目录 1.前言2. 源码解析3.总结 1.前言 相信大家职业生涯中或多或少的碰到过Java比较变态的笔试题&#xff0c;下面这道题目大家应该不陌生&#xff1a; Integer i 127; Integer j 127;Integer m 128; Integer n 128;System.out.println(i j); // 输出为 true System.o…

Unknown encoder ‘libmp3lame

环境&#xff1a; macos m1 &#xff0c; python3.10.x 背景 做视频切片&#xff0c; 使用moviepy 中VideoFileClip进行截取视频。 报错&#xff1a; Unknown encoder libmp3lameThe audio export failed because FFMPEG didnt find the specified codec for audio encoding …

【ARMv8M Cortex-M33 系列 7 -- RA4M2 移植 RT-Thread 问题总结】

请阅读【嵌入式开发学习必备专栏 】 文章目录 问题小结栈未对齐 经过几天的调试&#xff0c;成功将rt-thead 移植到 RA4M2&#xff08;Cortex-M33 核&#xff09;上&#xff0c;thread 和 shell 命令已经都成功支持。 问题小结 在完成 rt-thread 代码 Makefile 编译系统搭建…