VUE中,跳转页面之前判断并显示弹框组件

VUE中,跳转页面之前判断并显示弹框组件。
涉及到路由守卫、数据交互。有空我在完善,先直接给出代码
代码使用了 element plus、vuex

案例代码

路由文件

import { createRouter, createWebHistory } from 'vue-router';
import CommonEntry from '@/views/CommonEntry.vue';
import Home from '@/views/mobile/HomeView.vue';
import MainLayout from '@/views/mobile/MainLayout.vue';
import User from '@/views/mobile/UserView.vue';
import {useStore} from "vuex";const routes = [{path: '/',name: 'commonEntry',component: CommonEntry,},{path: '/m/',name: 'homeMobile',component: MainLayout,children: [{path: '',name: 'home',component: Home,},{path: 'user',name: 'user',component: User,meta: { requiresAuth: true }}]}
];const router = createRouter({history: createWebHistory(process.env.BASE_URL),routes,
});// 这里是关键
router.beforeEach((to, from, next) => {const store = useStore();if (to.matched.some(record => record.meta.requiresAuth && !store.getters['user/isAuthenticated'])) {if( from.name === undefined ) {  // 用户通过连接直接访问跳转到首页next('/');} else {// 保存需要跳转的路由信息localStorage.setItem('wantedRoute', JSON.stringify({path: to.path, query: to.query, hash: to.hash}));// 显示登陆组件store.dispatch('authDialog/toggleLoginDialog', true);// 不进行下一步路由的跳转,由登陆组件中再次进行路由跳转next(false);}} else {next();}
});export default router;

父组件MainLayout.vue

<template><div><router-view /><FooterNav @showLogin="showLoginDialog" @showRegister="showRegisterDialog" /><LoginDialog v-model:dialogVisible="isLoginDialogVisible" @update:dialogVisible="handleLoginDialogVisibilityChange" /><RegisterDialog v-model:dialogVisible="isRegisterDialogVisible" @update:dialogVisible="handleRegisterDialogVisibilityChange" /></div>
</template><script>
import FooterNav from './FooterNav.vue';
import LoginDialog from '@/components/LoginDialog.vue';
import RegisterDialog from '@/components/RegisterDialog.vue';
import { mapActions, mapGetters } from 'vuex';export default {components: {FooterNav,LoginDialog,RegisterDialog,},computed: {// 从 Vuex 获取登录和注册对话框的显示状态...mapGetters('authDialog', ['isLoginDialogVisible', 'isRegisterDialogVisible']),},methods: {// 使用 Vuex Actions 来切换对话框的显示状态...mapActions('authDialog', ['toggleLoginDialog', 'toggleRegisterDialog']),// 处理登录对话框的可见性变化handleLoginDialogVisibilityChange(value) {this.toggleLoginDialog(value);},// 处理注册对话框的可见性变化handleRegisterDialogVisibilityChange(value) {this.toggleRegisterDialog(value);},// 显示登录对话框showLoginDialog() {this.toggleLoginDialog(true);},// 显示注册对话框showRegisterDialog() {this.toggleRegisterDialog(true);},},
};
</script>

登陆组件LoginDialog.vue

<template><el-dialog :title=" $t('login') " v-model="localDialogVisible" :close-on-click-modal="false" class="login-dialog-box"><el-form ref="loginForm" :model="loginForm" label-position="top" :rules="rules">            <el-form-item style="margin-bottom: 0"><el-button type="primary" class="login-button" @click="handleLogin">{{ $t('login') }}</el-button></el-form-item><el-form-item class="login-link-item-container" style="margin-top: 12px"><a href="#" class="register-account">{{ $t('freeTrial') }}</a><a href="#" class="register-account">{{ $t('registerAccount') }}</a></el-form-item></el-form></el-dialog>
</template><script>
import httpService from '@/service/httpService';
import { ElMessage } from "element-plus";export default {props: {// 父组件向子组件传递的数据dialogVisible: Boolean},computed: {// 这里进行父子通讯,告诉父组件,登陆对话框的状态localDialogVisible: {get() {return this.dialogVisible;},set(value) {this.$emit('update:dialogVisible', value);}}},data() {return {loginForm: {account: 'admin',password: '123456',rememberMe: true,}};},methods: {async handleLogin() {await this.$refs.loginForm.validate(async (valid) => {if(valid) {await this.preventMultipleSubmissions(async () => {try {const response = await httpService.post('/login', {account: this.loginForm.account,password: this.loginForm.password,});const token = response.data.token;const userInfo = response.data.user;localStorage.setItem('token', token);if (this.loginForm.rememberMe) {localStorage.setItem('token', token);localStorage.setItem('rememberMe', 'true');} else {sessionStorage.setItem('token', token);localStorage.removeItem('rememberMe');}this.$store.dispatch('user/updateUserInfo', userInfo);this.localDialogVisible = false;const wantedRouteStr = localStorage.getItem('wantedRoute');const wantedRoute = wantedRouteStr ? JSON.parse(wantedRouteStr) : null;if (wantedRoute && wantedRoute.path) {localStorage.removeItem('wantedRoute');this.$router.push({ path: wantedRoute.path, query: wantedRoute.query, hash: wantedRoute.hash });}} catch (error) {ElMessage({showClose: true, message: error.message, type: 'error', duration: 5000});}});}});},},created() {const rememberMe = localStorage.getItem('rememberMe');if (rememberMe === 'true') {this.loginForm.rememberMe = true;}},
};
</script>

利用uex来保存登陆状态 store.js

import {createStore} from "vuex";
import authDialog from './authDialog';export default createStore({modules: {authDialog}
});

authDialog.js

const state = {isLoginDialogVisible: false,  // 登录对话框显示状态isRegisterDialogVisible: false,  // 注册对话框显示状态
};const mutations = {setLoginDialogVisibility(state, visibility) {state.isLoginDialogVisible = visibility;},setRegisterDialogVisibility(state, visibility) {  // 控制注册对话框的显示状态state.isRegisterDialogVisible = visibility;},
};const actions = {toggleLoginDialog({ commit }, visibility) {commit('setLoginDialogVisibility', visibility);},toggleRegisterDialog({ commit }, visibility) {  // 切换注册对话框的显隐commit('setRegisterDialogVisibility', visibility);},
};const getters = {isLoginDialogVisible: (state) => state.isLoginDialogVisible,isRegisterDialogVisible: (state) => state.isRegisterDialogVisible,  // 获取注册对话框的显示状态
};export default {namespaced: true,state,mutations,actions,getters,
};

全局方法:globalMixin.js

export default {data() {return {isSubmitting: false};},methods: {// 防止重复点击async preventMultipleSubmissions(action) {if (this.isSubmitting) {this.$message({showClose: true,message: this.$t('pleaseWait'),type: 'warning'});return;}this.isSubmitting = true;try {await action();} catch (error) {this.$message({showClose: true,message: this.$t('operatorError'),type: 'warning'});} finally {this.isSubmitting = false;}},// 登陆状态检查isAuthenticated() {return this.$store.state.user.userInfo !== null;}}
};

关键代码解释

让我来逐一解释你的问题:

问题 1: useStore 的作用和 store.dispatch 的使用

  1. useStore: 在 Vue 3 和 Vuex 4 中,useStore 是一个 Composition API 的方法,用于在组件内部访问 Vuex store。这是一种新的模式,用于取代在 Vue 2 中使用 this.$store 的方式。useStore 主要用于 setup 函数或其他 Composition API 函数中。

  2. 为什么不能直接通过方法名调用: Vuex 的 actionsmutations 需要通过 store 的 dispatchcommit 方法来调用,以保持状态管理的一致性和可追踪性。这是 Vuex 的设计哲学之一,旨在通过集中式存储管理应用的所有状态,并遵循特定的规则来更改状态。

  3. store.dispatch: 用于触发 Vuex store 中的 actionsactions 是可以包含任意异步操作的方法。在这个例子中,store.dispatch('authDialog/toggleLoginDialog', true) 会触发 authDialog 模块中的 toggleLoginDialog action,并传入 true 作为参数。

问题 2: commit 的作用和 mapActionsmapGetters 的使用

  1. commit: 在 Vuex 中,commit 用于触发 mutationsmutations 是同步函数,用于更改 Vuex store 中的状态。在这个例子中,commit('setLoginDialogVisibility', visibility) 会触发 setLoginDialogVisibility mutation,并传入 visibility 作为参数。

  2. ...mapActions...mapGetters: 这两个函数是 Vuex 提供的辅助函数,用于将 Vuex 的 actionsgetters 映射到组件的 methodscomputed 属性中。... 是 JavaScript 的展开运算符,用于将数组或对象展开到另一个数组或对象中。在这个例子中,...mapActions('authDialog', ['toggleLoginDialog', 'toggleRegisterDialog'])authDialog 模块的 toggleLoginDialogtoggleRegisterDialog actions 映射到组件的方法中,而 ...mapGetters 类似地将 getters 映射到计算属性中。

问题 3: @update: 的作用和 $emit 的使用

  1. @update:: 是 Vue 中的一个事件监听修饰符,用于监听子组件触发的更新事件。在这个例子中,@update:dialogVisible="handleLoginDialogVisibilityChange" 监听 LoginDialog 组件触发的 update:dialogVisible 事件,并调用 handleLoginDialogVisibilityChange 方法来响应该事件。

  2. this.$emit: 在 Vue 组件中,this.$emit 用于子组件向父组件发送事件。this.$emit('update:dialogVisible', value) 就是 LoginDialogRegisterDialog 组件向父组件发送 update:dialogVisible 事件,并传递 value 作为参数。

  3. 父子数据交互: 是的,@update: 修饰符和 this.$emit 一起工作,实现了父子组件之间的数据交互。子组件通过 $emit 发出事件,父组件通过监听这些事件来响应变化。

这种模式是 Vue 组件间通信的常用方法之一,有助于保持数据的单向流动,从而使得状态管理更加清晰和可维护。

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

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

相关文章

取消Vscode在输入符号时自动补全

取消Vscode在输入符号时自动补全 取消Vscode在输入符号时自动补全问题演示解决方法 取消Vscode在输入符号时自动补全 问题演示 在此状态下输入/会直接自动补全, 如下图 笔者想要达到的效果为可以正常输入/而不进行补全, 如下图 解决方法 在设置->文本编辑器->建议, 取消…

以太网的 MAC 层

目录 1. MAC 层的硬件地址 48 位的 MAC 地址 2. MAC 帧的格式 以太网 V2 的 MAC 帧格式 无效的 MAC 帧 IEEE 802.3 MAC 与以太网 V2 MAC 帧格式的区别 1. MAC 层的硬件地址 硬件地址又称为物理地址&#xff0c;或 MAC 地址。 IEEE 802 标准为局域网规定了一种 48 位…

Acwing801二进制中1的个数

题目 给定一个长度为 n 的数列&#xff0c;请你求出数列中每个数的二进制表示中 11 的个数。 输入格式: 第一行包含整数 n 第二行包含 n 个整数&#xff0c;表示整个数列。 输出格式: 共一行&#xff0c;包含 n 个整数&#xff0c;其中的第 i 个数表示数列中的第 i 个数的…

HTML你要知道哪些语法?

表格 表格的主要作用 1.表格主要用于显示、展示数据&#xff0c;因为它可以让数据显示的非常的规整&#xff0c;可读性非常好。特别是后台展示数据的时候&#xff0c;能够熟练运用表格就显得很重要。一个清爽简约的表格能够把繁杂的数据表现得很有条理 2.表格不是用来布局页…

【Kafka】高级特性:主题

目录 主题的管理创建主题查看主题修改主题删除主题 增加分区分区副本的分配必要参数配置KafkaAdminClient应用功能操作示例 主题的管理 使用kafka-topics.sh脚本。 下面是使用脚本的一些选项 选项说明–config <String: namevalue>为创建的或修改的主题指定配置信息。…

C语言常见面试题:什么是枚举,枚举的作用是什么?

枚举是一种特殊的数据类型&#xff0c;它是一组具命名的整型常量的集合。枚举的作用如下&#xff1a; 限制用户不能随意赋值&#xff1a;枚举类型可以限制用户只能使用定义时列举的值进行赋值&#xff0c;而不能随意赋值。这样可以增加代码的可读性和可维护性。方便管理公共的…

[题单练习] 大模拟题

看完题后不知所措 P1058 [NOIP2008 普及组] 立体图 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 简单来说&#xff0c;题目要我们按照输入&#xff0c;把立体图画出来&#xff0c;先放张图来震撼一下 看题解&#xff0c;题解的思路如下&#xff1a; 1. 先把一个积木块存入…

栈和队列的动态实现(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

图像与二进制数据间的转换

概述 此文档主要是记录图像与二进制互相转换的方法&#xff0c;此文档记录于20220811 进行图片和二进制的互相转换 若想转为base64&#xff0c;可以看 图像与base64互转 的内容。 Python 资料&#xff1a;python 图片和二进制转换的三种方式_脸不大的CVer的博客-CSDN博客_p…

统计学-R语言-7.3

文章目录 前言总体方差的检验一个总体方差的检验两个总体方差比的检验 非参数检验总体分布的检验正态性检验的图示法Shapiro-Wilk和K-S正态性检验总体位置参数的检验 练习 前言 本篇文章继续对总体方差的检验进行介绍。 总体方差的检验 一个总体方差的检验 在生产和生活的许多…

1 月 26日算法练习

文章目录 九宫幻方穿越雷区走迷宫 九宫幻方 小明最近在教邻居家的小朋友小学奥数&#xff0c;而最近正好讲述到了三阶幻方这个部分&#xff0c;三阶幻方指的是将1~9不重复的填入一个33的矩阵当中&#xff0c;使得每一行、每一列和每一条对角线的和都是相同的。 三阶幻方又被称…

IS-IS:07 ISIS缺省路由

IS-IS 有两种缺省路由&#xff0c;第一种缺省路由是由 level-1 路由器在特定条件下自动产生的&#xff0c;它的下一跳是离它最近的 &#xff08;cost 最小&#xff09;level-1-2路由器。第二种缺省路由是 IS-IS 路由器上使用 default-route-advertise 命令产生并发布的。 本次实…

第十七讲_HarmonyOS应用开发Stage模型应用组件

HarmonyOS应用开发Stage模型应用组件 1. 应用级配置2. Module级配置3. Stage模型的组件3.1 AbilityStage3.1.1 AbilityStage的创建和配置3.1.2 AbilityStage的生命周期回调3.1.3 AbilityStage的事件回调&#xff1a; 3.2 UIAbility3.2.1 UIAbility生命周期3.2.3 UIAbility启动模…

CSAPP fall2015 深入理解计算机系统 Cache lab详解

Cache Lab cache lab 缓存实验 代码下载 从CSAPP上面下载对应的lab代码 http://csapp.cs.cmu.edu/3e/labs.html 环境准备 需要安装 valgrind。可以参考文章Valgrind centos。 安装好以后执行valgrind --version可以看到版本号。 Cache simulator cache simulator not a …

ART: Automatic multi-step reasoning and tool-use for large language models 导读

ART: Automatic multi-step reasoning and tool-use for large language models 本文介绍了一种名为“自动推理和工具使用&#xff08;ART&#xff09;”的新框架&#xff0c;用于解决大型语言模型&#xff08;LLM&#xff09;在处理复杂任务时需要手动编写程序的问题。该框架可…

【音视频原理】音频编解码原理 ③ ( 音频 比特率 / 码率 | 音频 帧 / 帧长 | 音频 帧 采样排列方式 - 交错模式 和 非交错模式 )

文章目录 一、音频 比特率 / 码率1、音频 比特率2、音频 比特率 案例3、音频 码率4、音频 码率相关因素5、常见的 音频 码率6、视频码率 - 仅做参考 二、音频 帧 / 帧长1、音频帧2、音频 帧长度 三、音频 帧 采样排列方式 - 交错模式 和 非交错模式1、交错模式2、非交错模式 一…

排序问题上机考试刷题

排序与查找可以说是计算机领域最经典的问题&#xff0c;排序和查找问题在考研机试真题中经常出现。排序考点在历年机试考点中分布广泛。排序既是考生必须掌握的基本算法&#xff0c;又是考生 学习其他大部分算法的前提和基础。首先学习对基本类型的排序。对基本类型排序&#x…

【C++中的STL】函数对象

函数对象 函数对象概念谓词概念 内建函数对象算术仿函数关系仿函数逻辑仿函数&#xff08;基本用不到&#xff09; 函数对象概念 重载函数调用操作符的类&#xff0c;其对象常称为函数对象&#xff0c;函数对象使用重载的()时。行为类似函数调用&#xff0c;也叫仿函数。 函数…

分析crash日志

每一天都要快乐的进步~~ 文章目录 在分析 crash 日志时&#xff0c;通常需要关注以下信息&#xff1a; 1️⃣ 错误信息&#xff1a;了解 crash 的具体错误信息&#xff0c;这有助于定位问题的根源所在。 2️⃣ 堆栈跟踪&#xff1a;查看堆栈跟踪&#xff0c;确定 crash 发生的…

4.F1 评分机器学习模型性能的常用的评估指标

F1评分作为机器学习领域中的一个综合性评价指标&#xff0c;旨在在准确率和召回率之间寻求平衡&#xff0c;进而提供对模型性能全面评估的手段。本文将深入探讨F1评分的定义、计算方法、应用领域、案例研究以及未来发展方向&#xff0c;力求为读者提供详实而全面的了解。 一.F…