目录
浏览器历史记录的操作模式:push模式
对历史记录的操作除了有push模式还有一种replace模式,就是每次都替换掉栈顶元素
只需要在router-link标签里添加replace属性就行
1. 作用:控制路由跳转时操作浏览器历史记录的模式
2. 浏览器的历史记录有两种写入方式:分别为```push```和```replace```,```push```是追加历史记录,```replace```是替换当前记录。路由跳转时候默认为```push```
3. 如何开启```replace```模式:```
News ```
需求如下:
新增按钮并绑定事件,传入 m(messageList中的元素)参数获取数据。
定义事件方法,使用push和replace方法携带数据实现跳转(体会编程式路由导航)
在顶部实现浏览器的前进和后退($router中的back()和forword()方法)
还有一个go()方法,这个方法要传入一个数字n,如果是正数则相当于连点n次前进,如果是负数则相当于退回n次。
./components/Banner.vue
- <template>
- <div class="col-xs-offset-2 col-xs-8">
- <div class="page-header">
- <h2>Vue Router Demoh2>
- <button @click="back">后退button>
- <button @click="forward">前进button>
- <button @click="test">测试一下gobutton>
- div>
- div>
- template>
-
- <script>
- export default {
- name:'Banner',
- methods: {
- back(){
- this.$router.back()
- // console.log(this.$router)
- },
- forward(){
- this.$router.forward()
- },
- test(){
- this.$router.go(3)
- }
- },
- }
- script>
1. 作用:不借助```
```实现路由跳转,让路由跳转更加灵活 2. 具体编码:
//$router的两个API this.$router.push({ name:'xiangqing', params:{ id:xxx, title:xxx } }) this.$router.replace({ name:'xiangqing', params:{ id:xxx, title:xxx } }) this.$router.forward() //前进 this.$router.back() //后退 this.$router.go() //可前进也可后退
在news后面添加输入框,因为路由跳转之后。原先的路由组件就会被销毁,所以切换到message之后再切换回来,组件会被重新挂载,输入框里的东西会消失。怎么办?
使用
使用include属性可以决定哪个组件会被缓存(include属性写的是组件名)
还可以通过数组的形式缓存多个路由组件
./pages/Home.vue
- <template>
- <div>
- <h2>Home组件内容h2>
- <div>
- <ul class="nav nav-tabs">
- <li>
- <router-link class="list-group-item" active-class="active" to="/home/news">Newsrouter-link>
- li>
- <li>
- <router-link class="list-group-item" active-class="active" to="/home/message">Messagerouter-link>
- li>
- ul>
-
- <keep-alive :include="['News','Message']"/>
-
-
- <keep-alive include="News">
- <router-view>router-view>
- keep-alive>
- div>
- div>
- template>
-
- <script>
- export default {
- name:'Home',
- }
- script>
1. 作用:让不展示的路由组件保持挂载,不被销毁。
2. 具体编码:
<keep-alive include="News"> <router-view>router-view> keep-alive>
./pages/News.vue
- <template>
- <ul>
- <li :style="{opacity}">欢迎学习vueli>
- <li>news001 <input type="text">li>
- <li>news002 <input type="text">li>
- <li>news003 <input type="text">li>
- ul>
- template>
-
- <script>
- export default {
- name:'News',
- data(){
- return{
- opacity:1
- }
- },
- activated(){
- console.log('News组件被激活了')
- this.timer = setInterval(() => {
- this.opacity -= 0.01
- if(this.opacity <= 0) this.opacity = 1
- },16)
- },
- deactivated(){
- console.log('News组件失活了')
- clearInterval(this.timer)
- }
- }
- script>
使用keep-alive缓存后将不会触发销毁了,使用 deactivated可使其失活,使用activated再次激活。vue之组件的激活activated与失活deactivated
1. 作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。
2. 具体名字:
1. ```activated```路由组件被激活时触发。被 keep-alive 缓存的组件激活时调用。初始化操作放在actived里面。
2. ```deactivated```路由组件失活时触发。被 keep-alive 缓存的组件停用时调用。在deactived里面,在里面进行一些善后操作。
添加keep-alive标签后会增加activated和deactivated这两个生命周期函数,初始化操作放在actived里面,一旦切换组件,因为组件没有被销毁,所以它不会执行销毁阶段的钩子函数,所以移除操作需要放在deactived里面,在里面进行一些善后操作,这个时候created钩子函数只会执行一次,销毁的钩子函数一直没有执行。
有时候不是所有的导航项都是可以点击的,此时得符合某些要求才可以点击并呈现相关组件。
1. 作用:对路由进行权限控制
src/router/index.js
:
- //该文件专门用于创建整个应用的路由器
- import VueRouter from "vue-router";
- //引入组件
- import Home from '../pages/Home'
- import About from '../pages/About'
- import News from '../pages/News'
- import Message from '../pages/Message'
- import Detail from '../pages/Detail'
-
- //创建一个路由器
- const router = new VueRouter({
- routes:[
- {
- name:'guanyv',
- path:'/about',
- component:About,
- meta:{title:'关于'}
- },
- {
- name:'zhuye',
- path:'/home',
- component:Home,
- meta:{title:'主页'},
- children:[
- {
- name:'xinwen',
- path:'news',
- component:News,
- meta:{isAuth:true,title:'新闻'}
- },
- {
- name:'xiaoxi',
- path:'message',
- component:Message,
- meta:{isAuth:true,title:'消息'},
- children:[
- {
- name:'xiangqing',
- path:'detail',
- component:Detail,
- meta:{isAuth:true,title:'详情'},
- props($route){
- return {
- id:$route.query.id,
- title:$route.query.title,
- }
- }
- }
- ]
- }
- ]
- }
- ]
- })
-
- //全局前置路由守卫————初始化的时候、每次路由切换之前被调用
- router.beforeEach((to,from,next) => {
- console.log('前置路由守卫',to,from)
- if(to.meta.isAuth){
- if(localStorage.getItem('school')==='atguigu'){
- next()
- }else{
- alert('学校名不对,无权限查看!')
- }
- }else{
- next()
- }
- })
-
- //全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
- router.afterEach((to,from)=>{
- console.log('后置路由守卫',to,from)
- document.title = to.meta.title || '硅谷系统'
- })
-
- //导出路由器
- export default router
- //全局前置守卫:初始化时执行、每次路由切换前执行
- router.beforeEach((to,from,next)=>{
- console.log('beforeEach',to,from)
- if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制
- if(localStorage.getItem('school') === 'atguigu'){ //权限控制的具体规则
- next() //放行
- }else{
- alert('暂无权限查看')
- // next({name:'guanyu'})
- }
- }else{
- next() //放行
- }
- })
-
- //全局后置守卫:初始化时执行、每次路由切换后执行
- router.afterEach((to,from)=>{
- console.log('afterEach',to,from)
- if(to.meta.title){
- document.title = to.meta.title //修改网页的title
- }else{
- document.title = 'vue_test'
- }
- })
src/router/index.js
:
- //该文件专门用于创建整个应用的路由器
- import VueRouter from "vue-router";
- //引入组件
- import Home from '../pages/Home'
- import About from '../pages/About'
- import News from '../pages/News'
- import Message from '../pages/Message'
- import Detail from '../pages/Detail'
-
-
- //创建一个路由器
- const router = new VueRouter({
- routes:[
- {
- name:'guanyv',
- path:'/about',
- component:About,
- meta:{title:'关于'}
- },
- {
- name:'zhuye',
- path:'/home',
- component:Home,
- meta:{title:'主页'},
- children:[
- {
- name:'xinwen',
- path:'news',
- component:News,
- meta:{title:'新闻'},
- //独享守卫,特定路由切换之后被调用
- beforeEnter(to,from,next){
- console.log('独享路由守卫',to,from)
- if(localStorage.getItem('school') === 'atguigu'){
- next()
- }else{
- alert('暂无权限查看')
- }
- }
- },
- {
- name:'xiaoxi',
- path:'message',
- component:Message,
- meta:{title:'消息'},
- children:[
- {
- name:'xiangqing',
- path:'detail',
- component:Detail,
- meta:{title:'详情'},
- props($route){
- return {
- id:$route.query.id,
- title:$route.query.title,
- }
- }
- }
- ]
- }
- ]
- }
- ]
- })
-
- //全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
- router.afterEach((to,from)=>{
- console.log('后置路由守卫',to,from)
- document.title = to.meta.title || '硅谷系统'
- })
-
- //导出路由器
- export default router
- beforeEnter(to,from,next){
- console.log('beforeEnter',to,from)
- if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制
- if(localStorage.getItem('school') === 'atguigu'){
- next()
- }else{
- alert('暂无权限查看')
- // next({name:'guanyu'})
- }
- }else{
- next()
- }
- }
src/pages/About.vue
:
- <template>
- <h2>我是About组件的内容h2>
- template>
-
- <script>
- export default {
- name:'About',
- //通过路由规则,离开该组件时被调用
- beforeRouteEnter (to, from, next) {
- console.log('About--beforeRouteEnter',to,from)
- if(localStorage.getItem('school')==='atguigu'){
- next()
- }else{
- alert('学校名不对,无权限查看!')
- }
- },
- //通过路由规则,离开该组件时被调用
- beforeRouteLeave (to, from, next) {
- console.log('About--beforeRouteLeave',to,from)
- next()
- }
- }
- script>
- //进入守卫:通过路由规则,进入该组件时被调用
- beforeRouteEnter (to, from, next) {
- },
- //离开守卫:通过路由规则,离开该组件时被调用
- beforeRouteLeave (to, from, next) {
- }
1. 对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值。
2. hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器。
1. 地址中永远带着#号,不美观 。
2. 若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。
3. 兼容性较好。
1. 地址干净,美观 。
2. 兼容性和hash模式相比略差。
3. 应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题。