首页 > 其他分享 >vue-router单页面应用的多标签页使用问题

vue-router单页面应用的多标签页使用问题

时间:2024-05-09 21:56:28浏览次数:17  
标签:vue parent standalone component path router 路由 页面

正常的思维

做多vue页面应用,我们的第一反应是配置多个入口点,多个vue应用,编译成多个HTML文件,由服务器来决定路由。这是正常的思维。
但谁知道单页面应用也能做到类似的效果呢。单页面不过是服务器路由变成了客户端路由,但通过一些技巧,也能实现类似服务器多页面路由的效果。

客户端路由多页面的实现方式

我以vue-router举例

多个根路由

最简单的多页面应用,是设置多个根路由。这样在新标签页打开不同的根路由,就相当于多页面应用。
只是实际上,这些不同的标签页还是同一个vue应用。不过是呈现了不同的组件罢了,网络请求的js资源还是一样。
比如这种

const router = new VueRouter({
  routes: [
    {
      path: '/parent',
      component: ParentComponent,
    },
    {
      path: 'standalone-child',
      component: ChildComponent
    }
  ]
})

可以在两个标签页打开,http://5234/#/parenthttp://5234/#/standalone-child。两个组件的内容互不干扰。
image
image

看起来客户端路由是利用锚点实现的。
但这无法解决嵌套路由的问题,
比如

const router = new VueRouter({
  routes: [
    {
      path: '/parent',
      component: ParentComponent,
      children: [
        {
          path: 'child',
          component: ChildComponent
        }
      ]
    },
    {
      path: '/standalone-child',
      component: ChildComponent
    }
  ]
});

我们访问http://5234/#/parent/child居然会把http://5234/#/parent路由的ParentComponent组件的内容显示出来。
ChildComponent看起来似乎就像一个iframe一样呢。
image

虽然有时也需要这种效果,但有时也需要这个“iframe”独立显示。我们需要这种控制权。

条件渲染与查询参数

实现的方式是在router配置中使用路由参数+ParentComponent组件中使用条件渲染

  • 首先在路由配置中增加路由参数:standalone
const routes = [
    {
        path: '/',
        component: App,
    },
    {
        path: '/parent',
        component: ParentComponent,
        children: [
            {
                path: 'child/:standalone',
                component: ChildComponent
            }
        ]
    },
    {
        path: '/standalone-child',
        component: ChildComponent
    }
  ]
  • 修改父组件
    我们在父组件中根据standalone取条件渲染。当standalone='standalone'时,就只渲染router-view,否则就使用“iframe”的方式。
<template v-if="$route.params.standalone!='standalone'">
    <h1>parent</h1>
    <router-view></router-view>
</template>
<template v-else>
    <router-view></router-view>
</template>

其效果如下
image

image
好处是实现了“iframe”和独立标签页两种形态,缺点是路径变长了

标签:vue,parent,standalone,component,path,router,路由,页面
From: https://www.cnblogs.com/ggtc/p/18181088

相关文章

  • Vue入门到关门之Vue3学习
    一、常用API注意:本文项目均使用脚手架为Vite1、setup函数(1)介绍如果在项目中使用配置项API,那么写起来就和vue2的写法是一样的;但是如果在项目中写的是组合式API,那么组件中所用到的:数据、方法等等,均要配置在setup中。此外,setup()钩子也是在组件中使用组合式API的入口,通常只在......
  • Vue3——Vue Router
    安装vue-router依赖包npminstallvue-router@4创建router文件夹,然后在里面创建一个index.ts文件,用于定义你的路由配置//index.tsimport{createRouter,createWebHashHistory}from"vue-router";import{routes}from"./routes";//创建一个路由实例co......
  • Vue入门到关门之Vue2高级用法
    一、在vue项目中使用ref属性ref属性是Vue.js中用于获取对DOM元素或组件实例的引用的属性。通过在普通标签上或组件上添加ref属性,我们可以在JavaScript代码中使用this.$refs.xxx来访问对应的DOM元素或组件实例。放在普通标签上,通过this.$refs.名字---》取到的是do......
  • Vue入门到关门之Vue3项目创建
    一、vue3介绍1、为什么要学习vue3?vue3的变化:首先vue3完全兼容vue2,但是vue3不建议用vue2的写法;其次,vue3拥抱TypeScript,之前vue2使用的JavaScript,ts完全兼容js最后之前学的vue2是配置项api,而vue3是组合式apioptionsAPI(旧)=>compositionAPI(新),效果:代码组织更方便了,逻辑......
  • 高度自适应iframe(Vue3)
    https://juejin.cn/post/7283306395913617427<scriptsetup>import{ref,onBeforeUnmount}from'vue'defineProps({srcdoc:{type:String,default:''}})constiframe=ref()constsetIframeHeight=(......
  • springboot+vue项目
    1MyBatisPlus的分页插件是怎么生效的?体现在哪里?PaginationInnerInterceptor是通过拦截数据库操作来实现分页功能的。 MyBatisPlus的分页插件PaginationInnerInterceptor是通过拦截数据库操作来实现分页功能的。它的工作原理如下:配置分页插件:在你的SpringBoot应用......
  • 批量删除WordPress文章和页面的数据库命令和从后台直接删除
    批量删除wordpress的方法有两种:1.从wp后台可以调整展示:最多999条2.选择“Bulk”--“Apply”  通过批量删除wordpress文章和页面的数据库命令的步骤:备份数据库:在执行任何数据库操作之前,务必备份您的数据库以防万一。进入数据库:使用您的数据库管理工具(例如phpMyAdmin)登......
  • 页面布局
    页面布局常见单位绝对实验性元素cap盒子模型:四个边界:content,padding,border,margincontentarea控制属性:height,width,min-height,max-height,min-width,max-widthpaddingarea控制属性:padding-top,padding-right,padding-bottom,padding-left和简写属性pad......
  • 解决 node-gyp 错误问题|node与python版本不匹配报错|node-gyp|vue
    项目要用到node-gyp(给爷爬)mac上没问题windows有问题看上面的日志,提到了python2.7看来这个模块用的上古时代的python2.7的技术windows的同学可以先安装python2这里下载:https://www.python.org/ftp/python/2.7/python-2.7.amd64.msi不要修改路径!!不要修改路径!!等......
  • 关于vue3中使用echarts设置tooltip的type为axis不显示的问题
    因为vue3中的数据对象是用的proxy监听的,要取值需要用value等方法取出来,解决方法:使用markRaw让echarts从监听对象变成普通对象!在Vue3中,markRaw是一个用于告诉Vue的响应性系统不要对某个对象进行转换或追踪其响应性的函数。当你有一个对象,并且你确定你不需要它成为响应性......