企业级复杂前中台项目响应式处理方案

news/2024/6/16 22:24:02

目录

01: 前言

02: 响应式下navigtionBar实现方案分析 

数据 

视图 

小结

03: 抽离公用逻辑,封装系列动作 

04: PC端navigationBar私有逻辑处理

05: 分析 navigationBar 闪烁问题 

06: 处理 navigationBar 闪烁问题 

07: category数据缓存,覆盖初始数据 

08: 小结


01: 前言

        目前我们已经完成过一个 移动端的 navigationBar 了。对于 navigationBar 这个功能,我们还需要在 PC 端同样进行实现。通常我们把这样的一套功能称之为 响应式多指响应式布局:一套样式在多端展示)。

        当前项目不光是一个简单的响应式布局,而是一个复杂的前中台系统。在这样的前中台系统中,又应该如何应对这种响应式的问题呢?

        在 样式复用、逻辑复用、代码可维护性 之间,又应该如何去进行权衡呢?

02: 响应式下navigtionBar实现方案分析 

通常情况下 复杂功能的响应式处理,一般有三种处理方案:

1. 一套代码处理多端:

        1. 优势:代码量相对较少

        2. 劣势:耦合性强,不利于后期维护

2. 多套代码分别处理各端:

        1. 优势:逻辑清晰

        2. 劣势:可能会产生很多重复的逻辑

3. 结合以上两种方案,抽离公用逻辑,封装私有逻辑

        1. 优势:结合以上两点优势

        2. 劣势:需要对业务和逻辑足够清楚

综合来看,肯定是第三种方式更好,所以咱们的 navigationBar 就通过第三种方式进行实现。

那么具体我们应该怎么去做呢?哪些是公用逻辑?哪些是私有逻辑?

我们知道一个功能由两部分组成:

        1. 数据

        2. 视图

数据 

首先我们先来分析数据,双方(移动端和 PC 端)的数据是一样的。这一点是完全可以复用的。

目前咱们的数据是通过 src/views/main/components/navigation/index.vue 进行获取,然后进行传递的。目前情况是我们期望进行数据的复用,如果一直进行数据传递的话,未免有些过于复杂了。可以直接通过 vuex 来封装这一系列的 获取、切换 行为。 

视图 

双方的视图在展示中的逻辑具备较大差异,为了综合 可维护性,视图逻辑部分我们期望单独封装到各自的组件中进行处理。

小结

这样我们就分析好了 navigationBar 的公有和私有部分:

1. 数据为公有数据,可以在 vuex 中进行抽离处理。

2. 视图为私有部分,需要在各自的组件中进行单独处理。

03: 抽离公用逻辑,封装系列动作 

- src
- - store
- - - modules
- - - - category.js
- - - index.js
// src/store/index.jsimport { createStore } from 'vuex'
import getters from './getters'
import category from './modules/category'const store = createStore({getters,modules: {category}
})export default store
// src/store/getters.js// 如果直接通过 store 来访问 category 模块下的 categorys 数据,未免变得过于麻烦。
// 通常情况下,可以创建一个 getters(简单访问)。
export default {// 简单访问// 使用:store.getters.categoryscategorys: (state) => state.category.categorys
}
// src/store/modules/category.jsimport { ALL_CATEGORY_ITEM } from '@/constants'
import { getCategory } from '@/api/category'/*** 处理 navigationBar 中的数据 categorys*/
export default {// 独立作用域( vuex 中定义模块必须要做的东西)namespaced: true,state: () => {return {categorys: [ ALL_CATEGORY_ITEM ]}},mutations: {setCategorys(state, newCategorys) {state.categorys = [ ALL_CATEGORY_ITEM, ...newCategorys ]}}// 思路:封装一个动作,我们期望触发这样一个动作,可以完成一整套的 categorys 的赋值。actions: {/*** 获取 category 数据,并自动保存到 vuex 中*/async useCategoryData(context) {const { categorys } = await getCategory()context.commit('setCategorys', categorys)}}
}

// 组件中使用 vuex 内的数据// src/views/main/components/navigation/index.vue 中
<script setup>import { useStore } from 'vuex'const store = useStore()store.dispatch('category/useCategoryData')</script>// src/views/main/components/navigation/mobile/index.vue 中
<template><li v-for="(item, index) in $store.getters.categorys"></li>
</template>

04: PC端navigationBar私有逻辑处理

<li :class="{'text-zinc-900 bg-zinc-200': currentCategoryIndex === index
}">
</li>// 展开状态切换处理
const isOpenCategory = ref(false)
const triggerState = () => {isOpenCategory.value = !isOpenCategory.value
}// 选中状态处理
const currentCategoryIndex = ref(0)
const onItemClick = (index) => {currentCategoryIndex.value = index
}

05: 分析 navigationBar 闪烁问题 

问题描述:navigationBar 开始只展示 ‘全部’ 选项,获取完数据后才展示所有数据选项。 这样的话,刷新页面会出现 navigationBar 闪烁问题。

解决思路:

        1. 让 categorys 数据项具备一个初始化数据。

        2. 从服务端获取数据,替换初始化数据。

        3. 为了防止初始化数据太老,我们把每次获取到的新数据,作为下一次的初始化数据。

06: 处理 navigationBar 闪烁问题 

// src/constants/index.js// categorys 的初始化数据
export const CATEGORYS_NOMAR_DATA = [ALL_CATEGORY_ITEM,{ id: 'web_app_icon', name: 'UI/UX' },{ id: 'design', name: '平面' },{ id: 'illustration', name: '插画/漫画' },{ id: 'photography', name: '摄影' },{ id: 'games', name: '游戏' },{ id: 'anime', name: '动漫' },{id: 'industrial_design',name: '工业设计'},{id: 'industrial_design',name: '建筑设计'},{id: 'industrial_design',name: '人文艺术'},{id: 'industrial_design',name: '家居/家装'}
]

07: category数据缓存,覆盖初始数据 

方案:每次从接口得到的数据,进行缓存(localstorage)。在下次运行时,把缓存的数据作为初始值。 

想要实现这一步的功能,可以利用 vuex-persistedstate

vuex-persistedstate: 可以自动保存 vuex 中的数据到 localstorage。并且在下次开始的时候,自动读取这个数据到对应的 state 中。

接下来就利用这个库来实现我们的功能:

1. 安装 vuex-persistedstate

npm i --save vex-persistedstate@4.1.0

2. 在 src/store/index.js 中导入,并注册 plugin

import createPersistedState from 'vuex-persistedstate'const store = createStore({……plugins: [createPersistedState({// 保存到 localStorage 中的 keykey: 'imooc-front',// 需要保存的模块paths: ['category']})]
})export default store

3. 浏览器中存储的格式:

08: 小结

这里我们处理了 navigationBar 的响应式内容。

对于它的响应式内容处理,我们采取了 抽离公用逻辑、封装私有逻辑 的方案。

数据部分 抽离到了 vuex 中,并封装了一系列的动作进行统一处理。

视图逻辑 部分,在各个业务组件中进行了单独处理。


http://www.mrgr.cn/p/80425081

相关文章

栈和队列的相互实现(C)

目录 1.[用栈实现队列]<https://leetcode.cn/problems/implement-queue-using-stacks/description/>2.全套代码3.[用队列实现栈]<https://leetcode.cn/problems/implement-stack-using-queues/description/>4.全套代码 1.[用栈实现队列]https://leetcode.cn/proble…

【大数据】HDFS、HBase操作教程(含指令和JAVA API)

目录 1.前言 2.HDFS 2.1.指令操作 2.2.JAVA API 3.HBase 3.1.指令操作 3.2.JAVA API 1.前言 本文是作者大数据专栏系列的其中一篇&#xff0c;前文中已经详细聊过分布式文件系统HDFS和分布式数据库HBase了&#xff0c;本文将会是它们的实操讲解。 HDFS相关前文&#x…

LeetCode 题目 119:杨辉三角 II

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任字节跳动数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python&#xff0c;欢迎探讨交流 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题…

python教程12-面向对象进阶

1、classmethod类方法 类方法只能访问类变量,不能访问实例变量2、staticmethod静态方法 不能访问类变量,也不能访问实例变量。除非在实例调用时给方法传实例。3、反射1-判断对象是否有属性的情况 用法: 实例: __name__,模块被其他模块导入的时候调用,是你叫的名字。模块自…

Windows系统完全卸载删除 Node.js (包含控制面板找不到node.js选项情况)

1.打开cmd命令行窗口&#xff0c;输入npm cache clean --force 回车执行 2.打开控制面板&#xff0c;在控制面板中把Node.js卸载 移除之后检查环境变量是否也移除&#xff1a;点击Path&#xff0c;点击编辑。 把环境变量中和node有关的全部移除&#xff0c;然后点击确定。 3.重…

Loongnix系统替换内核操作

Loongnix系统替换内核操作 一、终端下执行命令 sudo apt search linux-image* 返回结果中格式如: linux-image-4.19.0-19-loongson-3 为最新的内核源码。 二、下载内核源码包 sudo apt source linux-image-4.19.0-19-loongson-3 如提示&#xff1a;E: 您必须在 sources.li…

宝塔docker快速安装Halo

宝塔docker快速安装Halo 一、Docker 部署Halo 我们前面还是需要先在宝塔面板环境中安装Docker,一般默认时候是没有安装的。这里我们在宝塔面板中的Docker管理器应用商店中安装。我们可以看到直接等待安装成功。后面在部署程序的时候有需要用到这里界面。二、这里我们在【镜像管…

环形链表(给定一个链表的头节点 head ,返回链表开始入环的第一个节点)的原理讲解

一&#xff1a;题目 二&#xff1a;原理讲解 解决这个题目 &#xff0c;我们得先理解它的原理。 1&#xff1a; 首先假设两个指针&#xff0c;一个快指针fast&#xff0c;一个慢指针slow&#xff0c;fast一次移动两个节点&#xff0c;slow一次移动一个节点。&#xff08;前面…

决策管理中的数学方法

需要注意的是,用excel求解的时候需要导入线性规划加载项如下: pert分析需要DecisionTools中的RiskSolver插件 1.链接:https://pan.baidu.com/s/1wKhUFWgNmQ7U33kl5AypZw 提取码:zqkn 2.“Palisade_Book_expires_Aril_10_2025.lic”文件复制到以下路径: C:\Program Files …

Spring MVC(建立连接 + 请求)

文章目录 一、建立客户端和服务器的连接二、如何构造请求&#xff08;传参&#xff09;2.1 构造请求方式 参数通用注解2.2 传递单个参数2.3 传递多个参数2.4 传递数组/集合2.5 传递对象2.6 传递JSON 三、相关的其他请求操作3.1 获取URL中的参数 PathVariable3.2 上传文件 Requ…

ipa 分区算法分析,图解

参考 Room Segmentation: Survey, Implementation, and Analysis. 分区算法调查&#xff0c;实现以及评估对比 相关论文 分区算法 New Brooms Sweep Clean - An Autonomous Robotic Cleaning Assistant for Professional Office Cleaning 形态分割 Interactive SLAM using …

uniapp 小程序图片懒加载组件 ImageLazyLoad

预览图 组件【ImageLazyLoad】代码 <template><viewclass"image-lazy-load":style"{opacity: opacity,borderRadius: borderRadius rpx,background: background,transition: opacity ${time / 1000}s ease-in-out,}":class"image-lazy-loa…

1.分布式-理论

目录 一、什么是分布式系统 二、CAP理论 1.一致性Consisency 2.可用性(Availability) 3.分区容错性(Partition tolrance) 三、BASE理论 1.Basically Available(基本可用) 2.Soft state&#xff08;软状态&#xff09; 3.Eventually consistent&#xff08;最终一致性&a…

当代 Qt 正确的 安装方法 及 多版本切换

此文写于 20240511 首先去网站Index of /official_releases/online_installers下载一个安装器 安装器有什么用? 可以浏览安装版本 安装组件 安装器版本越能 能装的东西越多 现在只能选Qt5 和 Qt6 至于你公司用的Qt4 我也没招 见招时再拆招 安装器 默认国外源 可以换国内…

Bean的作用域和自动装配

Spring Bean的作用域主要有五种Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,singleton作用域是Spring中的缺省作用域(默认的作用域)。 prototype是原型类型,它在我们创建容…

从0开始学python(七)

目录 前言 1 break、continue和pass函数 1.1 break 1.2 continue 1.3 pass 2、序列的索引及切片操作 2.1字符串的索引和切片 2.1.1 字符串索引 2.1.2 字符串切片 总结 前言 上一篇文章我们介绍了python中的循环结构&#xff0c;包括for和while的使用。本章接着往下讲。…

Chatgpt的应用场景

文案创作类&#xff1a; 作为一名大型语言模型&#xff0c;ChatGPT可以为使用者提供多种文本处理和文字创作方面的服务&#xff0c;例如&#xff1a; 文本生成和创作 ChatGPT可以基于您提供的主题、关键词或文本段落&#xff0c;生成符合使用者要求的新文本。这些文本可以是文…

跟着ChatGPT学算法-完全背包问题

一、题目 给定 n 个物品,第 i 个物品的重量为 wgt[i-1]、价值为 val[i-1] ,和一个容量为 cap 的背包。每个物品可以重复选取,问在限定背包容量下能放入物品的最大价值。二、和ChatGPT聊聊您 您是一位资深算法工程师,请深入浅出地给出完全背包问题的分析过程和完整带注释的J…

类型注解-Python

师从黑马程序员 类型注解的语法 类型注释的限制 import json import randomvar_1 : int10 var_2 : str"itheima" var_3 : boolTrueclass Student:pass stu :StudentStudent()my_list:list [1,2,3] my_tuple:tuple(1,2,3) my_dict:dict{"itheima":666}my_l…

MySQL5.7安装详细过程--window系统

一:MySQL5.7安装详细过程--window系统1.1、下载MySQL5.7安装包https://downloads.mysql.com/archives/community/1.2、将文件解压到盘符中你可以解压到你想解压的位置,放在C或其他盘符都可以。1.3、配置MySQL的环境变量由于我们下载的不是exe或者msi版本,不能直接双击安装,…