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

news2024/9/20 1:13:09

目录

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.js

import { 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.categorys
    categorys: (state) => state.category.categorys
}
// src/store/modules/category.js

import { 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 中的 key
      key: 'imooc-front',
      // 需要保存的模块
      paths: ['category']
    })
  ]
})

export default store

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

08: 小结

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

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

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

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

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

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

相关文章

【Axure原型分享】动态伸缩组织架构图

今天和大家分享动态伸缩组织架构图图原型模板&#xff0c;我们可以通过点击加减按钮来展开或收起子内容&#xff0c;具体效果可以点击下方视频观看或者打开预览地址来体验 【原型效果】 【Axure高保真原型】动态伸缩组织架构图 【原型预览含下载地址】 https://axhub.im/ax9/…

层次式体系结构概述

1.软件体系结构 软件体系结构可定义为&#xff1a;软件体系结构为软件系统提供了结构、行为和属性的高级抽象&#xff0c;由构成系统的元素描述、这些元素的相互作用、指导元素集成的模式以及这些模式的约束组成。软件体系结构不仅指定了系统的组织结构和拓扑结构&#xff0c;并…

Spark RDD案例:统计网站每月访问量

这个项目利用Spark技术&#xff0c;通过统计网站访问记录中的日期信息&#xff0c;实现了对每月访问量的统计和排序。通过分析数据&#xff0c;我们可以了解到不同月份的网站访问情况&#xff0c;为进一步优化网站内容和推广策略提供数据支持。 使用Spark统计网站每月访问量 …

Android Iptables 客制化方法及基本使用

Android Iptables 客制化方法及基本使用 Android netd 的自定义链NetdConstants.cpp 的 execIptablesRestore 方法IptablesRestoreController 的 execute 方法使用 oem-iptables-init.sh 添加自定义的防火墙规则oem-iptables-init.sh 示例文件 基本概念Iptables 链Iptables 表 …

OpenHarmony 实战开发——使用分布式菜单创建点餐神器

随着社会的进步与发展&#xff0c;科技手段的推陈出新&#xff0c;餐饮行业也在寻求新的突破与变革&#xff0c;手机扫描二维码点餐系统已经成为餐饮行业的未来趋势&#xff0c;发展空间巨大&#xff1b;扫码点餐&#xff0c;是“互联网餐饮”潮流的产物&#xff0c;可以有效地…

k8s-Helm包管理器

这里写目录标题 什么是Helmhelm架构重要概念组件Helm 客户端Helm 库 安装heml使用halm快速部署应用添加 helm 仓库 Helm 的常用命令chart 详解目录结构Redis chart 实践创建StorageClass制备器&#xff0c;配置NFS动态制备修改 helm 源搜索 redis chart修改配置安装查看安装情况…

力扣HOT100 - 152. 乘积最大子数组

解题思路&#xff1a; 方法一&#xff1a;暴力 class Solution {public int maxProduct(int[] nums) {int max Integer.MIN_VALUE;int s 1;for (int i 0; i < nums.length; i) {s 1;for (int j i ; j < nums.length; j) {s * nums[j];max Math.max(max, s);}}ret…

服务器之间实现免密码传输文件(scp免密传输)

问题&#xff1a;需要定时将本服务器的文件传输到指定服务器上作为备份 通过scp实现不同服务器之间的文件传输 正常使用scp传输文件 传输文件命令&#xff1a;scp /data/文件 root服务器地址&#xff1a;/指定目录 传输文件夹命令&#xff1a;scp -r /data/文件 root服务…

【回溯】1255. 得分最高的单词集合

本文涉及知识点 回溯 力扣难道&#xff1a;1881 LeetCode1255. 得分最高的单词集合 你将会得到一份单词表 words&#xff0c;一个字母表 letters &#xff08;可能会有重复字母&#xff09;&#xff0c;以及每个字母对应的得分情况表 score。 请你帮忙计算玩家在单词拼写游戏…

Google I/O盛会省流全内容总结:AI模型家族革新与前沿技术应用的广阔前景

昨晚的Google I/O 发布会主要聚焦于AI模型和应用的更新与扩展&#xff0c;特别在生成模型领域取得了显著进步。以下是模型层面内容的简要总结&#xff1a; DeepMind官网链接&#xff1a;https://deepmind.google/ Google Veo官方&#xff1a;https://deepmind.google/technol…

小程序框架是智能融媒体平台构建的最佳线路

过去5年&#xff0c;媒体行业一直都在进行着信息化建设向融媒体平台建设的转变。一些融媒体的建设演变总结如下&#xff1a; 新闻终端的端侧内容矩阵建设&#xff0c;如App新闻端&#xff0c;社交平台上的官方媒体等新闻本地生活双旗舰客户端&#xff0c;兼顾主流媒体核心宣传…

幻兽帕鲁Palworld服务器手动+docker部署方法+备份迁移

目录 帕鲁部署官方文档帕鲁手动安装法手动安装steamcmd通过steamcmd安装帕鲁后端 docker容器一键部署幻兽帕鲁绿联云NAS机器部署幻兽帕鲁客户端连接附录1&#xff1a;PalServer.sh的启动项附录2&#xff1a;配置文件游戏存档保存和迁移 关于阿里云计算巢 帕鲁部署官方文档 htt…

监控 Apache Web 服务器性能指标

Apache Web 服务器以其可靠性、灵活性和强大的功能而闻名&#xff0c;几十年来一直是互联网的支柱&#xff0c;从小型个人博客到大型电子商务平台&#xff0c;Apache 的多功能性使其能够轻松处理各种 Web 应用程序。 Apache 的 Web 服务器是如何工作的 尽管 Web 服务器涉及复…

Audio Hijack for Mac 激活版:音频录制与处理软件

Audio Hijack for Mac&#xff0c;让您的音频创作更加高效、便捷。它支持多种音频格式的录制和导出&#xff0c;包括MP3、AAC、WAV等&#xff0c;让您的音频作品具有更广泛的兼容性。同时&#xff0c;软件界面简洁明了&#xff0c;操作流畅自然&#xff0c;即使您是初学者也能快…

5.2 操作系统安装必备知识

目前操作系统安装方式接近于全自动化&#xff0c;用户无需做过多操作就能完成操作系统安装。但是操作系统安装也有其复杂的一面&#xff0c;例如固件及分区表的不同就会导致操作系统安装失败。本节主要介绍系统安装的一些必备知识。 5.2.1 BIOS 概述 BIOS(Basic Input/Output …

【运维自动化-配置平台】如何自动应用主机属性

主要用于配置主机属性的自动应用。当主机发生模块转移或模块新加入主机时&#xff0c;会根据目标模块配置的策略自动触发修改主机属性&#xff0c;比如主机负责人、主机状态。主机属性自动应用顾名思义是应用到主机上&#xff0c;而主机是必须在模块下的&#xff0c;所以有两种…

武汉星起航:中国卖家借力亚马逊跨境电商平台,拓展全球销售市场

随着互联网技术的飞速发展&#xff0c;跨境电商已成为连接全球消费者与卖家的重要桥梁。作为全球领先的跨境电商平台&#xff0c;亚马逊凭借其强大的品牌影响力、丰富的商品资源和高效的物流体系&#xff0c;为全球消费者提供了一个便捷、安全的购物环境。在这个平台上&#xf…

Google Chrome 设备工具栏原理

1.不同预览模式 2.计算出缩放比 3.固定滚动偏移 关键代码&#xff1a; overview&#xff1a; ratioW getChildRect().width / getParentRect().width ratioH getChildRect().height / getParentRect().height maxRatio max(ratioW, ratioH) if(maxRatio < 1) return 1 …

【UE5.1 角色练习】02-添加慢走、快速跑、蹲伏功能

目录 前言 步骤 一、慢走 二、快速跑 三、蹲伏 前言 在上一篇文章基础上&#xff08;【UE5.1 角色练习】01-使用小白人蓝图控制商城角色移动&#xff09;继续实现角色的慢走、快速跑以及蹲伏功能 步骤 一、慢走 1. 打开项目设置&#xff0c;添加一个操作映射&#x…

六西格玛管理培训对企业有哪些实际帮助?

当下&#xff0c;企业要想脱颖而出&#xff0c;不仅要有创新思维和敏锐的市场洞察力&#xff0c;更要有高效的管理体系和严谨的质量控制手段。而六西格玛管理培训正是这样一项能够帮助企业实现提质增效、提升竞争力的关键举措。那么&#xff0c;六西格玛管理培训对企业究竟有哪…