Vue + Element UI 前端篇(八):管理应用状态
使用 Vuex 管理应用状态
1. 引入背景
像先前我们是有导航菜单栏收缩和展开功能的,但是因为组件封装的原因,隐藏按钮在头部组件,而导航菜单在导航菜单组件,这样就涉及到了组件收缩状态的共享问题。收缩展开按钮触发收缩状态的修改,导航菜单需要根据收缩状态来设置导航栏的宽度。这样就需要在收缩状态变更时刷新导航菜单样式。后续类似的组件状态共享还会有许多。为了解决组件间状态的共享,增加组件交互的易用性,我们引入 vuex 专门管理应用状态。
2. 安装依赖
执行以下命令,安装 vuex 依赖。
yarn add vuex
3. 添加配置
3.1 添加 Store
在 src 目录下,新建一个 store 目录,专门管理应用状态,在 index.js 中创建 store。
index.js
import Vue from 'vue' import vuex from 'vuex'Vue.use(vuex);const store = new vuex.Store({state:{collapse:false // 导航栏收缩状态},mutations:{collapse(state){ // 改变收缩状态state.collapse = !state.collapse;}} })export default store
3.2 引入 Store
在 main.js 引入 store
4. 使用 Store
4.1 修改状态
在原先响应折叠导航栏的函数内替换原有逻辑,改为发送提交请求来改变收缩状态。
4.2 获取状态
在原先引用 collapse 的地方改为引用 $store.state.collapse 。
根据收缩状态绑定不同样式,就可以实现导航菜单栏根据收缩状态更新页面效果了。
MenuBar.vue
HeadBar.vue
Main.vue
5. 测试效果
进入主页,点击收缩按钮,效果如下图。
Store 模块化
现在我们的状态都维护在index.js,状态一多就会出现臃肿,这里可以根据需求进行模块化。
1. 文件结构
模块化后的文件结构
2. Store 封装
改写index.js,引入模块化,这里把之前的状态抽取到AppStore,后续可能还会有UserStore、MenuStore之类的。
import Vue from 'vue' import vuex from 'vuex'Vue.use(vuex);import AppStore from './modules/AppStore.js';const store = new vuex.Store({modules: {app: AppStore // 其他} })export default store
AppStore.js
export default {state: {appName: "I like Kitty", // 应用名称collapse:false // 导航栏收缩状态},getters: {collapse(state){// 对应着上面statereturn collapse;}},mutations: {collapse(state){ // 改变收缩状态state.collapse = !state.collapse;}},actions: {} }
3. 状态引用
在引用 store 状态的地方加上模块名称
如果一个文件内引用过多,嫌引用路劲又长又臭,可以使用 mapState、mapGetter、mapActions 工具进行简化。
如 MenuBar.vue 中引用较多,我们用 mapState 简化对属性的引用。如下图,给状态赋予别名。
引用状态的地方就可以直接用上面定义的别名进行访问了。
mapState、mapGetter、mapActions 工具对于文件内大量又长又臭的状态引用时非常有用,可以适当的运用。
封装收缩组件
1. 组件封装
如下图,新建目录和文件,封装收缩组件展开导航栏组件。
Hamburger/index.vue
<template><svg t="1492500959545" @click="toggleClick" class="hamburger" :class="{'is-active':isActive}" style="" viewBox="0 0 1024 1024"version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1691" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><path d="M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z"p-id="1692"></path><path d="M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z"p-id="1693"></path><path d="M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z"p-id="1694"></path></svg> </template><script> export default {name: 'hamburger',props: {isActive: {type: Boolean,default: false},toggleClick: {type: Function,default: null}} } </script><style scoped> .hamburger {display: inline-block;cursor: pointer;width: 20px;height: 20px;transform: rotate(90deg);transition: .38s;transform-origin: 50% 50%; } .hamburger.is-active {transform: rotate(0deg); } </style>
2. 引入组件
HeadBar.vue 中引入组件
响应函数,通过 store 修改收缩状态
3. 测试效果
进入主页,效果如下图。
封装面包屑组件
将面包屑从主内容中抽取出来,封装成 BreadCrumb。
BreadCrumb/index.vue
<template><el-breadcrumb separator="/" class="breadcrumb"><el-breadcrumb-item v-for="item in $route.matched" :key="item.path"><a href="www.baidu.com">{{ item.name }}</a></el-breadcrumb-item></el-breadcrumb> </template><script> export default {data() {return {};},methods: {},mounted() {} }; </script><style scoped lang="scss"> .breadcrumb {padding: 10px; border-color: rgba(38, 86, 114, 0.2);border-bottom-width: 1px;border-bottom-style: solid;// background: rgba(180, 189, 196, 0.1); } </style>
main.js 中 引入
动态换肤
1. 功能背景
之前的动态换肤,只能刷新 Element 相关组件的颜色,而如果我们希望在换肤的时候我们的头部区域也同步改变就需要做进一步的修改了。接下来,我们就实现这个功能,赋予换肤组件在更新 Element 组件颜色的时候,可以定制插入一些自定义的操作。
2. 改进ThemePicker
修改 ThemePicker 插件, 绑定导出函数和主题色参数。
3. 父组件函数绑定
在父组件绑定处理函数,增加自定义同步更新逻辑。
这里是切换主题颜色的时候,设置 store 状态,保存共享主题色,这样其他绑定主题色的组件都可以自动更新了。
4. 添加共享状态
在 store 中定义主题色相关的状态。
5. 共享状态引入
在要使用的组件处引入主题色状态。
组件样式绑定主题色状态,主题色并更时,更新组件背景色样式。
6. 测试效果
进入主页,点击动态换肤取色器,换肤效果如下。
相关文章:
Vue + Element UI 前端篇(八):管理应用状态
使用 Vuex 管理应用状态 1. 引入背景 像先前我们是有导航菜单栏收缩和展开功能的,但是因为组件封装的原因,隐藏按钮在头部组件,而导航菜单在导航菜单组件,这样就涉及到了组件收缩状态的共享问题。收缩展开按钮触发收缩状态的修改…...
开发常用代码区
1. 查询两个LocalDate类型之间的所有日(周,月) long numOfDays ChronoUnit.WEEKS.between(startDateLocal, endDateLocal); List<LocalDate> dateList LongStream.range(0, numOfDays).mapToObj(startDateLocal::plusWeeks)//映射.c…...
SpringBoot+MySQL+Vue前后端分离的宠物领养救助管理系统(附论文)
文章目录 项目介绍主要功能截图:后台:登录个人中心宠物用品管理宠物领养管理用户管理用户领养管理宠物挂失管理论坛管理系统管理订单管理前台首页宠物挂失论坛信息宠物资讯部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创...
ClickHouse 存算分离改造:小红书自研云原生数据仓库实践
ClickHouse 作为业界性能最强大的 OLAP 系统,在小红书内部被广泛应用于广告、社区、直播和电商等多个业务领域。然而,原生 ClickHouse 的 MPP 架构在运维成本、弹性扩展和故障恢复方面存在较大局限性。为应对挑战,小红书数据流团队基于开源 C…...
STM32-DMA
1 DMA简介 DMA(Direct Memory Access),中文名为直接内存访问,它是一些计算机总线架构提供的功能,能使数据从附加设备(如磁盘驱动器)直接发送到计算机主板的内存上。对应嵌入式处理器来说,DMA可…...
1065 A+B and C (64bit)
题:点我 题目大意: 这题虽然看着像签到,然鹅签不过去。 因为我最初写的沙雕代码是: #include<iostream> #include<cstdio> using namespace std; int main(void) {int t;scanf("%d", &t);for (int i …...
阿里云效和阿里在线idea使用
阿里云效 https://flow.aliyun.com/all?page1 阿里在线idea:https://ide.aliyun.com/ 在云效中创建的项目可以在在线idea 打开 运行中的项目 设置ssh 设置以后可以使用云效率的代码构建来构建代码 设置 添加自有云或者体验5h...
[git] 删除分支中的内容 -> 空分支
git branch 分支名1 #创建一个新分支git checkout 分支名1 #切换到刚创建的分支上git rm -rf . #删除所有文件内容 -> 空分支(注意:命令后面有个.) 也可以 git checkout --orphan 分支名1 #创建一个分支,其包含父分支…...
git 配置
vi ~/.gitconfig 安装开源命令行对比工具 delta: https://github.com/dandavison/delta 详细设置delta:https://www.5axxw.com/wiki/content/xrx4vf [user]name xxemail xxxxxx.com[core]attributesfile ~/.gitattributespager deltaquotepath false[credentia…...
vue router进行路由跳转并携带参数(params/query)
在使用router.push进行路由跳转到另一个组件时,可以通过params或query来传递参数。 1. 使用params传参: // 在路由跳转时传递参数 router.push({ name: targetComponent, params: {paramName: paramValue // 参数名和值 } });// 在目标组件中通过$r…...
Mysql触发器
文章目录 1. 简介2. 触发器语法 1. 简介 触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义的sql语句集合。触发器可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。使…...
认识doubbo和rpc
开个新坑,和大家一起学习Dubbo 3.X。我们按照一个由浅入深顺序来学习,先从使用Dubbo开始,再深入Dubbo的核心原理。 今天我们就从认识Dubbo开始,整体的内容可以分为3个部分: Dubbo是什么RPC是什么Dubbo的架构 正式开…...
get_views中list的arch格式
1 日历 -> 会议 <tree string"会议" sample"1" multi_edit"1"><header><button name"action_open_composer" type"object" context"{composition_mode:mass_mail}" string"发送邮件"…...
淘宝商品销量接口API更新(总销+精准月销API)
不少客户有获取淘宝商品销量的需求,淘宝商品销量接口主要用于以下业务场景。有不齐全的欢迎大家补充。 库存管理:商家可以通过接口获取到实时的销量信息,更好地进行库存管理。供应链计划:商家可以通过接口了解到商品的销售趋势&a…...
Android 11编译第三弹 ADB开启ROOT权限
一、为什么需要adb root权限 问题:Relese版本,默认adb访问会降级到shell权限,一些敏感操作不能进行,远程调试比较麻烦。且Release版本没有su模块,不能切换Root用户。 开启adb调试以后,默认进入adb是syste…...
《TCP/IP网络编程》--基于TCP实现字符串对话和文件传输
1--基于TCP实现字符串对话 主要需求: 服务器端和客户端各传递 1 次字符串,基于 TCP 协议,传递字符串前先以 4 字节整数型方式传递字符串长度,剩余部分为字符串数据; 注:下面的代码基于 Windows 系统实现&am…...
Feign负载均衡写法
Feign主要为了面向接口编程 feign是web service客户端,是接口实现的,而ribbon是通过微服务名字访问通过RestTemplate调用的,如下: 在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它(类似…...
OpenCV(二十八):连通域分割
目录 1.介绍连通域分割 2.像素领域介绍 3.两遍法分割连通域 4.连通域分割函数 1.介绍连通域分割 连通域分割是一种图像处理技术,用于将图像中的相邻像素组成的区域划分为不同的连通域。这些像素具有相似的特性,如相近的灰度值或颜色。连通域分割可以…...
达梦控制台还原报错“管道失败”
达梦数据库控制台还原报错“管道失败” 环境 主机操作系统:windows10 profession 达梦数据库版本:达梦7 问题背景 全新安装达梦7数据库后,创建数据库实例,需要恢复往期bat备份。在控制台配置指定搜索目录后,获取备份时…...
[杂谈]-快速了解直接内存访问 (DMA)
快速了解直接内存访问 (DMA) 文章目录 快速了解直接内存访问 (DMA)1、使用 DMA 需要什么?2、DMA介绍3、DMA 中的数据传输如何进行?4、DMA接口5、DMAC 控制器寄存器6、DMA 控制器编程模式6.1 突发模式(Burst Mode)6.2 循环窃取模式…...
java八股文面试[设计模式]——23种设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结 在GOF编写的设计模式(可复用面向对象软件的基础)一书中说道: 本书涉及的设计模式并不描述新的或未经证实的设计,我们只收录那些在不同系统中…...
mysql(十)mysql主从复制--主库切换
概述 可能为了更迭升级服务器,或者主库出现问题,又或者只是希望重新分配容量,此时需要切换主库。 如果这是计划内的切换,会相对容易点。只需要在从库上使用CHANGE MASTER TO命令,并设置合适的值。大多数的值都是可选…...
vue3项目的src下的各个文件夹介绍
在Vue 3项目中,通常的目录结构如下所示: src/|- assets/ # 存放静态资源文件,如图片、字体等|- components/ # 存放可复用的Vue组件|- views/ # 存放页面级别的Vue组件|- router/ # 存放路由相关的配置文件|- store…...
五、编译预处理
源程序编译预处理命令一律以‘#’开头 5.1宏定义 不带参数的宏定义 # define 宏名 字符串 宏命令之后,出现宏名的地方均用其对应的字符串来替换。 宏替换是一种”机械替换“,宏定义语句后一般不加分号,因为它仅具有替换功能,…...
应用出海,Google 分享如何让数字营销素材再上层楼
数字营销广告要想取得理想的效果,广告素材是最关键的决定因素之一。 事实上米贸搜谷歌推广发现,在广告给品牌带来的销售额增量中,有 47% 都归功于广告素材。在当今自动化时代,广告素材的作用尤其重要:固然机器可以完成…...
酱香咖啡喝了没?用数据分析揭秘瑞幸咖啡的7500万用户增长策略
瑞幸 X 茅台 这波联名赢麻了,不仅狂卖 542 万杯,甚至带动茅台市值飙升200亿。 瑞幸这几年联名搞了不少,又是线条小狗的爱情故事,又是椰树、维密、周大福、足球的,下面老李就从数据分析角度,带大家来看一下…...
Grafana之魔法:揭秘数据可视化的艺术
在数据驱动的时代,如何有效地呈现和理解数据成为了每个组织和个人的核心任务。Grafana作为一个领先的开源数据可视化工具,为我们提供了强大的功能和灵活性。本文将深入探讨Grafana的魔法,以及它如何帮助我们更好地理解数据。 Grafana简介 G…...
c高级day2作业
写一个1.sh脚本,将以下内容放到脚本中: 在家目录下创建目录文件,dir 在dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中, 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.tar.xz…...
第3章 【MySQL】字符集和比较规则
3.1 字符集和比较规则简介 3.1.1 字符集简介 如何存储字符串?需要建立字符与二进制数据的映射关系。建立这个关系需要: 1.把哪些字符映射成二进制数据? 2.怎么映射? 将一个字符映射成一个二进制数据的过程也叫做 编码 &#…...
2023 年全国大学生数学建模D题目-圈养湖羊的空间利用率
D题目应该是专科题目???不确定了 感觉类似一个细胞分裂问题一样,1,2,4,8, 题目1中规中矩 按照前面说的分配方法,一步一步计算进行 缺口的问题考虑反推回去,…...
德州宁津建设局网站/免费推广工具有哪些
古老的unix提出了一切皆文件的思想,近代的OO提出了一切皆对象的理论,在unix的年代,人们迫切需要的是如何操作计算机而不是如何设计软件,毕竟那个时候软件设计其实比现在简单,就那么几种,关键是没有人会操作…...
wordpress分类页面模板/站长工具seo综合查询
Java流程控制 Java流程控制Java流程控制用户交互 Scanner举例顺序结构选择结构if单选择结构if双选择结构if多选择结构嵌套的if结构Switch选择结构循环结构break & continue练习用户交互 Scanner 可以获取用户的输入: java.util.Scanner 是Java5 的新特征&#…...
广州网站建设大公司/个人博客网页设计
pc l_ range_image 库中包含两个表达深度图像和对深度图 像进行操作的类,其依赖于 pcl: : common 模块; class pcl : : Rangelmage RangeImage 类继承于 PointCloud ,主要功能是实现从一个特定视点得到的一个三维场景的深度图像 。 其继承关系如图所示 : 类 Rangelmage 关…...
wordpress设置背景/合肥做网站哪家好
忙,还有两周多就要上线了,可是项目也就开始两周多。我现在估计已经快疯了。忙的时候,觉得自己实在是有心无力。如果说blog是一块镜子,那么我希望逃避。夜深人静的时候,我都不逃避,但是我已经累的倒下了&…...
服务推广网站/搜索引擎优化涉及的内容
在本文中,我将描述Kafka中日志压缩数据结构。然后,我会向大家展示Kafka如何在内部将这些topic的状态保存在文件系统中。预备知识我假设大家已经熟悉Apache Kafka的基本概念,比如代理(broker)、主题(topic)、分区(partition)、消费者(consumer…...
网站建设最贵服务商/bt兔子磁力搜索引擎最新版
参考链接: numpy.floor 函数功能: 对输入的多维数组逐元素进行向下取整.实验代码展示: Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "…...