当前位置: 首页 > news >正文

Vue3组件生成唯一标识符方法

在 Vue 3 中实现每次程序运行时生成相同的随机标识符(即刷新页面后标识符保持不变),需要使用持久化存储技术。以下是几种实现方案:

方案 1:使用 localStorage(推荐)

vue

复制

下载

<script setup>
import { ref, onMounted } from 'vue';const uniqueId = ref('');// 生成或读取标识符
const getOrCreateId = () => {const storedId = localStorage.getItem('app_unique_id');if (storedId) return storedId;const newId = 'id-' + Math.random().toString(36).slice(2, 11);localStorage.setItem('app_unique_id', newId);return newId;
};onMounted(() => {uniqueId.value = getOrCreateId();
});
</script><template><div>持久化ID: {{ uniqueId }}</div>
</template>

特点

  1. 使用 localStorage 持久化存储标识符

  2. 首次访问时生成随机 ID 并存储

  3. 后续访问时读取同一 ID

  4. 即使刷新页面、关闭浏览器后重新打开,ID 保持不变


方案 2:使用 Cookies

vue

复制

下载

<script setup>
import { ref, onMounted } from 'vue';const uniqueId = ref('');const getOrCreateCookieId = () => {const cookie = document.cookie.match('(^|;) ?app_id=([^;]*)(;|$)');if (cookie) return cookie[2];const newId = 'id-' + Math.random().toString(36).slice(2, 11);const expires = new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toUTCString();document.cookie = `app_id=${newId}; expires=${expires}; path=/`;return newId;
};onMounted(() => {uniqueId.value = getOrCreateCookieId();
});
</script>

特点

  1. 使用 Cookie 存储标识符

  2. 可设置过期时间(示例中为 1 年)

  3. 适合需要随请求发送到服务器的场景


方案 3:使用 IndexedDB(大量数据场景)

vue

复制

下载

<script setup>
import { ref, onMounted } from 'vue';const uniqueId = ref('');const getIndexedDBId = async () => {return new Promise((resolve) => {const request = indexedDB.open('AppDB', 1);request.onupgradeneeded = (event) => {const db = event.target.result;if (!db.objectStoreNames.contains('metadata')) {db.createObjectStore('metadata');}};request.onsuccess = (event) => {const db = event.target.result;const tx = db.transaction('metadata', 'readwrite');const store = tx.objectStore('metadata');const idRequest = store.get('unique_id');idRequest.onsuccess = (e) => {if (e.target.result) {resolve(e.target.result);} else {const newId = 'id-' + Math.random().toString(36).slice(2, 15);store.put(newId, 'unique_id');resolve(newId);}};};});
};onMounted(async () => {uniqueId.value = await getIndexedDBId();
});
</script>

适用场景

  • 需要存储大量数据

  • 需要更复杂的查询操作

  • 需要更大存储空间(通常 5MB+)


方案 4:基于用户特征的确定性生成(无存储)

vue

复制

下载

<script setup>
import { ref } from 'vue';// 基于浏览器指纹生成确定性ID
const generateDeterministicId = () => {const navigatorStr = JSON.stringify({ua: navigator.userAgent,lang: navigator.languages,plat: navigator.platform});let hash = 0;for (let i = 0; i < navigatorStr.length; i++) {hash = (hash << 5) - hash + navigatorStr.charCodeAt(i);hash |= 0; // 转换为32位整数}return 'uid-' + Math.abs(hash).toString(36).slice(0, 9);
};const uniqueId = ref(generateDeterministicId());
</script>

特点

  1. 不需要任何存储

  2. 基于浏览器指纹生成相同 ID

  3. 注意:不同浏览器/设备会生成不同 ID


方案选择指南

方案持久性跨浏览器数据大小使用场景
localStorage✅ 永久同域名5MB大多数Web应用
Cookies✅ 可设置同域名4KB需要服务器访问
IndexedDB✅ 永久同域名大容量复杂应用
浏览器指纹❌ 临时❌ 不同无限制无需持久化

重要注意事项

  1. 隐私合规:如果存储用户相关标识符,需遵守 GDPR/CCPA 等隐私法规

  2. 清除策略

    javascript

    复制

    下载

    // 清除存储的ID
    localStorage.removeItem('app_unique_id');
    document.cookie = 'app_id=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
  3. SSR 兼容:在服务端渲染时,需检查存储是否可用

    javascript

    复制

    下载

    const isClient = typeof window !== 'undefined';

根据您的具体需求选择最合适的方案,对于大多数 Vue 3 应用,localStorage 方案是最简单可靠的选择。

http://www.xdnf.cn/news/1035073.html

相关文章:

  • 16.vue.js watch()和watchEffect()的对比?(追踪依赖)(3)
  • 华为OD机考-货币单位换算-字符串(JAVA 2025B卷)
  • CMake 构建系统概述
  • LeetCode - 153. 寻找旋转排序数组中的最小值
  • Hive SQL执行流程深度解析:从CLI入口到执行计划生成
  • 计网复习知识(16)传输层及其协议功能
  • 贝塞尔曲线:优雅的数学艺术
  • C# 解析 URL URI 中的参数
  • OpenWrt | 解决NTFS格式的硬盘意外断电之后无法再次挂载的问题
  • 轻量免安装 透明背景图标一键提取,系统文件图标随取随用
  • NGINX 四层共享内存区同步模块实战 `ngx_stream_zone_sync_module`
  • qml显示svg矢量图形
  • FreeRTOS的低功耗Tickless模式
  • RLHF调参实战手册:实用Trick、现象排查与解决思路(持续更新)
  • 动态BGP服务器的用途都有什么?
  • Softhub软件下载站实战开发(二):项目基础框架搭建
  • 萌系盲盒陷维权风暴,Dreams委托David律所已立案,速避雷
  • 历史数据分析——贵州茅台
  • LeetCode[106]从中序和后序遍历序列构造二叉树
  • Sngine 4.0.4海外社交平台PHP源码 – 多语言支持短视频和博客订阅(源码下载)
  • [学习] 多项滤波器在信号插值和抽取中的应用:原理、实现与仿真(完整仿真代码)
  • 使用Three.js创建炫酷的3D玻璃质感动态效果
  • 大小端的区别
  • MiniCPM4端侧AI模型
  • 机器学习算法_支持向量机
  • 图数据库(TuGraph)
  • DataX 框架学习笔记
  • GDI 区域检测与边框宽度的关系
  • 实习记录1
  • ImportError: DLL load failed while importing win32api: 找不到指定的模块