Vue:vue-router使用指南

news2024/11/14 3:42:48

一、简介

点击查看vue-router官网

Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举。功能包括:

  • 嵌套路由映射
  • 动态路由选择
  • 模块化、基于组件的路由配置-
  • 路由参数、查询、通配符-
  • 展示由 Vue.js 的过渡系统提供的过渡效果-
  • 细致的导航控制-
  • 自动激活 CSS 类的链接-
  • HTML5 history 模式或 hash 模式-
  • 可定制的滚动行为-
  • URL 的正确编码

二、安装

2.1 包管理器

对于一个现有的使用 JavaScript 包管理器的项目,你可以从 npm registry 中安装 Vue Router:

npm install vue-router@4

//vue2 安装对应的版本vue-router@3,例如指定版本:3.6.5
npm install vue-router@3.6.5

如果你打算启动一个新项目,你可能会发现使用 create-vue 这个脚手架工具更容易,它能创建一个基于 Vite 的项目,并包含加入 Vue Router 的选项:

npm create vue@latest

你需要回答一些关于你想创建的项目类型的问题。如果您选择安装 Vue Router,示例应用还将演示 Vue Router 的一些核心特性。

使用包管理器的项目通常会使用 ES 模块来访问 Vue Router,例如 import { createRouter } from ‘vue-router’。

三、实例演示

Vue Router 是 Vue 官方的客户端路由解决方案。

客户端路由的作用是在单页应用 (SPA) 中将浏览器的 URL 和用户看到的内容绑定起来。当用户在应用中浏览不同页面时,URL 会随之更新,但页面不需要从服务器重新加载。

Vue Router 基于 Vue 的组件系统构建,你可以通过配置路由来告诉 Vue Router 为每个 URL 路径显示哪些组件。

提醒:下面实例是在TestVue2的项目里运行的

3.1 TestVue2项目结构图

在这里插入图片描述

3.2 安装 vue-router@3.6.5
npm install vue-router@3.6.5

安装成功后,查看package.json文件
在这里插入图片描述

3.3 创建路由器实例
  1. 在src目录里创建views文件夹,在里面分别创建teststore1.vue和teststore2.vue文件

  2. 在src目录里创建router文件夹,在里面创建index.js文件

router文件夹里index.js文件代码

import Vue from 'vue'
import Router from 'vue-router'
import TestStore1 from '../views/teststore1.vue'
Vue.use(Router)
export default new Router({
	mode:'history',
	// base: 'http://192.168.0.102:8080/',
	// 下面第一个 path:'/', 解决默认进入的官方首页问题
	routes:[
		{
			name:'首页',
			path:'/',
			component: () => import ("../views/home.vue")
		},
		{
			name:'状态管理1',
			path:'/teststore1',
			component: TestStore1,
			meta:{
				title:'store1'
			}
		},
		{
			name:'状态管理2',
			path:'/teststore2',
			component: () => import("../views/teststore2.vue")
		},
	]
})

teststore1.vue代码

<template>
	<div>
		<!-- <h1>store 1 数量:{{this.$store.state.count}}</h1> -->
		<!-- <h1>getComputedCount 数量:{{getComputedCount}}</h1> -->
		<!-- <h1>mapState 数量:{{count}}</h1>
		<button @click="increment">+</button>
		<button @click="decrement">-</button>
		</br>
		<button @click="doactions">点击两秒后数量自动加1</button>
		<br />
		<br />
		<p>
			<button v-on:click="getCount">获取localCount最新值</button>
			获取到的数量:{{localCount}}
		</p>
		<br />
		<br /> -->
		<button @click="openTest2Page">打开test2页面</button>

	</div>
</template>

<script>
	// import {
	// 	mapState
	// } from 'vuex'
	export default {
		name: 'teststore1',
		data() {
			return {
				localCount: 0,
			}
		},
		// computed: {
		// 	...mapState([
		// 		'count',
		// 	]), //推荐这种方式
		// },
		
		// watch: {
		// 	count: {
		// 		handler(newVal, oldVal) {
		// 			console.log(`teststore1 watch 新的值: ${newVal} , 旧的值: ${oldVal}`)
		// 		},
		
		// 	}
		// },
		
		created() {
			console.log("teststore1 执行了 created ")
		},
		
		activated() {
			console.log("teststore1 执行了 activated ")
		},
		
		mounted() {
			// console.log("teststore1 执行了 mounted ", this.$store)
		},
		
		beforeUpdate() {
			console.log("teststore1 执行了 beforeUpdate ")
		},
		
		updated() {
			console.log("teststore1 执行了 updated ")
		},
		
		beforeDestroy() {
			console.log("teststore1 执行了 beforeDestroy ")
		},
		
		destroyed() {
			console.log("teststore1 执行了 beforeDestroy ")
		},
		
		methods: {
			// increment() {
			// 	this.$store.commit('increment')
			// },

			// decrement() {
			// 	this.$store.commit('decrement')
			// },
			// // // 异步任务 store.dispatch	
			// doactions() {
			// 	this.$store.dispatch('tryactions', 2000)
			// },

			// getCount() {
			// 	this.localCount = this.$store.state.count
			// 	console.log("执行了 getCount this.localCount = ", this.localCount)
			// },
			
			openTest2Page(){
				this.$router.push('/teststore2')
			},
		}

	}
</script>

<style>
	button {
		margin-left: 1.25rem;
		margin-top: 1.0rem;
	}
</style>

teststore2.vue代码

<template>
	<div>
		<!-- <h1>store 2 数量:{{this.$store.state.count}}</h1> -->
		<!-- <h1>store 2 数量:{{count}}</h1>
		<button @click="increment">+</button>
		<button @click="decrement">-</button> -->
		<button @click="goBack">返回到上个页面</button>

	</div>
</template>

<script>
	// import {
	// 	mapState
	// } from 'vuex'
	export default {
		name: 'teststore2',
		data() {
			return {
				mCount: 0,
			}
		},
		
		created() {
			console.log("teststore2 执行了 created ")
		},
		
		activated() {
			console.log("teststore2 执行了 activated ")
		},
		
		mounted() {
			console.log("teststore2 执行了 mounted ", this.$store)
		},
		
		beforeUpdate() {
			console.log("teststore2 执行了 beforeUpdate ")
		},
		
		updated() {
			console.log("teststore2 执行了 updated ")
		},
		
		beforeDestroy() {
			console.log("teststore2 执行了 beforeDestroy ")
		},
		
		destroyed() {
			console.log("teststore2 执行了 beforeDestroy ")
		},
		
		// computed: {
		// 	...mapState([
		// 		'count',
		// 	]),
		// },

		mounted() {
			// console.log("teststore2 执行了 mounted ",this.$store)
		},
		methods: {
			// increment() {
			// 	this.$store.commit('increment')
			// },

			// decrement() {
			// 	this.$store.commit('decrement')
			// },
			
			goBack(){
				this.$router.replace('/teststore1')
			}
		}

	}
</script>

<style>
	button {
		margin-left: 1.25rem;
	}
</style>

四、注册路由器插件

在router文件里index.js里使用了Vue.use(Router),接下来在main.js将index.js导入, 将其注册为插件

main.js文件代码

import Vue from 'vue'
import App from './App.vue'
// 将 Vuex Store 注入到应用中
//import store from './store'
import router from './router'
Vue.config.productionTip = false
// Vue.prototype.$store = store

// https://www.jb51.net/javascript/297247rzd.htm
// 如果使用 ES6,你也可以以 ES6 对象的 property 简写 (用在对象某个 property 的 key 和被传入的变量同名时):
new Vue({
	router,
	render: h => h(App),
}).$mount('#app')

// 使用 ES2015 语法
// new Vue({
// 	router: router,
// 	store: store,
// 	render: h => h(App),
// }).$mount('#app')

等价于

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

和大多数的 Vue 插件一样,use() 需要在 mount() 之前调用。

如果你好奇这个插件做了什么,它的职责包括:

  • 全局注册 RouterView 和 RouterLink 组件。
  • 添加全局 $router 和 $route 属性。
  • 启用 useRouter() 和 useRoute() 组合式函数。
  • 触发路由器解析初始路由。

五、App.vue里使用router-view

App.vue文件代码

<template>
  <div id="app">
	  <!-- 重要的步骤 -->
	  <router-view />
    <!-- <img alt="Vue logo" src="./assets/logo.png"> -->
    <!-- <HelloWorld msg="Welcome to Your Vue.js App"/> -->
	<!-- <router-link to="/teststore1">teststore1</router-link> -->
	<!-- <div @click="test">点击跳转</div> -->
  </div>
</template>

<script>
// import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'app',
  // components: {
  //   HelloWorld
  // },
  methods: {
  	test(){
		console.log("执行了 test")
		this.$router.push('/teststore1')
	}
  },
}
</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>

六、访问路由器和当前路由

你很可能想要在应用的其他地方访问路由器。

如果你是从 ES 模块导出路由器实例的,你可以将路由器实例直接导入到你需要它的地方。在一些情况下这是最好的方法,但如果我们在组件内部,那么我们还有其他选择。

在组件模板中,路由器实例将被暴露为$router。这与同样被暴露的 $route 一样,但注意前者最后有一个额外的 r。

如果我们使用选项式 API,我们可以在 JavaScript 中如下访问这两个属性:this.$router 和 this.$route。在演练场示例中的 home.vue 组件中,路由器就是这样获取的。

home.vue代码

<template>

	<div>
		<h1>首页</h1>
		<router-link to="/teststore1">打开teststore1</router-link>
		<br />
		<button @click="test">打开teststore2页面</button>
	</div>
</template>

<script>
	export default {
		methods: {
			test() {
				this.$router.push('/teststore2')
			}
		},
	}
</script>

<style>

</style>

这里调用了 push(),这是用于编程式导航的方法

七、启动TestVue2项目

在终端里输入下面命令:
提醒:因为电脑里node版本问题,前面加了NODE_OPTIONS=–openssl-legacy-provider

NODE_OPTIONS=--openssl-legacy-provider npm run serve

在这里插入图片描述

八、效果图

home.vue页面
在这里插入图片描述

teststore1.vue页面
在这里插入图片描述

teststore2.vue页面
在这里插入图片描述

九、TestVue2项目源码

点击查看TestVue2源码

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

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

相关文章

DNS常见面试题

DNS是什么&#xff1f; 域名使用字符串来代替 IP 地址&#xff0c;方便用户记忆&#xff0c;本质上一个名字空间系统&#xff1b;DNS 是一个树状的分布式查询系统&#xff0c;但为了提高查询效率&#xff0c;外围有多级的缓存&#xff1b;DNS 就像是我们现实世界里的电话本、查…

电路板热仿真覆铜率,功率,结温,热阻率信息计算获取方法总结

🏡《电子元器件学习目录》 目录 1,概述2,覆铜率3,功率4,器件尺寸5,结温6,热阻1,概述 电路板热仿真操作是一个复杂且细致的过程,旨在评估和优化电路板内部的热分布及温度变化,以确保电子元件的可靠性和性能。本文简述在进行电路板的热仿真时,元器件热信息的计算方法…

59.DevecoStudio项目引入不同目录的文件进行函数调用

59.DevecoStudio ArkUI项目引入不同目录的文件进行函数调用 arkUi,ets,cj文件&#xff0c;ts文件的引用 import common from ohos.app.ability.common; import stringutils from ./uint8array2string; //index.ts的当前目录 import StringUtils2 from ../http2/uint8array2st…

python全栈开发《23.字符串的find与index函数》

1.补充说明上文 python全栈开发《22.字符串的startswith和endswith函数》 endswith和startswith也可以对完整&#xff08;整体&#xff09;的字符串进行判断。 info.endswith(this is a string example!!)或info.startswith(this is a string example!!)相当于bool(info this …

鸿蒙媒体开发【拼图】拍照和图片

拼图 介绍 该示例通过ohos.multimedia.image和ohos.file.photoAccessHelper接口实现获取图片&#xff0c;以及图片裁剪分割的功能。 效果预览 使用说明&#xff1a; 使用预置相机拍照后启动应用&#xff0c;应用首页会读取设备内的图片文件并展示获取到的第一个图片&#x…

Animate软件基础:关于补间动画中的图层

Animate 文档中的每一个场景都可以包含任意数量的时间轴图层。使用图层和图层文件夹可组织动画序列的内容和分隔动画对象。在图层和文件夹中组织它们可防止它们在重叠时相互擦除、连接或分段。若要创建一次包含多个元件或文本字段的补间移动的动画&#xff0c;请将每个对象放置…

go 中 string 并发写导致的 panic

类型的一点变化 在Go语言的演化过程中&#xff0c;引入了unsafe.String来取代之前的StringHeader结构体&#xff0c;这是为了提供更安全和简洁的字符串操作方式。 旧设计 (StringHeader 结构体) StringHeader注释发生了一点变动&#xff0c;被标注了 Deprecated&#xff0c;…

谷粒商城实战笔记-103~104-全文检索-ElasticSearch-Docker安装ES和Kibana

文章目录 一&#xff0c;103-全文检索-ElasticSearch-Docker安装ES1&#xff0c;下载镜像文件2&#xff0c;Elasticsearch安装3&#xff0c;验证 二&#xff0c;104-全文检索-ElasticSearch-Docker安装Kibana1&#xff0c;下载镜像文件2&#xff0c;kibana的安装3&#xff0c;验…

【数据结构算法经典题目刨析(c语言)】环形链表的约瑟夫问题(图文详解)

&#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;数据结构经典题目刨析(c语言) 一.前言&#xff1a; 前言——著名的Josephus问题 据说著名犹太 Josephus有过以下的故事&#xff1a;在罗⻢⼈占领乔塔帕特后&#xff0c;39个犹太⼈与Josephus及他…

ansible 配置yum源

ansible配置yum源 有两种方式&#xff0c;一种是可以写好sh脚本&#xff0c;然后ansible去执行sh文件 另外一种就是使用yum_repository库 本文讲使用库的方式 本文使用的环境是centos7 &#xff0c;配置也是按照7去配置的&#xff0c;没有写动态配置 直接上代码 [rootvm-2 ~…

《技术人求职之道》之求职机遇篇:多渠道并进,如何高效获取面试机会

摘要 本文探讨了求职过程中获取面试机会的多种途径,强调简历优化的重要性,并指出了不同求职方式的优劣及其适用情况。文章首先介绍通过企业挖掘、内部推荐、猎头服务、社会招聘和校园招聘等途径获得面试机会的方法,并根据成功率和适用性为这些方法排序。然后,详细讨论了每…

门控循环单元GRU

目录 一、GRU提出的背景&#xff1a;1.RNN存在的问题&#xff1a;2.GRU的思想&#xff1a; 二、更新门和重置门&#xff1a;三、GRU网络架构&#xff1a;1.更新门和重置门如何发挥作用&#xff1a;1.1候选隐藏状态H~t&#xff1a;1.2隐藏状态Ht&#xff1a; 2.GRU: 四、训练过程…

当自回归遇到Diffusion

文章目录 Autoregressive Image Generation without Vector Quantization一. 简介1.1 摘要1.1 引言二.相关工作2.1 Sequence Models for Image Generation2.2 Diffusion for Representation Learning2.3 Diffusion for Policy Learning三.方法3.1 重新思考离散值的tokens3.2 Di…

Kotlin OpenCV 图像图像50 Haar 级联分类器模型

Kotlin OpenCV 图像图像50 Haar 级联分类器模型 1 OpenCV Haar 级联分类器模型2 Kotlin OpenCV Haar 测试代码 1 OpenCV Haar 级联分类器模型 Haar级联分类器是一种用于对象检测&#xff08;如人脸检测&#xff09;的机器学习算法。它由Paul Viola和Michael Jones在2001年提出…

conda环境pip 安装Tensorflow-gpu 2.10.2提示nbconvert 的包依赖冲突

问题如下&#xff1a; ERROR: pip’s dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. nbconvert 7.16.4 requires beautifulsoup4, which is not inst…

DETR论文详解

文章目录 前言一、DETR理论二、模型架构1. CNN2. Transformer3. FFN 三、损失函数四、代码实现总结 前言 DETR是Facebook团队在2020年提出的一篇论文&#xff0c;名字叫做《End-to-End Object Detection with Transformers》端到端的基于Transformers的目标检测&#xff0c;DET…

数仓入门:数据分析模型、数仓建模、离线实时数仓、Lambda、Kappa、湖仓一体

往期推荐 大数据HBase图文简介-CSDN博客 数仓分层ODS、DWD、DWM、DWS、DIM、DM、ADS-CSDN博客 数仓常见名词解析和名词之间的关系-CSDN博客 目录 0. 前言 0.1 浅谈维度建模 0.2 数据分析模型 1. 何为数据仓库 1.1 为什么不直接用业务平台的数据而要建设数仓&#xff1f; …

ChatGPT能代替网络作家吗?

最强AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 当然可以&#xff01;只要你玩写作AI玩得6&#xff0c;甚至可以达到某些大神的水平&#xff01; 看看大神、小白、AI输出内容的区…

重塑企业知识库:AI搜索的深度应用与变革

在数字化浪潮的推动下&#xff0c;企业知识库已成为企业智慧的核心载体。而AI搜索技术的融入&#xff0c;让海量信息瞬间变得井然有序&#xff0c;触手可及。它不仅革新了传统的搜索方式&#xff0c;更开启了企业知识管理的新纪元&#xff0c;引领着企业向更加智能化、高效化的…

【人工智能】FPGA实现人工智能算法硬件加速学习笔记

一. FPGA的优势 FPGA拥有高度的重配置性和并行处理能力,能够同时处理多个运算单元和多个数据并行操作。FPGA与卷积神经网络(CNN)的结合,有助于提升CNN的部署效率和性能。由于FPGA功耗很低的特性进一步增强了其吸引力。此外,FPGA可以根据具体算法需求量身打造硬件加速器。针对动…