十四、使用 Vue Router 开发单页应用(1)

news2024/9/21 11:12:19

本章概要

  • 感受前端路由
    • HTML 使用路由
    • 模块开发使用路由

传统的 Web 应用程序不同页面间的跳转都是向服务器发起请求,服务器处理请求后向浏览器推送页面。
在单页应用程序中,不同视图(组件的模板)的内容都是在同一个页面中渲染,页面间的跳转都是在浏览器端完成,这就需要用到前端路由。
在 Vue.js 中,可以使用官方的路由管理器 Vue Router

14.1 感受前端路由

Vue Router 需要单独下载,也可以直接引用,如下:

<script src="https://unpkg.com/vue-router@next"></script>

如果使用模块化开发,则使用 npm 安装方式,执行一下命令安装 Vue Router。

npm install vue-router@next --save

提示:
注意安装 Vue Router 时,要安装支持 Vue 3.0 的新版本 Vue Router ,即这里的 vue-router@next。支持 Vue 2.x 的 Vue Router 版本名是 vue-router

14.1.1 HTML 使用路由

前端路由的配置有固定的步骤
(1)使用 router-link 组件设置导航链接,代码如下:

<!-- 使用router-link组件来导航 -->
<!-- 通过传入to属性指定链接-->
<!-- <router-link>默认会被渲染成一个<a>标签 -->
<router-link to="/">主页</router-link>
<router-link to="/news">新闻</router-link>
<router-link to="/books">图书</router-link>
<router-link to="/videos">视频</router-link>

to 属性指定链接的 URL ,router-link 默认会被渲染一个 a 标签,如图:
在这里插入图片描述

提示:
可以使用 v-slot API 完全定制 router-link 。例如,将 router-link 渲染为 span 标签。代码如下:

<router-link to="/videos" custom v-slot="{ navigate }">
  <span @clilck="navigate" @keypress.enter="navigate">视频</span>
</router-link>
<!-- 将渲染为: -->
<span>视频</span>

(2)指定组件在何处渲染,这是通过 router-view 指定,如下:

<router-view></router-view>

单击链接的时候,会在 router-view 所在的位置渲染组件的模板内容,可以把 router-view 理解为占位符。
(3)定义路由组件,代码如下:

// 定义路由组件
// 可以从其他文件import进来
const Home = { template: '<div>主页面</div>' }
const News = { template: '<div>新闻页面</div>' }
const Books = { template: '<div>图书页面</div>' }
const Videos = { template: '<div>视频页面</div>' }

这里只是为了演示前端路由的基本用法,所以组件定义很简单。
(4)定义路由,将第(1)步设置的链接 URL 和组件对应起来。如下:

// 定义路由
// 每个路由应该映射到一个组件。 
const routes = [
    { path: '/', component: Home },
    { path: '/news', component: News },
    { path: '/books', component: Books },
    { path: '/videos', component: Videos }
]

(5)创建 VueRouter 实例,将第(4)步定义的路由配置作为选项传递进去。如下:

// 传递routes选项,创建router实例。
const router = VueRouter.createRouter({
    //提供要使用的history实现。为了简单起见,在这里使用hash history。
    history: VueRouter.createWebHashHistory(),
    routes // (简写) 相当于 routes: routes
})

(6)调用应用实例的 use() 方法,传入第(5)步创建的 router 对象,从而让整个应用程序具备路由功能。

const app = Vue.createApp({})
// 使用路由器实例,从而让整个应用都有路由功能
app.use(router)
app.mount('#app')

至此,整个前端路由的配置就完成了,完整代码如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
    <div id="app">
        <p>
            <!-- 使用router-link组件来导航 -->
            <!-- 通过传入to属性指定链接-->
            <!-- <router-link>默认会被渲染成一个<a>标签 -->
            <router-link to="/">主页</router-link>
            <router-link to="/news">新闻</router-link>
            <router-link to="/books">图书</router-link>
            <router-link to="/videos">视频</router-link>
        </p>
        <!-- 路由出口 -->
        <!-- 路由匹配到的组件将在这里渲染 -->
        <router-view></router-view>
    </div>
    <script src="https://unpkg.com/vue@next"></script>
    <script src="https://unpkg.com/vue-router@next"></script>
    <script>
        // 定义路由组件
        // 可以从其他文件import进来
        const Home = { template: '<div>主页面</div>' }
        const News = { template: '<div>新闻页面</div>' }
        const Books = { template: '<div>图书页面</div>' }
        const Videos = { template: '<div>视频页面</div>' }

        // 定义路由
        // 每个路由应该映射到一个组件。 
        const routes = [
            { path: '/', component: Home },
            { path: '/news', component: News },
            { path: '/books', component: Books },
            { path: '/videos', component: Videos }
        ]

        // 传递routes选项,创建router实例。
        const router = VueRouter.createRouter({
            //提供要使用的history实现。为了简单起见,在这里使用hash history。
            history: VueRouter.createWebHashHistory(),
            routes // (简写) 相当于 routes: routes
        })

        const app = Vue.createApp({})
        // 使用路由器实例,从而让整个应用都有路由功能
        app.use(router)
        app.mount('#app')
    </script>
</body>

</html>

任意单击某个链接,前端路由演示效果如图:
在这里插入图片描述

在创建 router 实例时,为选项 history 指定的是 VueRouter.createWebHashHistory() ,也就是 hash 模式,即使用 URL 的 hash (即 URL 中的锚部分,从 “#”开始的部分)模拟完整的 URL ,以便在 URL 更改时不会重新加载页面,如地址栏中的“#videos”的使用。

14.1.2 模块开发使用路由

模块化开发使用前端路由也是遵照 14.1.1节的各个步骤,只是形式上有些变化。
先利用 Vue CLI 创建一个 Vue 3.0 的脚手架项目,项目名为 myrouter,直接选择 Default (Vue 3 Preview)([Vue 3] babel,eslint),开始项目创建。
在 cmd 命令窗口输入:

vue create myrouter

然后使用 Visual Studio Code 打开刚才新建的项目。
(1)为项目安装 vue-router 。选择【终端】——>【新终端】选项,在弹出的终端窗口中输入一下命令安装 vue-router:

npm install vue-router@next --save

(2)在 App.vue 中设置导航链接和组件渲染的位置。修改其模板内容,并将引用 HelloWorld 组件的地方删除。修改后的代码如下:

<template>
  <p>
    <router-link to="/">首页</router-link>
    <router-link to="/news">新闻</router-link>
    <router-link to="/books">图书</router-link>
    <router-link to="/videos">视频</router-link>
  </p>
  <router-view></router-view>
</template>

<script>
export default {
  name: 'App',
  components: {
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /*text-align: center;*/
  color: #2c3e50;
  margin-top: 60px;
}
</style>

(3)定义组件路由。在 components 目录下新建 Home.vue、News.vue、Books.vue、Videos.vue 四个文件。代码如下:

Home.vue

<template>
    <div>主页面</div>
</template>
<script>
export default {
}
</script>

News.vue

<template>
    <div>新闻页面</div>
</template>

<script>
export default {
}
</script>

Books.vue

<template>
    <div>图书页面</div>
</template>

<script>
export default {
}
</script>

Videos.vue

<template>
    <div>视频页面</div>
</template>

<script>
export default {
}
</script>

(4)单独定义一个模块文件,配置路由信息,这也是项目中经常使用的方式。在 src 目录下新建一个 router 文件夹,在该文件夹下新建一个 index.js 文件。编辑该文件,代码如下:

import { createRouter, createWebHashHistory } from 'vue-router'
import Home from '@/components/Home'
import News from '@/components/News'
import Books from '@/components/Books'
import Videos from '@/components/Videos'

export default createRouter({
  history: createWebHashHistory(),
  routes: [
    {
      path: '/',
      component: Home,
    },
    {
      path: '/news',
      component: News,
    },
    {
      path: '/books',
      component: Books,
    },
    {
      path: '/videos',
      component: Videos,
    }
  ]
})

(5)在程序入口 main.js 中,使用 router 实例让整个应用都有路由功能。代码如下:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

createApp(App).use(router).mount('#app')

在基于 Vue.js 的项目开发中,如果要导入一个目录中的 index.js 文件,可以直接导入该目录,内置的 webpack 会自动导入 index.js 文件。
至此,前端路由就已经全部配置完毕。打开终端,输入 npm run serve 命令,运行项目,体验单页应用的前端路由。

启动的时候报以下错误

在这里插入图片描述

在 package.sjon 中配置 rules 参数可解决

在这里插入图片描述

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

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

相关文章

golang 琐碎知识

golang 琐碎知识&#xff08;持续进行&#xff09; 时间格式 time.now.Format("2006-01-02T 15:04:05")make声明切片bug Golang&#xff1a;statusList : make([]*model.StatusList, 6) 会声明一个长为6的null切片&#xff0c;使用append添加时不会将null覆盖掉去掉切…

JMeter入门教程(10) --函数助手

文章目录1.CSVRead2.Random3.RandomString4.RandomDate5.time在JMeter的选项菜单中有一个“函数助手对话框”&#xff0c;点击打开“函数助手”对话框&#xff0c;使用函数助手&#xff0c;我们可以从“选择一个功能”下拉列表中选择一个函数&#xff0c;并为其参数设定值。表格…

SQL函数之分割

数据库中有一张地区数据统计表,但是并不规则 ,记录类似于,225100:02:3:20160725是一串代码,以:分割,第1位为地区代码,第2位为分类代码,第3位为数量,第4位为日期 地区代码含义225100-上海 225200-江苏 225300-浙江 为可能有某些位不存在,缺位时计算规则如下: 1、…

Golang开发习惯:变量、常量声明使用惯例

《Go语言精进之路》第二、三章部分内容学习记录笔记。 1.基本原则 Golang开发中&#xff0c;可遵守简单且一致的命名原则&#xff0c;力求命名精简、易懂和一致。 package声明 Golang的package声明以小写形式的单个词进行命名&#xff1a; shopservice、utils、logs、tcc、l…

计算机毕业论文java毕业设计选题源代码

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《【论文】S2SH药膳馆会员管理系统》该项目采用技术jsp、strust2、Spring、hibernate、tomcat服务器、mysql数据库 &#xff0c;项目含有源码、论…

十四、使用 Vue Router 开发单页应用(2)

本章概要 动态路由匹配 查询参数 路由匹配语法 参数的自定义正则表达式可重复参数可选参数 嵌套路由 14.2 动态路由匹配 实际项目开发时&#xff0c;经常需要把匹配某种模式的路由映射到同一个组件。例如&#xff0c;有一个 Book 组件&#xff0c;对于所有 ID 各不相同的图书…

MOOC 大数据Note

MOOC 大数据NoteSparkSpark 一个软件栈满足不同交互场景Lineage 血缘关系创建 转换 动作ShuffleMapStageSpark的部署和应用方式RDD操作分为转换&#xff08;Transformation&#xff09;和动作&#xff08;Action&#xff09;两种类型&#xff0c;下列属于动作&#xff08;Actio…

开发工具——gcc/g++

开发工具gcc/g 完成代码的编写完后&#xff0c;要形成可执行程序&#xff0c;需要编译工具进行对代码的编译。 C语言的编译工具是gcc&#xff0c;c的编译工具是g。 如果g没有的话&#xff0c;可以切换到root执行命令yum install -y gcc-c C语言和C的编译&#xff1a; gc…

「点燃我,温暖你」用Python制作一个动态爱心效果

最近「点燃我&#xff0c;温暖你」这部剧非常火&#xff0c;讲述的是程序员的爱情故事。 其中陈飞宇饰演的男主李峋&#xff0c;在剧中用程序做出的爱心跳动效果&#xff0c;非常炫。 网上各个大佬也是纷纷给出看法&#xff0c;综合就是不太可能用C语言来实现的。 大概率是AE…

Reg注册表读写

在Windows 95及其后继版本中&#xff0c;采用了一种叫做“注册表”的数据库来统一进行管理&#xff0c;将各种信息资源集中起来并存储各种配置信息。按照这一原则&#xff0c;Windows各版本中都采用了将应用程序和计算机系统全部配置信息容纳在一起的注册表&#xff0c;用来管理…

Java内存溢出故障案例及Linux内存机制探究

文章目录Java内存溢出故障案例及Linux内存机制探究OOM Killer触发机制分析如何避免系统触发OOM Killer这部分内容属于demo案例分享&#xff0c;解决线上运维问题&#xff0c;思路是最重要的 Java内存溢出故障案例及Linux内存机制探究 这是一个线上数据分析应用故障案例&#…

Java—反射

文章目录什么是反射反射定义java创建对象的三个阶段反射过程反射第一步&#xff1a;获取类对象获取类对象的三种方式反射第二步&#xff1a;获取类信息如何获取类信息&#xff1f;1、获取成员变量&#xff1a;2、获取方法&#xff1a;3、获取构造器反射第三步&#xff1a;使用反…

vue学习笔记——简单入门总结(四)

文章目录1.Vue3的特性和变化1.1.创建vue3项目1.2.分析main.js变化&#xff1a;1.3.setup--组合式api的开端1.4.ref函数和reactive函数&#xff1a;1.5.watch监视属性1.5.watchEffect函数1.6.vue3生命周期&#xff1a;1.Vue3的特性和变化 1.1.创建vue3项目 1.这里我们使用脚手架…

RegAD-Registration based Few-Shot Anomaly Detection论文学习

摘要 本文为少样本异常检测&#xff08;FSAD&#xff09;&#xff0c;这是一种实用但尚未被研究的异常检测&#xff08;AD&#xff09;&#xff0c;少样本意味着在训练中只为每个类别提供有限数量的正常图像。 现有的少样本异常检测的研究主要使用的是 一类别一模型 学习范式…

李宏毅《DLHLP》学习笔记7 - Voice Conversion

视频链接&#xff1a;https://www.youtube.com/watch?vJj6blc8UijY&listPLJV_el3uVTsO07RpBYFsXg-bN5Lu0nhdG&index9&ab_channelHung-yiLee 课件链接&#xff1a;https://speech.ee.ntu.edu.tw/~tlkagk/courses/DLHLP20/Voice%20Conversion%20(v3).pdf 1. 语音转…

JAVA+MySQL 图书馆借阅信息管理系统

图书馆是当下很多大学生和有志青年学习和借阅图书的场所,图书馆每天都有大量的人员需要接待,如何能够更好的对用户的这些借阅信息进行信息化的管理是当下大多数图书馆管理人员所关心的问题 本系统是通过JAVA和MYSQL来进行开发的,通过本系统可以对图书馆内的图书信息,用户信息以…

基于PCIe的NVMe协议在FPGA中实现方法

NVMe协议是工作在PCIE的最上层协议层的&#xff0c;故需要先搞清楚PCIE。本文基于Xilinx的UltraScale&#xff0c;开发工具为Vivado2021.2。学习中以spec为主&#xff0c;其它资料辅助参考(重点介绍学习方法及资料&#xff0c;有时间再加细节)。请勿转载&#xff01; 1 PCIe学…

基于PHP+MySQL青年志愿者服务管理系统的设计与实现

志愿者管理系统能够通过互联网得到广泛的、全面的宣传,让尽可能多的人积极的参加到志愿者行列中来,不仅为需要的人提供了服务,而且锻炼了自己,志愿者是一个对社会和自己以及需要帮助的人都有很多好处的事情 PHP青年志愿者服务网站是一个公益类型的网站,系统通过PHp&#xff1a;…

HK1 BOX刷入 Armbian系统作为服务器

HK1 BOX刷入 Armbian系统作为服务器 1 安装Armbian到EMMC 硬件 HK1 BOX s905 x3 固件版本选择 Armbian_23.02.0_Aml_s905x3_bullseye_5.15.80_server_2022.12.01用usb启动&#xff0c;tf/sd有的设备不行&#xff0c;有干扰&#xff0c;有可能从TF卡无法启动系统。 用usb启…

Grid 布局实现九宫格图片动画

前言 &#x1f44f;Grid 布局实现九宫格&#xff0c;background-position设置背景图像起始位置&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 定义css变量&#xff1a;九宫格中每个宫格的长/宽为w&#xff0c…