zoukankan      html  css  js  c++  java
  • Vue 路由

    路由 

    https://router.vuejs.org/zh-cn/advanced/navigation-guards.html

    // 将路由加入全局。当然你也可以使用 this.$router 来调用实例
    window.router = router;
    //跳转 router.push("bar")
    //配置路由参数 {path:'/order/:id',component:require('./views/orderDetails')}
    //在<template>中获取参数 {{$route.params.id}}
    //在script中获取参数 console.log(this.$route.params.id)

    router.js

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    
    Vue.use(VueRouter)
    
    /*  配置路由规则 */
    const map = [
        // 重定向
        {path:'/index',redirect: '/'},
        // 路由根路径
        {path:'/',component:require('./views/index'),
            // 定义子路由
            children:[
                {path:'/order',component:require('./views/order')},            
                {path:'/card',component:require('./views/card')},
                {path:'/add',component:require('./views/add')},
                {path:'/form',component:require('./views/form')},
                {path:'/repay',component:require('./views/repay')},
                {path:'/protocol',component:require('./views/protocol')}
            ]
        },
        // 正常路由
        {path:'/order/:id',component:require('./views/orderDetails')}
    ]
    
    /* 实例化路由 */
    const router = new VueRouter({
        routes : map
    })
    
    router.afterEach((to, from) => {
        //console.log(to, from)
    })
    
    export default router;

     

     main.js

    import Vue from 'vue'
    import router from './router'         //路由相关
    window.router = router; //路由文件
    const app = new Vue({ router }).$mount('#app') 

      

    根目录index.html,添加一个div#app 标签。

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>vue-test</title>
      </head>
      <style>
          body,html{margin:0;padding:0;}
      </style>
      <body>
          <div id="app">
            <transition name="fade">
                <router-view ></router-view>
            </transition>
        </div>
      </body>
    </html>

     

    index.vue 演示子路由

    <template>
      <div class="hello container">
        <nav-header :_title="mytitle" :left="false"></nav-header> 
        <div class="mui-content">
           <router-link to="order">order</router-link>
          
           <transition name="fade">
              <router-view  keep-alive></router-view>
           </transition>  
         </div>
      </div>
    </template>

     

    扩展:演示懒加载路由

    http://router.vuejs.org/zh-cn/advanced/lazy-loading.html

    const Foo = resolve => require(['./Foo.vue'], resolve)
    
    const router = new VueRouter({
      routes: [
        { path: '/foo', component: Foo }
      ]
    })

     扩展:组件中的路由钩子

    beforeRouteEnter (to, from, next) {
      next(vm => {
        vm.backPath = from.path
      })
    }
    
    beforeRouteLeave  (to, from, next) {
        window.clearInterval(this.getMaxTimer);
        next();
    },

     扩展:在默认的情况下当<router-link>对应的路由匹配成时,就会自动设置class属性值为.router-link-active,当然可以自定义自己喜欢的类名,比如fuck-active

    常见的使用场景是在网页底部的tab-tag中。

    <router-link :to="{name: 'Home'}" tag='li' active-class='fuck-active'>
      <div><img src="../assets/images/home.png"></div>
      <div>首页</div>
    </router-link>
    
    # 但每个tab-tag都写上就不够DRY了。有一个技巧是在VueRouter的全局配置中书写,但请斟酌:
    const router = new VueRouter({
      // ...other prototype
      linkActiveClass: 'fuck-active'
    })

    路由可选参数的坑: 

    复制代码
    # 如果该参数是动态的数值,直接加入‘?’即可
    /houseBusinessDetails/:id?
    
    # 但如果是固定的数值,则需要加入()?才可以
    /houseBusinessDetails/(id)?/:id?

    # 正则表达式加可选参数
    /myBusiness/:tag([0-2]?)

    让路由与状态融合的插件:vuex-router-sync

    import { sync } from 'vuex-router-sync'
    import router from './router'
    sync(store, router)

    把 vue-router 的狀態放進 vuex 的 state 中,這樣就可以透過改變 state 來進行路由的一些操作

    复制代码
    import * as type from './mutation-types.js'
    
    const mutations = {
        [type.IS_LOADING] (state, b) {
            console.log(state.route)  // 打印出路由的实例,那么我们就可以通过它来改变路由地址,为所欲为了
            state.is_loading = b;
        }
    }
    export default mutations; 

    常用的组件内的路由钩子

    复制代码
    beforeRouteEnter (to, from, next) {
        next(vm => {
          if (from.path === '/myBusiness') vm.$router.push('/')
          next()
        })
    }

    路由使用  

    // 路由超链接   ,注意这个to,如果是纯字符串的时候直接to="xxxx",如果是变量的时候再使用:to
    
     <router-link :to=backPath :class=backPath ></router-link> 
    
    //加入全局变量,这样才能在其他地方调用
    window.router = router
    
    //跳转
    router.push("bar")
    
    //可以使用afterEach + vuex 来实现动态获取后退页面的地址
    router.afterEach((to, from) => {
       console.log(to, from)
    })
    
    //可以使用beforeEach 来拦截页面  并且进行一些操作之后再放行next()
    router.beforeEach((to,from,next) => {
      console.log(to,from);
      next(); //放行
    })
    
    //children子路由,当我们在order页面中加入 <router-view> 时,orderDetails 页面 会从该 <router-view> 中进出
     {
    
          path:'/order',component:require('./views/order'),
      children:[
        {path:':id',component:require('./views/orderDetails')}
      ] 
     }  
    
     /*  再来一个子路由的demo: 
    
          上面的demo中,不知为何?如果直接写上:id ,会直接将子路由配置的页面显示在父页面中。
    
           所以我换成这个demo的就可以了。只有等我点击才出现在父页面. */
    
     {path:'/astro',component:require('./views/astro/index'),children:[{path:'/astro/:consName',component:require('./views/astro/info')}]}
    
     
    
      // 监听路由页面进入事件
    
      beforeRouteEnter:(to, from, next) => {
        // 在渲染该组件的对应路由被 confirm 前调用
        // 不!能!获取组件实例 `this`
        // 因为当钩子执行前,组件实例还没被创建
        next( vm => {
          vm.$parent.route_pipe(true);
        });
      },
    
      // 监听路由页面的退出事件  
    
      beforeRouteLeave (to, from, next) {
        console.log(this); 
        next(); 
      },
    
    //如果两个页面都是通过同一个 <router-view> 进出,那么他们的动画事件(enter/leave)会同时触发,尽管某些场景下能实现华丽的效果。
    //但某些场景你不想被混淆,譬如层层嵌套的界面:index->order->orderDetails.类似这种页面结构,应该使用嵌套路由 + chilren路由配置,参考上面的子路由demo 

  • 相关阅读:
    使用net start mysql的时候出现服务名无效的原因及解决办法
    Appium的安装
    cpu
    单例模式
    Java中Synchronized的用法(简单介绍)
    java随机数Reandom(简单介绍)
    多线程面试题
    线程和进程有什么区别(简单介绍)
    java多线程(简单介绍)
    servlet三种方式实现servlet接口
  • 原文地址:https://www.cnblogs.com/CyLee/p/8425105.html
Copyright © 2011-2022 走看看