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

server/2024/9/23 9:21:01/

目录

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
javascript">// 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
javascript">// src/store/getters.js// 如果直接通过 store 来访问 category 模块下的 categorys 数据,未免变得过于麻烦。
// 通常情况下,可以创建一个 getters(简单访问)。
export default {// 简单访问// 使用:store.getters.categoryscategorys: (state) => state.category.categorys
}
javascript">// 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)}}
}

javascript">// 组件中使用 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私有逻辑处理

javascript"><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 闪烁问题 

javascript">// 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

javascript">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.ppmy.cn/server/40357.html

相关文章

机器学习案例:加州房产价格(二)

参考链接&#xff1a;https://hands1ml.apachecn.org/2/ 设计好系统后&#xff0c;要开始在工作区编写代码来解决问题了。 下载数据 首先我们需要先得到数据集。 一般情况下&#xff0c;数据是存储于关系型数据库&#xff08;或其它常见数据库&#xff09;中的多个表、文档、…

无线通信模块通过TCP/IP协议实现与PC端的数据传输

在当今的信息时代&#xff0c;无线通信技术的发展日新月异&#xff0c;为我们的工作和生活带来了极大的便利。其中&#xff0c;无线通信模块通过TCP/IP协议向PC端传送数据已经成为了一种常见的通信方式。本文将详细介绍这一过程的主要步骤和涉及的关键技术&#xff0c;并以WIFI…

Oracle导入数据中文乱码问题处理,修改客户端字符编码跟数据库的一致

前提&#xff1a;SQL文件打开其中中文字符是正常显示&#xff0c;保证导出文件中文字符正常。 通过sqlplus命令导入SQL文件出现乱码&#xff0c;这是因为客户端跟数据库的字符集不一致导致出现乱码问题。 要SQL导入的中文正常&#xff0c;要确保执行导入命令的客户端字符编码…

理解并实现区块链智能合约

理解并实现区块链智能合约是一个涉及多个技术层面的过程。智能合约是自动执行、管理区块链上交易或协议的程序。它们在满足预设条件时自动执行合约条款&#xff0c;从而减少了中间人的需要&#xff0c;并提高了透明度和效率。下面是智能合约的基本概念和实现步骤&#xff1a; …

MySQL性能优化(提升数据库性能的措施)

万物皆有裂痕&#xff0c;那是光照进来的地方。大家好&#xff0c;今天给大家分享一下关于MySQL性能优化&#xff0c;在处理大型数据集和高负载情况下&#xff0c;MySQL数据库的性能优化是至关重要的。通过合理的调优策略&#xff0c;可以有效提高数据库的响应速度和稳定性。本…

Nginx最详细入门教程

Nginx 一、Nginx入门介绍 1.1、Nginx简介 1.2、Nginx和Apache 二、安装配置Nginx 2.1、安装配置 2.2、配置文件常规优化 2.3、虚拟主机 三、LNMP架构及应用部署 3.1、安装MySQL数据库 3.2、安装PHP 3.3、配置Nginx支持PHP环境 3.4、在LNMP平台部署Web应…

代码随想录算法训练营第36期DAY22

DAY22 654最大二叉树 自己做的时候忽略了&#xff1a;nums.length>1的题给条件。所以每次递归都要判断是否size()>1&#xff0c;不要空的。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *rig…

gitee 简易使用 上传文件

Wiki - Gitee.com 官方教程 1.gitee 注册帐号 (直接选择初始化选项即可&#xff0c;无需下载git&#xff09; 2.下载git 安装 http://git-scm.com/downloads 3. 桌面 鼠标右键 或是开始菜单 open git bash here 输入&#xff08;复制 &#xff0c;粘贴&#xff09; 运行…