记一次单一原则的带来的感悟

需求越是简单,或者灵活越是要特别注意

代码中的,单一原则经常遇到,但是都没怎么好好记录过,这次刚好又遇到了,顺便写下,案例比较简单

背景

小程序有个菜单页面和首页(都是tabbar页面),产品希望可以根据首页的图片的跳转链接,让他跳转到菜单页面,并且根据携带的id参数,自动选中对应菜单项,如下图所示:

核心代码是都实现了,目前主要是实现:菜单页面根据query里的id参数,实现菜单项高亮

前期思考

首先先思考输入环节,这个链接格式是什么,应该有什么参数,根据产品要求,那么这个链接就需要:[菜单路径] [id参数],比如:

链接格式:pages/index/index?id=1

然后思考,页面该怎么做,很明显,在进入页面时就去获取query参数,根据query参数里的id,变更选中菜单项的id,从而实现对应菜单项高亮

思考改进

由于小程序tabar页面无法携带参数,所以无法在onLoad环节获取query参数

那么我的做法就是,选择storage,缓存下这个query

具体过程更改为

  1. 链接携带cache参数,进行标识:pages/index/index?id=1&cache=1
  2. 跳转时判断链接是否有cache参数,缓存数据
  3. 菜单页面获取缓存数据,进行赋值

重点

这里主要讲讲第2步缓存query的逻辑,因为我设计的第2步有问题,这样就导致第3步有问题

旧版设计

以下核心代码

js 复制代码
const page = 'menu'
const query = getQuery()
if (query.cache) {
    const pageStorage = wx.getStorageSync(page) || {};
    wx.setStorageSync(page, { ...pageStorage, cacheQuery: query });
}

这部分设计,其实是把每个页面名page),看成一个缓存对象,里面有query缓存,也有页面里的缓存

这其实不太对,因为我们只需要关心页面里的query缓存数据即可,而不是关心页面里其他的缓存数据

这步错了,就会导致第三步也会错误,所以需要优化

新版设计

js 复制代码
if (query.cache) {
  const queryCache = wx.getStorageSync('queryCache') || {}; // 所有query的cache集合,同步获取
  queryCache[page] = query; // 对当前page进行赋值query
  wx.setStorageSync('queryCache', queryCache); // 同步设置query缓存
}

新版设计思路,定义一个大的query缓存对象,keyqueryCache,里面数据为每个页面的query缓存

page为页面名,比如index,通过page名进行隔离其他页面的query缓存数据

这样就只需要考虑链接上带来的query缓存,而不用考虑其他地方注入的缓存,职责更加清晰

总结

核心就是这些,因为前后设计设计思路不一致,实现起来就不一样,一个是缓存页面里的数据,一个只缓存链接上的参数

案例还是比较简单,就是个人设计有点小问题

相关推荐
合作小小程序员小小店2 分钟前
web开发,在线%农业产品销售管理%系统,基于idea,html,css,vue.js,layui,java,jdk,ssm
java·前端·jdk·intellij-idea·layui·数据库管理员
flypwn2 小时前
TFCCTF 2025 WebLess题解
服务器·前端·数据库
b***74882 小时前
前端CSS预处理器对比,Sass与Less
前端·css·sass
lsp程序员0104 小时前
使用 Web Workers 提升前端性能:让 JavaScript 不再阻塞 UI
java·前端·javascript·ui
J***Q2925 小时前
前端路由,React Router
前端·react.js·前端框架
1***81535 小时前
前端路由参数传递,React与Vue实现
前端·vue.js·react.js
q***13615 小时前
十七:Spring Boot依赖 (2)-- spring-boot-starter-web 依赖详解
前端·spring boot·后端
xixixi777776 小时前
了解一下Sentry(一个开源的实时错误监控平台)
前端·安全·开源·安全威胁分析·监控·sentry
Keely402857 小时前
学习编写chrome插件:Hello World 扩展
前端·chrome