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

目录

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.xdnf.cn/news/1420673.html

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

相关文章

【云原生】 Kubernetes核心概念

目录 引言 一、部署方式回溯 &#xff08;一&#xff09;传统部署时代 &#xff08;二&#xff09;虚拟化部署时代 &#xff08;三&#xff09;容器部署时代 二、Kubernetes基本介绍 &#xff08;一&#xff09;为什么使用k8s &#xff08;二&#xff09;主要功能 &am…

Linux学习之路 -- 文件系统 -- 缓冲区

前面介绍了文件描述符的相关知识&#xff0c;下面我们将介绍缓冲区的相关知识。 本质上来说&#xff0c;缓冲区就是一块内存区域&#xff0c;因为内核上的缓冲区较复杂&#xff0c;所以本文主要介绍C语言的缓冲区。 目录 1.为什么要有缓冲区 2.应用层缓冲区的默认刷新策略 …

【Java】:方法重写、动态绑定和多态

目录 一个生动形象的例子 场景设定 1. 方法重写&#xff08;Method Overriding&#xff09; 2. 动态绑定&#xff08;Dynamic Binding&#xff09; 3. 多态&#xff08;Polymorphism&#xff09; 归纳关系&#xff1a; 重写 概念 条件 重写的示例 重载与重写的区别 …

【python】python淘宝交易数据分析可视化(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Linux实验 系统管理(三)

实验目的&#xff1a; 了解Linux系统下的进程&#xff1b;掌握一类守护进程——计划任务的管理&#xff1b;掌握进程管理的常用命令&#xff1b;掌握进程的前台与后台管理&#xff1b;了解Linux系统的运行级别&#xff1b;掌握系统服务管理的常用命令。 实验内容&#xff1a; …

WEB后端复习——Servlet

Servlet是运行在Web服务器或应用服务器上的java程序&#xff0c;它是一个中间层&#xff0c;负责连接来自web浏览器或其他HTTP客户程序和[HTTP服务器]上应用程序 Servlet执行下面的任务: 1&#xff09;读取客户发送的显示数据。 2&#xff09;读取由浏览器发送的隐式请求数据。…

NodeJS编写后端接口

技术栈 1.express&#xff1a;Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建 各种 Web 应用&#xff0c;和丰富的 HTTP 工具&#xff0c;使用 Express 可以快速地搭建一个完整功能的网站。 2.mysql&#xff1a;用于操作MySQL数据库 3.bod…

【Java】入门

笔者是在C语言基础上学习java 安装Java的过程中我们可能会见到这样几个东西&#xff0c;JVM、JRE、JDK&#xff0c;那它们的关系是怎样的呢&#xff1f; -JVM Java Virtual Machine 是Java虚拟机&#xff0c;Java程序需要运行在虚拟机上&#xff0c;不同的平台有自己的虚拟机…

【C++】STL — map和set的使用详细介绍

前言 本章将继续学习STL中的两个很重要的容器map和set&#xff0c;其底层实现是封装了一个红黑树&#xff0c;我们通过本节来学习和深入了解一下这两大容器。。。 序列式容器&#xff1a; string 、Vector、List 、dequeue 关联式容器&#xff1a;MAP 、SET、nordered_map、uno…

partially initialized module ‘replicate‘ has no attribute ‘run‘

partially initialized module replicate has no attribute run(most likely due to a circular import) 在包名上停留查看impot 包的地址。 报错原因&#xff1a; 文件重名了&#xff0c;导入了 当前文件 。 修改文件名 即可。

架构设计之学新而知故

缘由 因为一些特殊的机缘&#xff0c;接触到洋葱架构等一些新架构设计概念。 尝试理解了一段时间&#xff0c;就想简单梳理下对它们的理解&#xff0c;以达到学新而知故 &#x1f603; 信息增益 以前计算机专业并不设置通信领域的信息论的专业课程&#xff0c;但是&#xf…

WEB后端复习——javabean与会话cookie、session

JavaBean 是一种符合特定命名约定的 Java 类&#xff0c;它通常用于封装数据。 JavaBean 的主要特点是&#xff1a; 1. 无参构造器&#xff1a;JavaBean 必须有一个公共的&#xff08;public&#xff09;无参构造方法&#xff0c;以便于反射时能够创建对象实例。 2. 属性&…

electron进程间通信

Electron 应用程序的结构非常相似。 作为应用开发者&#xff0c;你将控制两种类型的进程&#xff1a;主进程 和 渲染器进程。 这类似于上文所述的 Chrome 的浏览器和渲染器进程。 主进程 每个 Electron 应用都有一个单一的主进程&#xff0c;作为应用程序的入口点。 主进程在 N…

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

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

【HCIP学习】BGP选路、过滤及属性

一、BGP路由选路原则&#xff08;13条&#xff09; 1、首先丢弃下一跳&#xff08;NEXT_HOP&#xff09;不可达的路由&#xff1b; 2、优选Preferred-value值最大的路由&#xff1b;默认为0&#xff1b; Preferred-value&#xff1a;定义&#xff1a;首选项。 属性值&#…

树莓派点亮FPGA小灯

树莓派点亮FPGA小灯 引言&#xff1a; ​ 本次实验的目的是通过树莓派和FPGA之间的串口通信&#xff0c;控制FPGA开发板上的小灯。实验将展示如何使用树莓派发送特定的字符信号&#xff0c;通过串口传输至FPGA&#xff0c;并在FPGA上实现逻辑解析&#xff0c;以点亮指定的小灯。…

[C#] 使用HttpClient请求https地址报错的解决方案

当使用HttpClient请求HTTPS地址遇到报错时&#xff0c;下面将解析并提供可能的解决方案供参考。 文章目录 异常代码无法定位错误的准确定位错误的 常见错误错误1错误2 解决问题生产环境开发环境 异常代码 首先&#xff0c;需要查看引发异常的代码部分, 无法定位错误的 以下代…

LeetCode 题目 120:三角形最小路径和

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

Linux提权--第三方软件MYSQL数据库提权(WEB+本地)

免责声明:本文仅做技术交流与学习,非法搞事后果自负... 目录 靶场镜像: 过程: 手工: 下载mysql udf poc 进行编译. 进入数据库进行UDF导出 下载(上传) 创建do_system函数调用 探针(./LinEnum.sh),查找suid权限. 配合使用find调用执行 工具: 过程: 外连不上? 隧道出…

矿用光缆型号和规格

管道矿用光缆生产厂家&#xff0c;矿用光缆特点是什么&#xff0c;矿用通信光缆 矿用光缆 MGTS光缆的结构是将250 m光纤套入高模量材料制成的松套管中&#xff0c;松套管内填充防水化合物。缆芯的中心是一根金属加强芯&#xff0c;对于某些芯数的光缆来说&#xff0c;金属加强…