「Vue|网页开发|前端开发」02 从单页面到多页面网站:使用路由实现网站多个页面的展示和跳转

本文主要介绍如何使用路由控制来实现将一个单页面网站扩展成多页面网站,包括页面扩展的逻辑,vue的官方路由vue-router的基本用法以及扩展用法

文章目录

  • 本系列前文传送门
  • 一、场景说明
  • 二、基本的页面扩展
    • 页面扩展是在扩什么
    • 创建新页面的代码,让页面内容变化起来
    • 对地址栏的地址格式进行一个优化
  • 三、避免页面频繁重新加载的路由用法
    • `<router-view/>`的作用
    • `<router-link>`标签
    • `<router-link>`标签作用
  • 四、路由用法扩展:更多定制化的路由配置场景
    • 动态路由实现详情页展示
  • 五、控制路由跳转的API

本系列前文传送门

  • 「Vue|网页开发|前端开发」01 快速入门:快速写一个Vue的HelloWorld项目

一、场景说明

我们在进行网站开发的时候,大多数都是需要有多个页面展示不同内容或者提供不同功能。每个页面单独启动一个项目的做法不太现实,实际业务中是一个项目中,一个页面对应项目代码中一个代码文件,然后通过浏览器地址的不同后缀(比如/home, /about, /prodcut, /center等等)来对应到不同的代码文件,进而在浏览器上展示不同的内容和提供不同的功能。

二、基本的页面扩展

页面扩展是在扩什么

在前文介绍如何快速开始一个项目时,我们已经探索到了页面渲染的逻辑,即:

  • 浏览器根据地址栏输入的地址,会得到一个path
  • 我们在代码里指明某个path对应某个component
  • 我们在component编写我们要展示的内容和功能

就完成了从代码到浏览器内容的关联和渲染展示。

当我们要跳转到一个新的页面的时候,一般地址栏的地址会跟随着变化,会有一个新的地址,即会有一个新的path
所以,当我们要增加一个新的页面的时候,其实就是新增一个从代码到浏览器地址的关联关系。即,在src/router/index.js

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'Vue.use(Router)export default new Router({routes: [{path: '/',name: 'HelloWorld',component: HelloWorld}]
})

改成

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'Vue.use(Router)export default new Router({routes: [{path: '/',name: 'HelloWorld',component: HelloWorld},{path: '/about',name: 'About',component: HelloWorld }]
})

这里我们在routes的值中增加了一个元素,即增加了一个从浏览器地址后缀/about关联到代码HelloWorld的关联关系,只不过我们这里关联的代码没有额外写,而是直接再次用了HelloWorld页面的代码。

现在我们的项目就有两个页面了,可以分别通过浏览器地址栏输入http://localhost:8080/#/http://localhost:8080/#/about来访问两个页面。

由于我们使用了同样的代码来展示两个页面,所以看到的页面内容其实是一样的。打个比方说,如果我们的项目现在是一本两页的书,那么这两页的内容是一样的。

可以确定的是,我们现在确实是两个页面,而不是一个页面。如果需要验证这一点,可以把我们刚才的代码改动先注释掉或者删掉,然后直接访问http://localhost:8080/#/about,可以看到页面的内容其实跟HelloWorld页面内容不一样,而是下面的仅有一个logo图片的页面:
在这里插入图片描述

创建新页面的代码,让页面内容变化起来

现在我们需要编写一个新的代码来对应路径/about,使得浏览器展示我们想展示的内容。因为我们的代码是由框架生成的标准化代码,所以这件事变得很简单,我们可以这样操作:

  • 直接复制一份HelloWorld.vue代码副本
  • 然后将副本命名为About.vue
  • src/router/index.js中导入About
  • 再将路径/about对应的代码从HelloWorld改成About

这样我们就完成了两个路径对应两个页面,两个页面用的是不同代码。然后我们修改About.vue里面的内容,让我们可以直观地从浏览器展示的内容观察到这一点。
进入App.vue,然后修改底下msg变量的值

export default {name: 'HelloWorld',data () {return {msg: 'Hello Vue World!'}}
}

改成

export default {name: 'HelloWorld',data () {return {msg: 'About Vue World!'}}
}

保存后,重新打开浏览器可以看到我们/about对应的页面内容已经发生变化:
在这里插入图片描述

至此,我们就完成了网站页面从单页面网站升级成多页面网站的过程~ (●ˇ∀ˇ●)

对地址栏的地址格式进行一个优化

我们可以看到我们的两个页面的地址栏输入是http://localhost:8080/#/http://localhost:8080/#/about,所以我们目前的地址栏格式是http://localhost:8080/#/XXXXX

这种格式其实我们在日常浏览其他网站的时候并不常见,更常见的格式是http://localhost:8080/about,也就是我们可以优化一下地址格式,尝试将#/从地址中移除。

要实现这一点我们只需要在src/router/index.js中,在创建router实例的时候,指定一个mode参数,如下:

export default new Router({mode: "history",routes: [{path: '/',name: 'HelloWorld',component: HelloWorld},{path: '/about',name: 'About',component: About}]
})

重新打开浏览器,就可以看到地址格式已经是我们希望的样子了:
在这里插入图片描述

三、避免页面频繁重新加载的路由用法

到这里,我们可以做一个回顾,我们在给一个网站"安装路由器"的时候都做了哪些事情?

  • 首先我们使用了vue的官方路由包vue-router,这个包在一开始初始化项目时通过命令行提示选择了Yes完成了安装。如果不是这样,则需要通过npm install vue-router进行安装。
  • 然后我们出于文件结构清晰的考虑,会有一个router文件夹,文件夹下是router的入口index.js(框架初始化时已经自动生成)。
  • router/index.js中生成了路由器Router实例,其中指定了浏览器地址(path)到代码(component)的关联关系,由此完成了引导浏览器根据地址栏输入的地址将项目中对应的代码渲染到浏览器中进行展示的工作。
  • 然后我们去扩展地址(path)跟代码(component)的关联关系来增加网站能够展示的页面数量。

至此我们接触了vue路由相关的概念:

  • 官方路由包:vue-router
  • 路由文件入口:src/router/index.js
  • 生成的路由器实例:Router()
  • 在项目应用中导入路由src/main.js[line:10] new Vue(el, router, components, template)
  • 在页面中使用路由:src/App.vue[line:4] <router-view/>

<router-view/>的作用

<router-view>就是在页面渲染的时候,通过地址栏的path在我们指定的路径 -> 代码的关联关系中找到需要渲染的代码,然后将代码的内容替换到<router-view>的位置上。通过这一点我们可以进一步理解我们目前看到的页面内容:

  • 我们在HelloWorld中定义了一些文本和一些超链接,所以渲染时<router-view>会替换成这些文本和超链接,于是我们便看到浏览器中的内容。
    在这里插入图片描述
  • 当我们输入一个在路径 -> 代码关联关系中没有指定的路径,比如/nothing,我们会看到文本和链接都不见了,取而代之的是一片空白,就可以理解成<router-view>没有找到要替换的代码,就是空,于是<router-view>的位置就是一片空白。
    在这里插入图片描述
  • /nothing页面中,虽然文本和超链接不见了,但是logo图片还在,我们去看这个logo图片代码的位置就可以知道,这是因为logo图片代码是在<router-view>上方单独的代码,而不是它去替换的内容,所以每个页面都能看到logo图片。

<router-link>标签

除了<router-view>标签之外,如果去看官网文档或者其他资料,一般会提到另一个标签叫做<router-link>

<router-link>其实就是替代原生的HTML超链接标签<a>存在的,写法如下:

<router-link to="/">Go to Home</router-link>
<router-link to="/about">Go to About</router-link>

<router-link>标签作用

<router-link> text <router-link/>当然不只是给<a> text </a>的另一种写法,必然是还有其他好处才会出现。

所以它的好处就是能够使得vue-router可以在不重新加载页面的情况下更改 URL,处理 URL 的生成以及编码。减少页面的重新加载就可以提高网站的性能和用户在浏览和跳转过程中的体验,这才是我们去用<router-link>代替<a>所希望得到的。

四、路由用法扩展:更多定制化的路由配置场景

动态路由实现详情页展示

我们在实际开发过程中,一个页面展示的内容布局是不变的,只是页面的数据不同而已,比如:

  • 博客网站的博文详情页
  • 电商网站的商品详情页
  • 视频网站的视频播放页

关于详情页这种只是数据变化的页面,我们的实现方法一般是拿到数据之后将数据展示到对应的位置上。至于数据可以是在页面跳转前将数据传入,常见于我们说的MVC架构中;也可以是从网页请求中获取对应的数据参数,然后进行数据请求得到数据,常见于前后端分离的架构。

如果我们是从网页请求中获取的数据参数,则我们可以常见到如下两种请求方式:

  • 参数作为url请求传入:http://localhost:8080/user?user_id=1
  • restful的方式,作为路由的一部分,由路由逻辑按照指定模式去匹配获取:http://localhost:8080/user/1

如果要实现http://localhost:8080/user/1这种方式,我们可以可以使用vue-router的动态路由参数,将router的配置修改如下:

export default new Router({mode: "history",routes: [{// 动态字段以冒号开始path: '/user/:id',name: 'UserDetail',component: UserDetail}
})

除此之外,还有一些其他的常见用法:

  • 不同路径指向相同页面:

    • 比如//home(甚至/index)都指向HomePage
    • { path: '/', component: Homepage, alias: '/home' }
    • { path: '/', component: Homepage, alias: ['/home', '/index'] }
  • 嵌套路由:

    • 只替换某些部分的内容,公共内容不变,减少重复代码
    • /user/:id/profile:显示用户个人信息
    • /user/:id/posts :显示用户发布的文章
routes: [{path: '/user/:id',component: User,children: [{// 当 /user/:id/profile 匹配成功// UserProfile 将被渲染到 User 的 <router-view> 内部path: '/profile',component: UserProfile},{// 当 /user/:id/posts 匹配成功// UserPosts 将被渲染到 User 的 <router-view> 内部path: '/posts',component: UserPosts},],},
]
  • 懒加载:
    • 只有当路由被访问的时候才加载对应组件
    • 防止页面加载过慢以及构建应用时打包的js包过大
    • 不是懒加载的写法:import HelloWorld from '@/components/HelloWorld'
    • 懒加载写法一:const HelloWorld = ()=>import('@/components/HelloWorld')
    • 懒加载写法二(异步):{ path: '/', name: 'HelloWorld', component: resolve => require(['@/components/HelloWorld'], resolve) }

五、控制路由跳转的API

我们也可以通过在组件中调用Router API来实现路由的跳转、回退等功能。

  • 跳转到其他页面:

    • API写法:this.$router.push('/about')
    • 等价于<router-link>形式:<router-link :to="/about">跳转到About</router-link>
    • 等价URL: /about
  • 带参数跳转:

    • this.$router.push({ path: '/search', query: { keyword: 'vue' } })
    • 等价URL:/search?keyword=vue
  • 获取参数:this.$route.query.keyword // 得到值:vue

  • 带锚点hash(#)跳转:

    • router.push({ path: '/about', hash: '#team' })
    • 等价URL:/about#team
  • 使用params跳转

    • 可以让参数不显示在URL上,防止一些信息泄露
    • this.$router.push({ name: 'user', params: { username: 'aki' } })
  • 获取params:this.$router.params.username // 得到值: aki

  • 返回上一页:this.$router.go(-1)

  • 后退两页:this.$router.go(-2)

掌握了以上内容基本就可以解决实际业务开发中的大部分场景,第四部分的API不需要记忆,只需要记住可以通过编写代码逻辑的形式来控制路由即可。

快去试试搭建自己的多页面网站吧~

写文不易,如果对你有帮助的话,来一波点赞、收藏、关注吧~👇

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

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

相关文章

无涯教程-分类算法 - 简介

分类可以定义为根据观测值或给定数据点预测类别的过程。分类的输出可以采用"黑色"或"白色"或"垃圾邮件"或"非垃圾邮件"的形式。 在数学上&#xff0c;分类是从输入变量(X)到输出变量(Y)近似映射函数(f)的任务&#xff0c;它属于有监督…

【视觉SLAM入门】6.1. (基于直接法的视觉里程计)LK光流法,代码解读, 直接法,特征点法对比,稀疏,半稠密,稠密地图

"刺卵掷地&#xff0c;逐蝇弃笔" 0. 数据集1. 光流法(Optical Flow)1.1. 光流1.2. LK光流法1.3 关键代码&#xff1a;1.4 特点 2. 直接法(Direct Methods)2.1 分类比较2.2 优缺点 前置事项&#xff1a; 特征点耗时&#xff0c;丢弃有用信息&#xff0c;特征缺失&…

【uniapp】this有时为啥打印的是undefined?(箭头函数修改this)

&#x1f609;博主&#xff1a;初映CY的前说(前端领域) ,&#x1f4d2;本文核心&#xff1a;uniapp中this指向问题 前言&#xff1a;this大家知道是我们当前项目的实例&#xff0c;我们可以在这个this上面拿到我们原型上的全部数据。这个常用在我们在方法中调用其他方法使用。 …

Git分支机制

一、分支机制简述 要想真正理解Git的分支机制&#xff0c;我们要首先回过头来看一下Git是如何存储数据的。 Git并没有采用多个变更集( changeset )或是差异的方式存储数据&#xff0c;而是采用一系列快照的方式。当你发起提交时&#xff0c;Git存储的是提交对象( commi…

文件上传漏洞之条件竞争

这里拿upload-labs的第18关做演示 首先先看代码 $is_upload false; $msg null;if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_name $_FILES[upload_file][name];$temp_file $_FILES[upload_file][tmp_name];$file_ext substr($file_name,strrpos($file_…

九号公司董事长高禄峰:立足科技创新,助力行业发展

从整个电动两轮车发展时间线来看&#xff0c;尽管九号公司2019年才正式进入局电动两轮车市场&#xff0c;但公司凭借智能化入局&#xff0c;在短短三年时间里&#xff0c;已经成长为智能电动两轮车市场的领军者&#xff0c;在这期间&#xff0c;九号公司既没有多年的市场积累&a…

未来科技城携手加速科技 共建集成电路测试公共服务平台!

8月26日&#xff0c;2023未来产业发展大会在杭州未来科技城国际会议中心开幕&#xff01;会上&#xff0c;发布了未来科技城培育发展未来产业行动计划&#xff0c;启动了未来产业发展共同体&#xff0c;进行了未来产业公共服务平台签约仪式。未来科技城与加速科技签约共建集成电…

【Android-Flutter】我的Flutter开发之旅

目录: 0、文档&#xff1a;1、在Windows上搭建Flutter开发环境&#xff08;1&#xff09;[使用中国镜像(❌详细看官方文档)](https://docs.flutter.dev/community/china)&#xff08;2&#xff09;[下载最新版Flutter SDK&#xff08;已包含Dart&#xff09;](https://docs.flu…

呈现数据的精妙之道:选择合适的可视化方法

在当今数据时代&#xff0c;数据可视化已成为理解和传达信息的重要手段。然而&#xff0c;选择适合的数据可视化方法对于有效地呈现数据至关重要。不同的数据和目标需要不同的可视化方法&#xff0c;下面我们将探讨如何选择最佳的数据可视化方法来呈现数据。 1. 理解数据类型&a…

跨足多领域:人脸美颜SDK在医疗、娱乐和安全中的应用案例

随着科技的不断发展&#xff0c;人脸美颜技术不再局限于满足用户的审美需求&#xff0c;而是在医疗、娱乐和安全领域展现出了广泛的应用前景。本文将深入探讨人脸美颜SDK 在这三个领域中的创新应用案例&#xff0c;展示其在不同场景中的独特价值和潜力。 一、医疗领域 1、皮…

8.29一日总结(uni-app)

1.UNI-APP课件uniapp (notion.site)https://secretive-echo-5b2.notion.site/uniapp-4963799e330b4af4b842ccee6e2f62e8 2.链接 a.UNI-APP官网 uni-app快速上手 | uni-app官网 (dcloud.net.cn) b.安装HBuilder: HBuilderX-高效极客技巧 (dcloud.io) b.微信小程序网址:微信开…

PDF制作成翻页电子书

在日常工作中&#xff0c;大部分人使用的都是PDF文档发送给客户&#xff0c;但是PDF文档通常是静态的&#xff0c;缺乏交互性和视觉吸引力。那你有没有想过把它转换成翻页的电子书呢&#xff1f; 小编将告诉你操作步骤&#xff0c;非常简单 1.搜索FLBOOK在线制作电子杂志平台 …