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

目录

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.mzph.cn/diannao/10837.shtml

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

相关文章

Android 13 系统自定义安全水印

效果 源码实现 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java public final void showSafeModeOverlay() {View v LayoutInflater.from(mContext).inflate(com.android.internal.R.layout.safe_mode, null);WindowManager.Layout…

程序员工作中常见问题,你遇到过几个?

在赛博朋克2077玩后感中&#xff0c;我提到&#xff0c;即便是在严谨的机制下&#xff0c;依然可能出现让人匪夷所思或是贻笑大方的问题。 那么今天&#xff0c;就以后端程序员的视角&#xff0c;盘点下从设计开发到上线的常见问题&#xff0c;看看大家中过几个。 01 设计与开…

问题与解决:大华视频后台播放报错

大华播放器接到BI系统后&#xff0c;实时监控视频后台播放一段时间后&#xff0c;报错如下&#xff1a; The play() request was interrupted because video-only background media was paused to save power. 在谷歌浏览器下&#xff0c;直接用代码运行系统&#xff0c;视频在…

python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解

这篇文章主要介绍了python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 JDBC Request 这个 Sampler 可以向数据…

正点原子Linux学习笔记(九)在 LCD 上显示字符

在 LCD 上显示字符 23.1 原始方式&#xff1a;取模显示字符23.2 freetype 简介23.3 freetype 移植下载 FreeType 源码交叉编译 FreeType 源码安装目录下的文件移植到开发板 23.4 freetype 库的使用初始化 FreeType 库加载 face 对象设置字体大小加载字形图像 23.5 示例代码 前面…

FPGA第2篇,FPGA与CPU GPU APU DSP NPU TPU 之间的关系与区别

简介&#xff1a;首先&#xff0c;FPGA与CPU GPU APU NPU TPU DSP这些不同类型的处理器&#xff0c;可以被统称为"处理器"或者"加速器"。它们在计算机硬件系统中承担着核心的计算和处理任务&#xff0c;可以说是系统的"大脑"和"加速引擎&qu…

需求规格说明书设计规范(编制实际项目案例-word)

二、 项目概述 2.1 项目背景 2.2 现状分析 2.2.1 业务现状 2.2.2 系统现状 三、 总体需求 3.1 系统范围 3.2 系统功能 3.3 用户分析 3.4 假设与依赖关系 四、 功能需求 五、 非功能性需求 5.1 用户界面需求 5.2 软硬件环境需求 5.3 产品质量需求 5.4 接口需求 5.5 其他需求 六、…

Django国际化与本地化指南

title: Django国际化与本地化指南 date: 2024/5/12 16:51:04 updated: 2024/5/12 16:51:04 categories: 后端开发 tags: Django-i18n本地化-L10n多语言国际化翻译工具表单验证性能优化 引言 在数字化时代&#xff0c;网站和应用程序必须跨越地域限制&#xff0c;服务于全球…

Qt---事件

一、Qt中的事件 鼠标事件 鼠标进入事件enterEvent 鼠标离开事件leaveEvent 鼠标按下mousePressEvent ( QMouseEvent ev) 鼠标释放mouseReleaseEvent 鼠标移动mouseMoveEvent ev->x()&#xff1a;坐标 ev->y()&#xff1a;y坐标 ev->bu…

【JS红宝书学习笔记】第3章 语言基础

第3章 语言基础 1. 语法 标识符&#xff08;变量、函数、属性或函数参数的名称&#xff09;&#xff1a;一般使用驼峰法命名&#xff0c;关键字、保留字、true、false 和 null 不能作为标识符。 标识符的第一个字符必须是一个字母、下划线&#xff08;_&#xff09;或美元符号…

docker 部署SSM项目(包含打包)

一&#xff1a;SSM项目打包 1.这个一定要勾选防止静态资源没打包上 2.第二步 3.第三步 4.更改名字(注意部署到线上的时候这里如果用docker或者window部署的话需要带这个项目名&#xff0c;不然会出现找不到接口的情况) ![在这里插入图片描述](https://img-blog.csdnimg.cn/dir…

MCU通过UART/SPI等接口更新flash的方法

MCU可提供一种方便的方式来更新flash内容以进行错误修复bugfix或产品更新update。可以使用以下任何模式更新flash内容: •系统内编程(ISP,In-System Programming):用于使用内部bootloader程序和UART/SPI对片上闪存进行编程program或重新编程reprogram。 •应用程序内编程…

comfyui安装deforum启动不了,多半是ffmpeg的问题

如果报错中出现imageio 和 ffmpeg 的字样&#xff0c;去装requirement也没啥用 这里最好到cmd中&#xff0c;进入comfyui的python环境&#xff0c;运行以下两句&#xff1a; import imageio imageio.plugins.ffmpeg.download() 图例&#xff1a; 如果节点不报错了&#xff0…

WHAT - CSS Animationtion 动画系列(四)- 移动端全屏动画

目录 一、背景1.1 GIF & Video1.2 存在的问题 二、技术方案2.1 使用CSS动画和JavaScript2.2 使用JavaScript库2.3 使用序列帧1. css animation 帧动画2. JavaScript requestAnimationFrame 帧动画 2.4 使用Canvas1. html 和 canvas 中的 video2. 基于Canvas的动画库 今天我…

【Linux】动态库与静态库的底层比较

送给大家一句话&#xff1a; 人生最遗憾的&#xff0c;莫过于&#xff0c;轻易地放弃了不该放弃的&#xff0c;固执地坚持了不该坚持的。 – 柏拉图 (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) 底层比较 1 前言2 编译使用比较2 如何加载Than…

java项目之企业OA管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的企业OA管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 企业OA管理系统的主要使用…

Nios-II编程入门实验

文章目录 一 Verilog实现流水灯二 Nios实现流水灯2.1 创建项目2.2 SOPC添加模块2.3 SOPC输入输出连接2.4 Generate2.5 软件部分2.6 运行结果 三 Verilog实现串口3.1 代码3.2 引脚3.3 效果 四 Nios2实现串口4.1 sopc硬件设计4.2 top文件4.3 软件代码4.4 实现效果 五 参考资料六 …

Vue3 查看真实请求地址

上回说到Vue2查看真实请求地址&#xff0c;那么Vue3该如何查看呢&#xff1f; 传送门&#xff1a; Vue2 查看真实请求地址 1. bypass函数 使用bypass函数获取代理结果&#xff0c;设置响应头&#xff08;请求头设置未生效&#xff0c;也可以在响应头上看&#xff09;。 2. …

软件全套资料梳理(需求、开发、实施、运维、安全、测试、交付、认证、评审、投标等)

软件全套精华资料包清单部分文件列表&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0c;用户需求说明书&#xff0c;概要设计说明书&#xff0c…

BGP学习一:关于对等体建立和状态组改变

目录 一.BGP基本概念 &#xff08;1&#xff09;.BGP即是协议也是分类 1.早期EGP 2.BGP满足不同需求 3.BGP区域间传输的优势 &#xff08;1&#xff09;安全性——只传递路由信息 &#xff08;2&#xff09;跨网段建立邻居 4.BGP总结 5.BGP的应用 &#xff08;1&#…