Vue + Element UI 前端篇(八):管理应用状态

news2024/11/26 8:50:11

使用 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){// 对应着上面state
            return 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. 测试效果

进入主页,点击动态换肤取色器,换肤效果如下。

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

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

相关文章

leetcode669. 修剪二叉搜索树(java)

修剪二叉搜索树 题目描述递归代码演示&#xff1a; 题目描述 难度 - 中等 LC - 669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留…

Qt应用开发(基础篇)——普通按钮类 QPushButton QCommandLinkButton

一、前言 QPushButton类继承于QAbstractButton&#xff0c;是一个命令按钮的小部件。 按钮基类 QAbstractButton 按钮或者命令按钮是所有图形界面框架最常见的部件&#xff0c;当按下按钮的时候触发命令、执行某些操作或者回答一个问题&#xff0c;典型的按钮有OK&#xff0c;A…

对接西部数据Western Digital EDI 系统

近期我们为国内某知名电子产品企业提供EDI解决方案&#xff0c;采用知行之桥 EDI 系统作为核心组件&#xff0c;成功与西部数据Western Digital&#xff08;简称西数&#xff09;建立EDI连接&#xff0c;实现数据安全且自动化传输。 EDI实施需求 EDI连接 传输协议&#xff1a;A…

利用谷歌浏览器进行前端代码调试(JS,JSP)一

首先在浏览器打开需要调试的界面&#xff0c;按F12&#xff0c;打开调试窗口。 窗口常用的是界面上的四个&#xff1a;Elements&#xff0c;Console&#xff0c;Sources&#xff0c;Network&#xff0c;下面来介绍各个块的调试功能 1、Elements 这个通常用来调试界面的显示&a…

嵌入式学习笔记(15)再接S5PV210的启动过程

三星推荐方式&#xff1a; bootloader必须大于16KB小于96KB。假定bootloader为74KB&#xff0c;启动过程&#xff1a;开机&#xff0c;BL0运行&#xff0c;BLO加载外部启动设备中的bootloader前16KB&#xff08;BL1&#xff09;到SRAM中运行&#xff0c;BL1运行时会加载BL2(bo…

化繁为简 面板式空调网关亮相上海智能家居展 智哪儿专访青岛中弘赵哲海

面对中央空调协议不开放和智能家居协议不统一的问题&#xff0c;青岛中弘选择中央空调控制器这一细分赛道入局智能家居市场&#xff0c;始终贯彻“所有空调&#xff0c;一个网关”的产品技术理念&#xff0c;逐渐探索出一条中弘的发展路径和商业模式。 在2023年的SSHT上海国际智…

ModaHub魔搭社区开源AI Agent开发框架和评测

AI 模型社区魔搭(ModaHub)又上新了,推出适配开源大语言模型的 AI Agent 开发框架 ModaHub-Agent。借助 ModaHub-Agent,所有开发者都可基于开源 LLM 搭建属于自己的智能体应用,最大限度释放想象力和创造力。ModaHub-Agent 的代码现已开源。 AI Agent(AI 智能体、AI 代理)…

怎么把图片压缩小一点?

怎么把图片压缩小一点&#xff1f;如今是互联网的时代&#xff0c;图片已成为在我们的生活或者职场工作中占有非常重要的作用。我们经常需要在网络上上传图片&#xff0c;将它们发布在朋友圈、自媒体平台、电子商务平台、社交媒体或个人网站上展示。然而&#xff0c;如果图片体…

LeetCode(力扣)216. 组合总和 IIIPython

LeetCode216. 组合总和 III 题目链接代码 题目链接 https://leetcode.cn/problems/combination-sum-iii/ 代码 class Solution:def combinationSum3(self, k: int, n: int) -> List[List[int]]:result[]self.backtracking(n, k, 0, 1, [], result)return resultdef back…

IPO后首份半年报出炉,豪恩汽电净利润同比下滑10.49%

上市公司的半年报陆续出炉。 今年7月4日&#xff0c;主营汽车电子的豪恩汽电正式登陆创业板上市&#xff0c;公司的主要产品为汽车智能驾驶感知系统&#xff0c;包括车载摄像系统、车载视频行驶记录系统和超声波雷达系统等产品。 相比于目前国内主流的智能驾驶方案公司&#…

工具及方法 - 下载谷歌商店APP的APK文件

在手机上安装APP时&#xff0c;一般都是都在应用商店上下载。 Android手机方便些&#xff0c;很多可以下载到APK&#xff0c;再上传到手机上安装&#xff0c;更加方便了用户的使用。 通过使用APK&#xff0c;可以离线安装应用&#xff0c;安装不同的APP版本&#xff0c;或者安装…

LSTM基础

LSTM 视频讲得非常好 https://www.bilibili.com/video/BV1644y1W7sD/?spm_id_from333.788&vd_source3b42b36e44d271f58e90f86679d77db7门的概念 过去&#xff0c;不过去&#xff0c;过去一部分 点乘&#xff0c;0 concatenation&#xff0c;pointwise LSTM RNN 上一…

uniapp h5 微信打开双标题处理

解决办法 在page.json文件下将 globalStyle 下的 navigationStyle 设置为 “custom” 即可解决微信H5双标题的问题 "globalStyle": {"navigationStyle":"custom",设置成 custom 即可解决微信H5双标题的问题"navigationBarTextStyle": …

rtthread 芯片创建的工程 串口无输出

根据启动流程可以看到 从汇编中跳转到 entry,而 rtt studio 通过芯片生成的工程使用的是默认的HAL库&#xff0c;启动代码是跳转到main&#xff0c;没有替换跳转到entry&#xff0c;所以通过修改路径&#xff1a;libraries\CMSIS\Device\ST\STM32F7xx\Source\Templates\gcc\sta…

【uniapp/uview】u-datetime-picker 选择器的过滤器用法

引入&#xff1a;要求日期选择的下拉框在分钟显示时&#xff0c;只显示 0 和 30 分钟&#xff1b; <u-datetime-picker :show"dateShow" :filter"timeFilter" confirm"selDateConfirm" cancel"dateCancel" v-model"value1&qu…

企业无线局域网部署最佳实践

文章目录 企业无线局域网部署最佳实践引言1. 无线网规划和设计a. 选择合适的频宽b. 网络规划工具c. 考虑物理环境d. 用户密度和需求e. 未来扩展f. 安全性和策略g. 测试和验证2. 无线局域网容量2.1 用户和设备预测2.2 应用流量分析2.3 带宽管理2.4 无线技术选择2.5 网络健康检查…

如何使用nvm管理Node版本

1&#xff0c;去github官网&#xff0c;输入nvm-windows&#xff0c;点击第一个nvm项目&#xff0c;在右侧点击releases,选择箭头指向的安装包 2&#xff0c;为nvm的安装包创建一个英文文件夹&#xff0c;在这个文件夹中安装nvm,注意不要和node.js的安装目录一致 3,点击下载的n…

uniapp 路由不要显示#

在Uniapp中&#xff0c;路由默认使用的是hash模式&#xff0c;即在URL中添加#符号。如果你不想在URL中显示#&#xff0c;可以切换为使用history模式。 要在Uniapp中使用history模式&#xff0c;可以按照以下步骤进行操作&#xff1a; 打开manifest.json文件。在"app&qu…

金山办公推出WPS AI,开放应用于智能文档

&#x1f989; AI新闻 &#x1f680; 金山办公推出WPS AI&#xff0c;开放应用于智能文档 摘要&#xff1a;金山办公宣布WPS AI正式面向社会开放&#xff0c;首先用于WPS智能文档&#xff0c;该产品支持内容生成、表达优化、文档理解及处理等功能。用户可通过WPS客户端、App、…

MyBatis获取参数值的两种方式(重点)

MyBatis获取参数值的两种方式&#xff1a;${}和#{}${}的本质就是字符串拼接&#xff0c;#{}的本质就是占位符赋值${}使用字符串拼接的方式拼接sql&#xff0c;若为字符串类型或日期类型的字段进行赋值时&#xff0c;需要手动加单引号&#xff1b;但是#{}使用占位符赋值的方式拼…