后端的路由:接口和服务器的映射关系,
前端路由:路径和组件的映射关系
前端路由作用: 实现业务场景切换
自动安装:在创建项目的时候在交互式命令行中选中Router 脚手架就会自动安装vue-router
手动安装:
步骤代码示例:
//安装 npm i vue-router -S //导入路由 import VueRouter from 'vue-router' //使用路由插件 Vue.use(VueRouter) //创建路由规则数组 const routes = [ { path: "/find", component: Find }, { path: "/my", component: My }, { path: "/part", component: Part } ] //创建路由对象 - 传入规则 const router = new VueRouter({ routes}) //关联到vue实例 new Vue({ router }) //占坑 <router-view></router-view>
使用a标签的href实现页面跳转:<a href="#/index">a链接跳转</a>
使用声明式导航router-link跳转:声明式导航的本质就是通过标签来进行页面跳转,vue-router提供了一个全局组件 router-link,router-link实质上最终会渲染成a链接 to属性等价于提供 href属性(to无需#),router-link tag属性是用来解析是什么元素,默认是a标签,router-link提供了声明式导航高亮的功能(自带类名)
<div> //声明导航to后面不加# <router-link to="/my">我的</router-link><br /> <router-link to="/home">jiajia</router-link><br /> <router-link to="/find">发现</router-link><br /> </div> // .router-link-active是router-link自带类名 <style scoped> .router-link-active { color: red; font-size: 50px; } </style>
声明式导航跳转传参
//在router-link上的to属性传值, // /path/值 – 需要路由对象提前配置 path: “/path/参数名” <router-link to="/my?name=zlj">我的</router-link> <router-link to="/my/小丽">我的</router-link> <script> { path: "/part", component: Part }, { path: "/part/:username", // 有:的路径代表要接收具体的值 component: Part }, </script> //对应页面组件接收传递过来的值 - $route.query.参数名 - $route.params.参数名 <p>人名: {{ $route.query.name }} -- {{ $route.params.username }}</p> //query和params用法区别 ?key=value 用$route.query.key 取值 /值 提前在路由规则/path/:key 用$route.params.key 取值
编程式导航跳转:
本质就是通过代码来进行跳转,想要导航到不同的 URL,则使用 router.push
方法
//语法 this.$router.push({ path: "路由路径", // 都去 router/index.js定义 name: "路由名" }) //代码示例 <script> export default { methods:{ btn(){ this.$router.push({ path:'/find' }) } } }; </script> //配合js代码进行跳转 <div> 用户名:<input type="text" /> 密码:<input type="text" /> <button @click='btn'>登录</button> </div>
编程式导航跳转传参:
//语法 <script> this.$router.push({ path: "路由路径" name: "路由名", query: { "参数名": 值 } params: { "参数名": 值 } }) //代码示例 methods: { btn() { this.$router.push({ // path:'/my', name: "My", query: { username: "哈哈", }, }); }, }, </script> // 对应路由接收 $route.params.参数名 取值 // 对应路由接收 $route.query.参数名 取值
$route是当前页面路由信息对象,记录参数等,$router是创建的全局路由对象
1.router.push(location)用法见编程式导航
2.router.replace(location):
跟 router.push
很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。
声明式 | 编程式 |
---|---|
<router-link :to="..." replace> | router.replace(...) |
3.router.go(n):
这个方法的参数是一个整数,意思是在 history 记录中向前或者后退多少步,类似 window.history.go(n)
,n代表的是前进后退的步数
// 在浏览器记录中前进一步,等同于 history.forward() router.go(1) // 后退一步记录,等同于 history.back() router.go(-1) // 前进 3 步记录 router.go(3)
hash模式:hash发生变化的url都会被浏览器记录下来,从而你会发现浏览器的前进后退都可以用了,同时点击后退时,页面字体颜色也会发生变化。这样一来,尽管浏览器没有请求服务器,但是页面状态和url一一关联起来,后来人们给它起了一个霸气的名字叫前端路由,成为了单页应用标配。
history模式:history api可以分为两大部分:切换和修改
切换历史状态:包括back、forward
、go
三个方法,对应浏览器的前进,后退,跳转操作
history.go(-2);//后退两次 history.go(2);//前进两次 history.back(); //后退 hsitory.forward(); //前进
路由404页面:有时,我们可能会输入错的 url, 或者不再存在等各种原因导致其不再能被访问,那么我们就可以对于这种情况进行重定向。 很简单,只要在路由中添加下面的代码就可以了:404的路由规则要定在规则数组的最后面,配置代码示例:
<script> import NotFound from '@/views/NotFound' const routes = [ // 404在最后(规则是从前往后逐个比较path) { path: "*", component: NotFound } ] </script>
路由重定向redirect:路由重定向表示将你原来在转发列表中发向一台路由的路径改成另外一条路径, 匹配path后, 强制切换到目标path上
const routes = [ { path: "/", // 默认hash值路径 redirect: "/find" // 重定向到/find } ]
路由嵌套: 在现有的一级路由下, 再嵌套二级路由,
什么是二级路由: 在现有的一级路由下, 再嵌套二级路由
如何配置二级路由: 在现有的一级路由下, 再嵌套二级路由
代码示例:
注意:路由嵌套中router-link to后面的路由路径一定要和二级路由也就是子路由path后面的路由路径一致
<div> <!-- <h1>我是独一无二的</h1> --> <router-link to="/home/list">列表</router-link> <router-link to="/home/history">历史</router-link> <router-link to="/home/change" @click="btn('/my','My')">变化</router-link> <div> <router-view></router-view> </div> </div> <script> { path: '/home', component: Home, children: [{ path: '/home/list', component: List }, { path: '/home/history', component: History }, { path: '/home/change', component: Change } ] } </script>
目的: 路由跳转之前, 先执行一次前置守卫函数, 判断是否可以正常跳转,类似于拦截器,需要对‘身份’进行验证
const isLogin = true; // 登录状态(未登录) router.beforeEach((to, from, next) => { if (to.path === "/my" && isLogin === false) { alert("请登录") next(false) // 阻止路由跳转 } else { next() // 正常放行 } })