什么是路由
路由的本质就是一种对应关系,比如说我们在url地址中输入我们要访问的url地址之后,浏览器要去请求这个url地址对应的资源。 那么url地址和真实的资源之间就有一种对应的关系,就是路由。
路由分为前端路由和后端路由:
后端路由是由服务器端进行实现,并完成资源的分发 后端路由性能相对前端路由来说较低,所以,我们接下来主要学习的是前端路由
前端路由是依靠hash值(锚链接)的变化进行实现 前端路由的基本概念:根据不同的事件来显示不同的页面内容,即事件与事件处理函数之间的对应关系 前端路由主要做的事情就是监听事件并分发执行事件处理函数
vue3 安装路由
查看自己项目目录中是否有route文件,安装 route 后会有生成该文件
方法一:使用 vue ui 安装 在当前项目文件夹使用cmd命令,然后输入vue ui
打开之后是这个页面
route 路由配置和使用
注:需要配置并且引用后才能生效
一、配置 router 文件中的 index.js 添加相应的路径和名字,参考设置即可
二、使用 router
查看 main.js 中查看是否引用了,正常安装后会引用
注:必须要在mount之前挂载
1 2 3 4 5 6 import router from './router' ... const app = createApp(App);app.use(router) ... app.mount('#app' );
最后在App.vue里面引用一下 组件就把环境都弄好了,记得把之前模板自带的东西清理了就好
1 2 3 <template> <router-view/> </template>
在 VUE 界面中引用
在 template 中设置 点击事件
1 <button @click ="cliec" > 123</button >
在 script 中配置跳转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <script> import { useRouter } from "vue-router" ; export default { name: 'HelloWorld' , setup ( ) { const router=useRouter(); let Gotoregister=function ( ) { router.push({name : "Registermobile" ,})} return { Gotoregister }; }, ... } </script>
route 路由进阶使用之传参功能 安装方法二:
1 npm install vue-router@4 --save
1、跳转模式 A界面--▶B界面 需要配置 router 的文件夹:
一、router 环境配置 1. 首先我们在文件夹的index.js文件里添加下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import { createRouter, createWebHistory } from 'vue-router' import A from '../views/A.vue' const routes = [ { path: '/' , name: 'A' , component: A }, { path: '/B' , name: 'B' , component: () => import ('../views/B.vue' ) } ] const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes }) export default router
你会惊奇的发现,Vue对象去哪儿了?在2.x中,我们要使用路由是要先import Vue from ‘vue’把Vue引入进来,接着再Vue.use(VueRouter)去初始化使用路由,是的,vue3中已经没有全局的Vue对象了,并且vue-router也变得模块化了,routes引入页面的两种方式没啥改变,倒是history已经模块化了,它有几种方式,我们使用createWebHistory 就好了,就是浏览器URL后面带不带#号小尾巴的区别
2. 然后在main.js文件里修改添加下面的代码:
使用router的话在createApp模块里挂载一下就好了,需要注意的是必须要在mount之前挂载
1 2 3 4 5 import { createApp } from 'vue' import App from './App.vue' import router from './router' createApp(App).use(router).mount('#app' )
3. 最后在App.vue里面引用一下 组件:
值此就把环境都弄好了,记得把之前模板自带的东西清理了就好
1 2 3 <template > <router-view /> </template >
二、router 使用 1. 首先在之前创建的A.vue文件中添加下面代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <template > <div @click ="goToB" > Page A</div > </template > <script > import { useRouter } from "vue-router" ;export default { setup ( ) { const router = useRouter(); const goToB = () => { router.push({ name: "B" , }); }; return { goToB, }; } }; </script >
2. 然后在B.vue文件中随便添加点东西,能显示就好:
1 2 3 <template > <div > Page B</div > </template >
3. 最后我们再回看A文件,在methods中引用:
在A文件中你会发现找不到this.$router.push(),是的,vue3中已经没有全局的路由了,需要使用路由, 我需先要引入useRouter模块,接着要在setup函数中定义router,之后再创建一个方法,里面才是我们熟悉的router.push({ name: “B”}),这里不要用this,setup函数中是没有this的,到这里简单的跳转就算完成了。
methods函数里面调用方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <template > <div @click ="test" > Page A</div > </template > <script > import { useRouter } from "vue-router" ;export default { setup ( ) { const router = useRouter(); const goToB = () => { router.push({ name: "B" , }); }; return { goToB, }; }, methods: { test ( ) { /* * do something... */ this .goToB(); }, }, }; </script >
最终效果如下:
2、重点功能之路由传参
既然在methods函数里可以调用了setup() 里return的方法,那是不是意味着我们可以传点东西过去?
修改 A.vue 文件:
我们可以传参数过去,这样我们就可以把这个自定义的跳转函数封装起来,动态的传入页面名称和参数就好了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 <template > <div @click ="test" > Page A</div > </template > <script > import { useRouter } from "vue-router" ;export default { setup ( ) { const router = useRouter(); const goToOtherPage = (page_name, value ) => { router.push({ name: page_name, params: { value: value, }, }); }; function test ( ) { /* * do something... */ let page_name = "B" ; let value = "hello vue3" ; this .goToOtherPage(page_name, value); } return { goToOtherPage, test }; }, }; </script >
修改 B.vue 文件:
接着我们要怎么接受参数咧?搞了那么久,其实配方都是一样的,要接受参数,我需要想引入useRoute ,注意是没有r结尾的,是不是有种很熟悉的味道同志们=》this.$route.params,接着也要在setup函数里定义route,接着我们就可以以方法的形式返回params,要使用的话this一下就好了,生命周期函数created、mounted里面都可以直接拿到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <template > <div > Page B</div > </template > <script > import { onMounted } from 'vue' ;import { useRoute } from "vue-router" ;export default { setup ( ) { const route = useRoute(); const getParams = () => { return route.params; }; onMounted(() => { console .log("mounted:" + getParams().value); }); return { getParams, }; }, }; </script >
效果图:
3、在基础页怎么获取router文件夹中index.js里的数据呢? 1. vue3.x 带上数据
在vue2.x时,在new实例时可以顺便把数据带上,之后在created或mounted生命周期里直接this.$router.options就可以找到我们传的数据了
1 2 3 4 5 6 7 8 const myArr = [1 , 2 , 3 ]const router = new VueRouter({ mode: 'history' , base: process.env.BASE_URL, routes, myArr }) export default router
那么在vue3.x中,我们可以在创建路由时把数据带上
1 2 3 4 5 6 7 8 const myArr = [1 , 2 , 3 ]const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes, myArr }) export default router
2. 之后我们在setup() 函数中使用路由时接收并返回对应的数据,之后就可以在created或mounted生命周期中使用了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import { onMounted } from 'vue' ;import { useRouter } from "vue-router" ;export default { setup ( ) { const router = useRouter(); console .log(router.options); const myArr = () => router.options.myArr; onMounted(() => { console .log(this .myArr()); }); return { myArr }; }, };
3. 成功后打印大概是这个样子:
route 路由跳转与方式对比 vue-router实现路由跳转与参数获取:
路由跳转和传参:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 import { defineComponent, onMounted, reactive, readonly, ref } from 'vue' ;import { useRouter, useRoute } from 'vue-router' ;export default defineComponent({ name: 'Login' , setup ( ) { const router = useRouter(), route = useRoute(); const submitForm = () => { formRef.value?.validate((valid ) => { if (valid) { login({ strategy : 'local' , ...ruleForm }) .then((res: any ) => { const redirect: string = route.query && route.query.redirect; if (redirect) { router.replace(redirect); } else { router.push('/home' ); } return true ; }) .catch((e ) => { ... }); } else { ... return false ; } }); }; return { ..., submitForm }; } });
路由跳转三种方法的总结:
第一种
S1: 路由设置方式:
1 2 3 4 5 6 { path: '/detail/:id' , name: 'detail' , meta: { keepAlive : true }, component: () => import ('../pages/detail/index' ) }
S2: 路由跳转模式:
1 2 3 4 5 this .$router.push( { path: `/detail/1` } )
S3: 获取参数方式:
1 let detailId = this .$route.params.id
注意: params 传参相当于是路由的一部分是必须传的东西,经过验证不传页面会跳转到空白页,该方式刷新页面id 不丢失
第二种
S1: 路由设置方式:
1 2 3 4 5 6 { path: '/detail/:id' , name: 'detail' , meta: { keepAlive : true }, component: () => import ('../pages/detail/index' ) }
S2: 路由跳转模式:
1 2 3 4 5 6 7 8 this .$router.push( { name: 'Detail' , params: { id } } )
S3: 获取参数方式:
1 let detailId = this .$route.params.id
注意:此方式传参 路由设置方式中的 id 可以传也可以不传,不传刷新页面id 会丢失该方式刷新页面id 不丢失
第三种
S1: 路由设置方式:
1 2 3 4 5 6 { path: '/detail' , name: 'detail' , meta: { keepAlive : true }, component: () => import ('../pages/detail/index' ) }
S2: 路由跳转模式:
1 2 3 4 5 6 7 8 this .$router.push( { path: 'Detail' , query: { id } } )
S3: 获取参数方式:
1 let detailId = this .$route.query.id
注意:此方式传参 路由设置方式中的 id 不能写,因为写了就是router 的一部分,这样就会匹配不到, 此方式刷新页面id 不丢失
http://localhost:8080/#/detail?id=1
总结: params一旦设置在路由,params就是路由的一部分,如果这个路由有params传参,但是在跳转的时候没有传这个参数,会导致跳转失败或者页面会没有内容。
相关链接
一篇文章带你了解vue路由
vue3.0路由跳转
vue3中怎么使用router路由呢&页面跳转传参怎么搞呢
Vue3使用vue-router如何实现路由跳转与参数获取
=================我是分割线=================
欢迎到公众号来唠嗑: