vue3回到上一个路由页面

这篇具有很好参考价值的文章主要介绍了vue3回到上一个路由页面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习链接

Vue Router获取当前页面由哪个路由跳转
在Vue3的setup中如何使用this

vue3回到上一个路由页面文章来源地址https://www.toymoban.com/news/detail-448571.html

  • beforeRouteEnter 在这个路由方法中不能访问到组件实例this,但是可以使用next里面的vm访问到组件实例,并通过vm.$data获取组件实例上的data数据
  • getCurrentInstance 是vue3提供的获取组件实例的方法,可通过getCurrentInstance函数获取了当前组件实例对象,并通过instance.data.message和instance.ctx.sayHello访问了组件实例的数据和方法
<template>
    <div class="main-box">
        <div class="title">菜单权限</div>
        <div class="role-menu-box" v-loading="dataLoading">
            <div class="role-menu-header">
                <el-form inline :model="roleInfo" ref="roleInfoRef" :rules="roleInfoRules" label-width="80px">
                    <el-form-item label="角色名称" prop="roleName">
                        <el-input v-model="roleInfo.roleName"></el-input>
                    </el-form-item>
                    <el-form-item label="角色标识" prop="roleLabel">
                        <el-input v-model="roleInfo.roleLabel"></el-input>
                    </el-form-item>
                </el-form>
            </div>
            <div class="role-menu-body">
                <el-scrollbar>
                    <el-tree :props="defaultProps" node-key="id" :expand-on-click-node="false" check-on-click-node
                        default-expand-all ref="menuTreeRef" show-checkbox :data="roleMenuTreeData">
                    </el-tree>
                </el-scrollbar>
            </div>
            <div class="role-menu-footer">
                <el-button @click="goBack">返回</el-button>
                <el-button type="primary" @click="saveRoleMenu">保存</el-button>
            </div>
        </div>
    </div>
</template>
<script>
import msgBoxer from '@/utils/msgBoxer'
export default {
    // name: 'roleMenu', // 这个组件不应该被缓存下来, 因此需要让 路由名称 与 组件名称不一致
    data() {
        return {
            formerRoute: {},
            isSaved: false
        }
    },
    // 在进入路由的时候, 记录进入之前的路由
    beforeRouteEnter(to, from, next) {
        next(vm => {
            // 通过 `vm` 访问组件实例
            let { query, params, path } = from
            vm.$data.formerRoute = { query, params, path }  // 没有this, 只能通过vm去访问组件实例上的数据
        })
    },

}
</script>
<script setup>
import { ref, reactive, onMounted, nextTick, getCurrentInstance } from 'vue'
import { getRoleMenuByRoleId as getRoleMenuByRoleIdApi, saveRoleMenu as saveRoleMenuApi } from '@/api/roleApi'
import { useRoute, useRouter, onBeforeRouteLeave } from 'vue-router'
import Messager from '@/utils/messager'

// 使用tagsViewStore
import useTagsView from '@/store/tagsView'
const tagsViewStore = useTagsView()

const dataLoading = ref(false)

// 获取组件实例
const instance = getCurrentInstance()

// 使用路由
const route = useRoute()
const router = useRouter()

const defaultProps = {
    label: 'title',
    children: 'children'
}

// 角色信息
let roleInfo = ref({})

// 菜单树ref
const menuTreeRef = ref(null)

// 菜单树数据
let roleMenuTreeData = ref([])

const roleInfoRules = {
    roleName: [
        { required: true, message: '角色名称不能为空', trigger: 'blur' }
    ],
    roleLabel: [
        { required: true, message: '角色标识不能为空', trigger: 'blur' }
    ]
}

function getRoleMenuByRoleId() {
    console.log(route);
    getRoleMenuByRoleIdApi(route.params.roleId).then(({ roleId, roleName, roleLabel, menuIdList, roleMenuTreeDTOList }) => {
        roleInfo.value = { roleId, roleName, roleLabel, menuIdList }
        roleMenuTreeData.value = roleMenuTreeDTOList
        // window.menuTreeRef = menuTreeRef
        nextTick(()=>{
            menuIdList.forEach(menuId=>{
                menuTreeRef.value.setChecked(menuId, true, false)
            })
        })
    })
}
onMounted(() => {
    getRoleMenuByRoleId()
})

function saveRoleMenu() {
    // 这里要注意下顺序, 半选的要在前面, 选中状态的要在后面
    // (半选状态对于后台权限来说是有意义的, 若子节点被选中, 那么该子节点的所有父节点都应该要有)
    let menuIdList = [...menuTreeRef.value.getHalfCheckedKeys(), ...menuTreeRef.value.getCheckedKeys(false) ]
    saveRoleMenuApi({ ...roleInfo.value, menuIdList }).then(res => {
        Messager.ok('保存成功')
        instance.data.isSaved = true // 记录保存, 通过instance访问组件实例上data配置项的数据
        router.push({ ...instance.data.formerRoute }) // 回到之前的路由去
    })
}

function goBack() {
    instance.data.isSaved = true // 记录保存, 通过instance访问组件实例上data配置项的数据
    if(instance.data.formerRoute.path) {
        router.push({ ...instance.data.formerRoute })
    } else {
        router.push('/sys/role')
    }
}

/* 在路由离开之前, 判断是否是点击保存值后离开的, 
  如果不是点击保存后离开的, 就弹框问是不是要离开, 
  如果确定是, 就离开, 并关闭页签, 如果不是, 就取消离开, */
onBeforeRouteLeave((to, from, next)=> {
    // console.log('beforeRouteLeave');
    if (!instance.data.isSaved) {
        msgBoxer.confirm('您确定要离开当前页面么?').then(res => {
            next()
            // 关闭当前页签
            tagsViewStore.closeSpecifiedTag({name: route.name})
        }).catch(err => {
            next(false)
        })
    } else {
        next()
        // 关闭当前页签
        tagsViewStore.closeSpecifiedTag({name: route.name})
    }

})

console.log('setup...');
</script>

<style lang="scss" scoped></style>

到了这里,关于vue3回到上一个路由页面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3配置路由(vue-router)

    紧接上篇文章,vue3的配置与vue2是有所差别的,本文就讲述了如何配置,如果本文对你有所帮助请三连支持博主。 下面案例可供参考 使用npm命令进行安装 : npm install vue-router@4 完成后我们打开项目根目录下的 package.json 文件: 如下即为成功 这里创建 view目录,然后在view目录

    2023年04月12日
    浏览(43)
  • Vue3 中路由Vue Router 的使用

    在编写vue里的SPA(Single Page Application单页面应用)时,我们始终绕不开路由的使用,vue-router4.0版里有一些重要更新,在这里分享给大家。 vue-router是vue.js官方给出的路由解决方案,能够轻松的管理SPA项目中组件的切换 Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让

    2024年02月02日
    浏览(26)
  • vue3+ts:安装路由(router)

           1.安装vue-router         vue3需要安装4.0以上版本         vue2最好安装4.0以下版本         安装命令:         安装完成后,在package.json中查看vue-router是否安装成功   src目录下新建一个router文件夹,在router文件夹里新建一个index.ts文件,代码如下: main.ts中代码

    2024年02月06日
    浏览(35)
  • Vue3的vue-router路由详解

    这篇文章是接着【三分钟快速搭建Vue3+webpack项目】的内容做的开发,有基础的可以跳过 【三分钟快速搭建Vue3+webpack项目】,直接看以下的内容。 Vue3的vue-router路由详解: 首先安装路由依赖模块: 所需代码文件如下图: 图1   所需要的主要文件: index.html、index.js、App.vue in

    2024年02月01日
    浏览(47)
  • Vue3/ Vue3内 Vue-router Vue3路由 完整配置流程

    (1). yarn add vue-router (2) 创建 router/index.js 文件 (3) improt 引入 createRouter improt { createRouter  }  from \\\'vue-router (4) 调用 createRouter 并定义变量名  cosnt router = createRouter()  (5) export default 导出 router  export default router  (6) createRouter() 内添加对象 并定义 history    history: createMemoryHistory()

    2023年04月08日
    浏览(66)
  • vue3+axios+router实现页面跳转及登录

    本篇文章主要是,使用 vite 创建一个vue3 书籍商城的小型案例,项目中主要运用到路由router及接口axios等知识点。 1.开始搭建项目框架,使用vite来构建项目 2.由于vite构建的项目中需要自己手动下载路由以及创建路由文件夹,所以在创建好的项目文档中找到src文件夹,在src文件

    2024年02月04日
    浏览(39)
  • Vue3——getCurrentInstance、页面中route和router的获取方式

    getCurrentInstance() 在vue2中,可以通过this来获取组件实例,但是在vue3的setup函数中,无法通过this获取到组件实例,在setup函数中this的值是undefined,但是vue3提供了getCurrentInstance()来获取组件的实例对象; 输出结果:  可以看出,getCurrentInstance是一个方法,getCurrentInstance()是一个对

    2024年02月15日
    浏览(29)
  • vue3中使用router路由实现跳转传参

    大家好,今天和大家分享一下vue3中如何进行跳转并进行传参。 vue3取消了vue2部分api,所以路由跳转和传值的方式会有所不同。 我们今天主要讲router.push(location, onComplete?, onAbort?) vue3中新增API:useRouter和useRoute 1.首先在需要跳转的页面引入API—useRouter 2.在跳转页面定义router变量

    2023年04月09日
    浏览(31)
  • vue通过router地址传参跳转同一路由页面,页面不刷新的解决办法

    vue、 vue-router@4 记录一下最近遇到的vue路由页面间的跳转的问题,其中就涉及到了不同路由的跳转(/a/b1 = /a/b2)、相同路由不同参数间的跳转(/a/b?c=1 = /a/b?c=2)、相同页面锚点跳转(/a/b#id1 =/a/b#id2) 原因:渲染的是同一组件 解决:可以在不刷新的页面通过监听route,重新加载

    2024年02月04日
    浏览(51)
  • 【vue3】13-前端路由-Vue-Router的详解: 从入门到掌握

    路由其实是网络工程中的一个术语: 在 架构一个网络 时,非常重要的两个设备就是 路由器和交换机 。 当然,目前在我们生活中 路由器 也是越来越被大家所熟知,因为我们生活中都会用到 路由器 : 事实上, 路由器 主要维护的是一个 映射表 ; 映射表 会决定数据的流向; 路由

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包