正常的思维

做多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。两个组件的内容互不干扰。



看起来客户端路由是利用锚点实现的。

但这无法解决嵌套路由的问题,

比如

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一样呢。

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

条件渲染与查询参数

第二种方式是条件渲染与查询参数。在router配置中使用路由参数+ParentComponent组件中使用条件渲染

  • 首先在路由配置中增加路由参数:standalone
const routes = [
{
path: '/',
component: App,
},
{
path: '/parent',
component: ParentComponent,
children: [
{
path: 'child/:standalone',
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>

其效果如下



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

路由参数提升

但是在子路由上面加路由参数来实现这种控制,意味着父组件下的每一个子路由都要加路由参数。

这不免太繁琐,也不太合理。毕竟这种控制应当是父组件对子组件的控制。

更好的方式是将路由参数提升到父路由上。

const routes = [
{
path: '/',
component: App,
},
{
path: '/parent/:standalone',
component: ParentComponent,
children: [
{
path: 'child',
component: ChildComponent
}
]
}
]

vue-router单页面应用的多标签页使用问题的更多相关文章

  1. 基于Vue的单页面应用的Markdown渲染

    之前渲染 Markdown 的时候, 笔者使用的是 mavonEditor 的预览模式, 使用起来比较爽, 只需要引入组件即可, 但是在最近的开发中, 遇到了困难. 主要问题在于作为单页面应用, 站内 ...

  2. MVC route 和 Angular router 单页面的一些方式

    直接看代码和注释吧 ASP.NET MVC router public class RouteConfig { public static void RegisterRoutes(RouteColle ...

  3. 每天一点产品思考(5):Web端链接跳转在当前页面刷新还是新标签页打开?

    一.与交互设计师的突然撕逼         今天阿白在验收产品的时候,在博客首页打开一篇博文,是在原先的页面进行刷新,而不是新开一个标签页打开.阿白让开发改成在新标签页中打开,但是开发说这是设计师设计 ...

  4. router单页面多个标签tags的用法<router-view></router-view>

    <keep-alive><router-view :key="path" /></keep-alive>

  5. 新手vue构建单页面应用实例

    本人写的小程序,功能还在完善中,欢迎扫一扫提出宝贵意见! 步骤: 1.使用vue-cli创建项目2.使用vue-router实现单页路由3.用vuex管理我们的数据流4.使用vue-resource请 ...

  6. vue等单页面应用优缺点

    优点 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统. 数据驱动 组件化 轻量 简洁 高效 模块友好 页面切换快 缺点 不支持低版本的浏览器 ...

  7. Vue Router实现页面跳转拦截

    场景: 某些页面需要登录之后才可以访问,在页面跳转前做处理,如果要访问的页面A需要登录,则强制调到登录页,并且记录要访问的页面A的链接,在登录成功后自动跳转到页面A 1.在router下的index. ...

  8. vue单页面项目返回上一页无效,链接变化了,但是页面没有变化

    在最近的项目中,返回上一页没有效果,经过好久的排查才发现问题,是路由守卫写法不规范导致. 在项目中用路由守卫做了登录拦截,没登录的跳转到登录页面.页面跳转和拦截都没问题,但是返回上一页就不行了,也没有 ...

  9. vue等单页面应用及其优缺点

    优点: Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统.MVVM.数据驱动.组件化.轻量.简洁.高效.快速.模块友好. 缺点: 不支持低版本 ...

  10. Vue修改单页面背景颜色

随机推荐

  1. Go 编程语言详解:用途、特性、与 Python 和 C++ 的比较

    什么是Go? Go是一个跨平台.开源的编程语言 Go可用于创建高性能应用程序 Go是一种快速.静态类型.编译型语言,感觉上像动态类型.解释型语言 Go由Robert Griesemer.Rob Pik ...

  2. .NET服务发现(Microsoft.Extensions.ServiceDiscovery)集成Consul

    随着Aspire发布preview5的发布,Microsoft.Extensions.ServiceDiscovery随之更新, 服务注册发现这个属于老掉牙的话题解决什么问题就不赘述了,这里主要讲讲M ...

  3. flutter3-macOS桌面端os系统|flutter3.x+window_manager仿mac桌面管理

    原创力作flutter3+getX+window_manager仿Mac桌面系统平台Flutter-MacOS. flutter3_macui基于最新跨端技术flutter3.19+dart3.3+w ...

  4. k8s 深入篇———— docker 镜像是什么[二]

    前言 简单介绍一下docker的镜像. 正文 前面讲到了容器的工作原理了(namespace 限制了时间, cgroup限制了资源),知道docker 历史的也知道,docker 之所以能够称为容器大 ...

  5. redis 简单整理——复制配置[二十二]

    前言 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到 其他机器,满足故障恢复和负载均衡等需求.Redis也是如此,它为我们提 供了复制功能,实现了相同数据的多个Redis副本.复制功能 ...

  6. 重新整理数据结构与算法(c#)——算法套马踏棋算法[三十三]

    前言 马踏棋盘 概念在这,不做过多复述. https://baike.sogou.com/v58959803.htm?fromTitle=马踏棋盘 思路是这样子的,一匹马有上面几种做法,然后进行尝试, ...

  7. 转载(localStorage设置过期时间)

    转载地址:https://blog.csdn.net/zhaoxiang66/article/details/86703438 class Storage{ constructor(name){ th ...

  8. SVN Windows10的安装

    SVN Windows安装与配置 先去到官网的下载链接:Download Apache Subversion Sources 然后点这个 binary packages 在这里能看到大多数的操作系统的 ...

  9. 力扣904(Java)-水果成篮(中等)

    题目: 你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 . 你想要尽可能多地收集水果.然而,农场的主人 ...

  10. 阿里云图数据库GDB V3引擎发布,加速开启“图智”未来

    ​简介:无论是学术界还是产业界,都对图数据库有比较高的预期.Gartner发布的<2021年十大数据和分析技术趋势>中提到:"到2025年图技术在数据和分析创新中的占比将从202 ...