首页 > 其他分享 >VUE3 全局共享数据方案之一 (简单快速实现类似vuex)

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

时间:2022-11-22 23:22:25浏览次数:49  
标签:loading const 登录 state user VUE3 共享 vuex

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

由于vue3的响应式系统本身可以脱离组件而存在,因此可以充分利用这一点,轻松制造多个全局响应式数据, 并且通过和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 style="cursor: pointer;" v-if="!loginUserStore.user" @click="loginEvent"><span>去登录</span></p>
        <p style="cursor: pointer;" 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的全局响应式共享数据

 

 

标签:loading,const,登录,state,user,VUE3,共享,vuex
From: https://www.cnblogs.com/Allen-project/p/16916869.html

相关文章

  • 关于echars在vue3中的使用
    根文件的配置<!--App.vue--><template><router-view></router-view></template><script>import*asechartsfrom'echarts'import{provide}from......
  • CentOS7配置samba共享文件系统
    文章目录​​一、安装软件包​​​​二、修改系统配置​​​​1、关闭SELINUX​​​​2、开通防火墙端口​​​​3、启用smb服务​​​​三、Samba服务的参数文件​​​​四......
  • 1、5分钟带你入门vuex(vuex状态管理)
    如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,那么接......
  • 数据的共享与保护之----标识符的作用域和可见性
    作用域讨论的是标识符的有效范围,可见性讨论的是标识符是否可以被引用.二者相互联系又存在着很大差异.作用域作用域是标识符在程序中有效的区域.分为以下四种:函数原型作用......
  • vue3 封装axios
    1添加一个新的http.js文件封装axios 引入axios //引入Axiosimportaxiosfrom'axios'定义一个根地址//视你自己的接口地址而定varroot2='http://121.4.6......
  • Vue3笔记 - minxin和hook的使用与对比
    minxin和hook的使用与对比目录minxin和hook的使用与对比1.mixin(Vue2)2.hook(Vue3)3.mixin和hook的对比1.mixin(Vue2)mixin可以把多个组件共用的配置提取成一......
  • vue3 路由的使用
    添加一个router.js配置文件import{createRouter,createWebHistory}from'vue-router'createRouter:用来创建路由createWebHistory:url的格式不带#。导入你......
  • Vue3笔记 - Vue3中的计算属性、监视属性和watchEffect函数
    计算属性与监视属性目录计算属性与监视属性1.计算属性2.监视属性3.watchEffect函数1.计算属性Vue3中的计算属性仅在书写方式上与Vue2略有不同,功能上基本一致Vue2......
  • vue3的父子通信
    父组件import{students,studentDel}from"@/api/api.js";//eslint-disable-next-lineno-unused-varsimport{ref,reactive,toRefs,onMounted,useContext,c......
  • 系统架构与设计(7)- Kubernetes 的共享存储
    计算机存储系统由存放程序和数据的各类存储设备及有关的软件构成,是计算机系统的重要组成部分,用于存放程序和数据。存储系统分为内存储器和外存储器,两者按一定的结构,有机地......