在 UniApp 项目开发中,随着功能的增加,本地存储(如 uni.setStorageSync)的使用频率也会增加。如果直接在代码中硬编码 key 值,不仅容易出错,也难以后期维护。

本文将以“自定义导航栏适配状态栏高度”为例,带你实现一个更优雅、更易维护的本地存储 key 管理方式 —— 使用常量统一管理 key 值,提升代码的可读性和可维护性。


一、问题:硬编码 key 值的弊端

在之前的代码中,我们是这样存储状态栏高度的:

uni.setStorageSync('GM_STATUS_BAR_HEIGHT', result.statusBarHeight)

这种方式虽然可以实现功能,但存在以下问题:

  • 拼写错误风险高:比如写成 'GM_STATUS_BAR_HEIGHTD',难以发现;
  • 不易维护:如果后续要修改 key 名,需要全局搜索替换;
  • 缺乏统一管理:多个 key 分散在不同文件中,维护成本高。

二、解决方案:使用常量集中管理 key

我们可以创建一个常量文件,集中管理所有本地存储的 key,例如:

✅ 创建常量文件:constant/index.uts

export const GM_STATUS_BAR_HEIGHT = 'GM_STATUS_BAR_HEIGHT'

推荐使用 constant 或 storageKeys 等命名方式作为目录名,统一管理所有本地存储的 key。


三、修改 App.vue:使用常量进行存储

在 App.vue 的 onLaunch 生命周期中,我们引入常量并使用它进行本地存储:

import { GM_STATUS_BAR_HEIGHT } from '@/constant/index.uts'export default {onLaunch() {uni.getSystemInfo({success: (result) => {uni.setStorageSync(GM_STATUS_BAR_HEIGHT, result.statusBarHeight)}})}
}

✅ 这样做的好处是:

  • key 值统一管理,避免重复或拼写错误;
  • 后期维护只需修改常量文件,无需逐个查找代码;
  • 提升代码可读性,其他开发者更容易理解。

四、页面中使用常量读取 key

在需要读取状态栏高度的页面中,同样引入常量并使用它读取本地存储:

import { GM_STATUS_BAR_HEIGHT } from '@/constant/index.uts'export default {data() {return {statusHeight: 0}},onLoad() {uni.getStorage({key: GM_STATUS_BAR_HEIGHT,success: (res) => {this.statusHeight = res.data}})}
}

这样,页面和 App.vue 使用的是同一个 key 常量,确保数据一致性。


五、进阶建议:扩展常量管理更多 key

随着项目功能的增加,你可能会用到更多本地存储的 key,例如:

export const GM_STATUS_BAR_HEIGHT = 'GM_STATUS_BAR_HEIGHT'
export const GM_USER_TOKEN = 'GM_USER_TOKEN'
export const GM_USER_INFO = 'GM_USER_INFO'
export const GM_APP_VERSION = 'GM_APP_VERSION'

这样你就可以在项目中统一使用这些常量,避免 key 的重复和混乱。


六、额外优化:封装本地存储工具类(可选)

为了进一步提升可维护性,你还可以封装一个本地存储工具类,统一处理读写逻辑:

✅ 示例:utils/storage.uts

import { GM_STATUS_BAR_HEIGHT } from '@/constant/index.uts'const get = (key: string): any => {const res = uni.getStorageSync(key)return res
}const set = (key: string, value: any): void => {uni.setStorageSync(key, value)
}export default {get,set,GM_STATUS_BAR_HEIGHT
}

然后在页面中使用:

import storage from '@/utils/storage.uts'export default {onLoad() {const height = storage.get(storage.GM_STATUS_BAR_HEIGHT)this.statusHeight = height}
}

这样,不仅 key 统一管理,读写逻辑也统一封装,后期维护更加轻松。


七、总结

通过本文的讲解,我们实现了:

  • 将本地存储的 key 值统一管理为常量;
  • 在 App.vue 和页面中统一使用常量,避免硬编码;
  • 提高了代码的可读性、可维护性和可扩展性;
  • 可选地封装了本地存储工具类,实现更优雅的代码结构。

在实际项目中,这种“常量集中管理 + 工具封装”的方式,能显著提升开发效率,降低维护成本。


📌 小贴士:

  • 常量命名建议使用大写加下划线格式(如 GM_STATUS_BAR_HEIGHT);
  • key 建议加上项目前缀(如 GM_),避免与第三方插件冲突;
  • 所有常量建议统一放在 constant 或 constants 目录中;
  • 可进一步结合 TypeScript 接口或枚举,增强类型安全。

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏或分享给需要的朋友!也欢迎关注我的技术博客,获取更多 UniApp 开发实战技巧。🚀

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

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

相关文章

计算机网络:(八)网络层(中)IP层转发分组的过程与网际控制报文协议 ICMP

计算机网络:(八)网络层(中)IP层转发分组的过程与网际控制报文协议 ICMP前言一、IP层转发分组的过程第一步:接收数据包并解封装第二步:提取目标 IP 地址第三步:查询路由表第四步&…

Python爬虫实战:研究concurrent-futures库相关技术

1. 引言 1.1 研究背景与意义 网络爬虫作为互联网数据采集的重要工具,在信息检索、舆情分析、学术研究等领域具有广泛应用。随着互联网数据量的爆炸式增长,传统单线程爬虫的效率已难以满足需求,并发爬虫技术成为研究热点。 1.2 相关工作 现有爬虫框架如 Scrapy、Beautifu…

Neo4j 框架 初步简单使用(基础增删改查)

Neo4j 是一个高性能的、开源的图数据库。它将数据存储为图结构,其中节点表示实体,边表示实体之间的关系。这种图数据模型非常适合处理复杂的关系型数据,能够高效地进行关系查询和遍历。 Neo4j 的主要特性包括: 强大的图查询语言 C…

【iOS】锁[特殊字符]

文章目录前言1️⃣什么是锁🔒?1.1 基本概念1.2 锁的分类2️⃣OC 中的常用锁2.1 OSSpinLock(已弃用):“自旋锁”的经典代表为什么尽量在开发中不使用自旋锁自旋锁的本质缺陷:忙等待(Busy Waiting…

在easyui中如何设置自带的弹窗,有输入框

这个就是带input的确认弹框($.messager.prompt)// 使用prompt并添加placeholder提示 $.messager.prompt(确认, 确定要将事故记录标记为 statusText 吗?, function(r) {if (r) {// r 包含用户输入的内容var remark r.trim();// 验证输入不为…

Android-API调用学习总结

一、Postman检查API接口是否支持1.“HTTP Request” 来创建一个新的请求。——请求构建界面,这是你进行所有 API 调用的地方。2.设置请求方法和 URL:选择请求方法: 在 URL 输入框左侧,有一个下拉菜单。点击它,选择你想…

《计算机网络》实验报告一 常用网络命令

目 录 1、实验目的 2、实验环境 3、实验内容 3.1 ping基本用法 3.2 ifconfig/ipconfig基本用法 3.3 traceroute/tracert基本用法 3.4 arp基本用法 3.5 netstat基本用法 4、实验结果与分析 4.1 ping命令的基本用法 4.2 ifconfig/ipconfig命令的基本用法 4.3 tracer…

MySQL深度理解-深入理解MySQL索引底层数据结构与算法

1.引言在项目中会遇到各种各样的慢查询的问题,对于千万级的表,如果使用比较笨的查询方式,查询一条SQL可能需要几秒甚至几十秒,如果将索引设置的比较合理,可以将查询变得仍然非常快。2.索引的本质索引:帮助M…

Django母婴商城项目实践(九)- 商品列表页模块

9、商品列表页模块 1、业务逻辑 商品模块分为:商品列表页 和 商品详情页 商品列表页将所有商品按照一定的规则排序展示,用于可以从销量、价格、上架时间和收藏数量设置商品的排序方式,并且在商品左侧设置分类列表,选择某一个分类可以筛选出对应的商品信息。 商品列表页…

8、STM32每个系列的区别

1、F1和F4的系列的区别 F1采用Crotex M3内核,F4采用Crotex M4内核。F4比F1的主频高。F4具有浮点数运算单元,F1没有浮点单元。F4的具备增强的DSP指令集。F407的执行16位DSP指令的时间只有F1的30%~70%。F4执行32位DSP指令的时间只有F1的25% ~ 60%。F1内部S…

DeepSPV:一种从2D超声图像中估算3D脾脏体积的深度学习流程|文献速递-医学影像算法文献分享

Title题目DeepSPV: A deep learning pipeline for 3D spleen volume estimation from 2Dultrasound imagesDeepSPV:一种从2D超声图像中估算3D脾脏体积的深度学习流程01文献速递介绍1.1 临床背景 脾肿大指脾脏增大,是多种潜在疾病的重要临床指标&#x…

病历数智化3分钟:AI重构医院数据价值链

一、方案概述本方案针对某省医联体医院病例数据管理需求,通过AI技术实现病历数字化→信息结构化→数据应用化的全流程改造。系统采用双端协同架构: - 普通用户端:为一线医护人员提供病历拍摄、AI识别修正、安全上传功能 - 管理员后台&#…

CSS+JavaScript 禁用浏览器复制功能的几种方法

🛡️ 禁用浏览器复制功能完整指南 网页中禁用用户的复制功能,包括 CSS 方法、JavaScript 方法、综合解决方案以及实际应用场景。适用于需要保护内容版权、防止恶意爬取或提升用户体验的场景。 📋 目录 🚀 快速开始&#x1f3a8…

Java 虚拟线程在高并发微服务中的实战经验分享

Java 虚拟线程在高并发微服务中的实战经验分享 虚拟线程(Virtual Threads)作为Java 19引入的预览特性,为我们在高并发微服务场景下提供了一种更轻量、易用的并发模型。本文结合真实生产环境,讲述在Spring Boot微服务中引入和使用虚…

《拆解WebRTC:NAT穿透的探测逻辑与中继方案》

WebRTC以其无需插件的便捷性,成为连接全球用户的隐形桥梁。但很少有人知晓,每一次流畅的视频对话背后,都藏着一场与网络边界的无声博弈——NAT,这个为缓解IPv4地址枯竭而生的技术,既是网络安全的屏障,也是端…

前端开发 React 组件优化

1. 使用 React.memo 进行组件优化问题:当父组件重新渲染时,子组件也会重新渲染,即使它的 props 没有变化。解决方案:使用 React.memo 包裹子组件,让其只在 props 变化时才重新渲染。示例场景:展示一个显示计…

变频器实习DAY12

目录变频器实习DAY12一、继续,柔性平台测试!上午 王工Modbus新功能测试下午 柔性平台继续按照说明书再测一遍附加的小知识点中国狸花猫.git文件附学习参考网址欢迎大家有问题评论交流 (* ^ ω ^)变频器实习DAY12 一、继续,柔性平台测试&…

Redis--多路复用

🧩 一、什么是“客户端连接”?所谓 客户端连接 Redis,指的是:一个程序(客户端)通过网络连接到 Redis 服务端(比如 127.0.0.1:6379),建立一个 TCP 连接,双方可…

数组——初识数据结构

一维数组数组的创建数组是一种相同类型元素的集合数组的创建方式C99 中引入了变长数组的概念,变长数组支持数组的大小使用变量来指定明显这里的vs2019不支持变长数组数组初始化和不完全初始化第二个数组就是典型的不完全初始化,开辟了10个空间&#xff0…

技术速递|使用 Semantic Kernel 与 A2A 协议构建多智能体解决方案

作者:卢建晖 - 微软高级云技术布道师 翻译/排版:Alan Wang 在快速发展的 AI 应用开发领域,能够协调多个智能体已成为构建复杂企业级解决方案的关键。虽然单个 AI 智能体擅长特定任务,但复杂的业务场景往往需要跨平台、跨框架甚至跨…