首页IT科技vue2 vue3共存(VUE3 全局共享数据方案之一 global state (简单快速实现类似vuex))

vue2 vue3共存(VUE3 全局共享数据方案之一 global state (简单快速实现类似vuex))

时间2025-09-11 17:31:00分类IT科技浏览8064
导读:自定义 封装单列模式! global state 并且通过和vuex一样 通过某个模块指定方法修改数据,不能直接修改数据,并且让数据成为全局响应式...

自定义 封装单列模式! global state

并且通过和vuex一样 通过某个模块指定方法修改数据                  ,不能直接修改数据                          ,并且让数据成为全局响应式
并且在代码体积上绝对的轻量级!比市面上的任何第三方共享数据插件都要轻量                  。

1.创建一个js           ,diy-vuex.js 名字自己定义 我为了模拟共享数据 和vuex相似所以叫这个

2.第二步封装 我们的共享数据模块

diy-vuex.js

// 模拟ajax api接口使用 const userSery = { // 登录接口 login: (name,age) =>{ // 接口返回用户数据 储存在本地 return new Promise((resolve,reject)=>{ setTimeout(()=>{ let user = { name :name, age:age } window.sessionStorage.setItem(user,JSON.stringify(user)) console.log(登录成功) resolve(user) },1000) }) }, // 退出登录 loginOut:()=>{ return new Promise((resolve,reject)=>{ setTimeout(()=>{ window.sessionStorage.removeItem(user) resolve(退出成功) },1000) }) }, // 恢复登录 whoAmI:()=>{ // 读取本地储存的用户数据 return new Promise((resolve,reject)=>{ setTimeout(()=>{ let user = window.sessionStorage.getItem(user); if(user){ user = JSON.parse(user); console.log(恢复成功,user) resolve(user); } else { reject(恢复失败); }; },1000) }) } } import { reactive,readonly } from vue // 创建默认的全局单列响应式数据              ,仅供改模块内部使用 const state = reactive({user:null,loading:false}); // 对外保留的数据只能读取                         ,不能修改 // 也可以进一步使用toRefs进行封装               ,从而避免解构或展开后响应式丢失 export const loginUserStore = readonly(state); // 登录 export async function login (loginId,loginPwd){ state.loading = true const user = await userSery.login(loginId,loginPwd); state.user = user; state.loading = false } // 退出 export async function loginOut (){ state.loading = true await userSery.loginOut(); state.user = null; state.loading = false } // 恢复登录状态 export async function whoAmI (){ state.loading = true try { const user = await userSery.whoAmI(); state.user = user; state.loading = false } catch (e) { state.user = null; } state.loading = false }

3.页面调用我们的封装模块

因为js文件只会加载一次          ,并且在去读取是有缓存的                          。

<template> diyVuex<br/> <div> <span >{{loginUserStore.loading?加载中...:}}</span> <p v-if="!loginUserStore.user" @click="loginEvent"><span>去登录</span></p> <p v-else-if="loginUserStore.user" @click="loginOutEvent"><span>退出登录</span></p> <div v-if="loginUserStore.user"> <span>用户:{{loginUserStore.user.name}}</span><br/> <span>年龄:{{loginUserStore.user.age}}</span> </div> </div> </template> <script setup> import { login,loginUserStore,loginOut ,whoAmI} from ../store/diy-vuex.js const router = useRouter(); // 点击 登录 const loginEvent = ()=>{ login(allen,18) }; // 退出登录 const loginOutEvent = ()=>{ loginOut() }; // 恢复登录 whoAmI(); </script> <style scoped> </style>

点击登录 页面最后这样

注意:当我们登录成功了 保存了数据 跳转到其他页面的时候 其他页面需要读取和修改的时候                         ,一样的引入这个模块就可以使用了                   ,并且数据是随时更新的     ,实现了类似vuex的全局响应式共享数据                          ,

也就是说上一个页面修改了 这个模块的state数据                       ,其他任何地方展示或读取到的就是最后一次修改的state数据          。

最后优化建议:以上只是一个最基本的结构是这样的,当我们在中大型项目中 全部数据内容和函数写一个文件肯定不行的 建议模块化导入                      ,像vuex一样 一个index.js 其他分模块合并在 一个index.js中

声明:本站所有文章                           ,如无特殊说明或标注     ,均为本站原创发布              。任何个人或组织                  ,在未征得本站同意时                          ,禁止复制                  、盗用                            、采集        、发布本站内容到任何网站             、书籍等各类媒体平台                         。如若本站内容侵犯了原著者的合法权益          ,可联系我们进行处理               。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
python自动化运维快速入门(python自动化运维怎么连接) 如何利用论坛提升SEO效果?(论坛带给我们的SEO优势)