美文网首页
Vue Router

Vue Router

作者: 岁月静好_cd54 | 来源:发表于2019-04-30 10:47 被阅读0次

    Router

    router 基础

    router配置文件 一个节点包含内容

    
    Vue.use(Router)
    
    export default new Router({
    
      mode: 'history', //去掉路由上的hash:"history",默认
    
      base: process.env.BASE_URL,
    
      /*可以加上link的值,不是强制性,区分页面路径与其他路径之类的,比如加入默认值 /base/*/
    
      linkActiveClass: '', //全局link上激活的时候样式(二级菜单选中的时候,以及菜单也会显示)
    
      linkExactActiveClass: "", //link上全部匹配的时候的样式
    
      routes: [{
    
          path: '/',
    
          name: 'home',
    
          redirect: '/home',
    
          /*跳转*/
    
          /*components:{default:defaultComponent,Aroutername:Acomponent} 在页面中有俩个 router-view的时候 且对应的name属性*/
    
          component: Home,
    
          children: [{
    
            /*二级路由,一级组件里面的router-view*/
    
          }],
    
          /*router 操作
    
          scrollBehavior(to, from, savedPostiton) {
    
            //保存的原来的scroll 的位置
    
            return {
    
              x: 0,
    
              y: 0
    
            }
    
            //return savedPosition
    
          },
    
          parseQuery(query) {},
    
          fallback: true,
    
          stringifyQuery(obj) {}*/
    
          name:"home",// 对应router-link 里面对象name
    
          /*跟路由相关的信息,可以在路由进入页面的时候相关取到*/
    
          meta:{
    
            title:"this is app",
    
            description:"des"
    
          }
    
        },
    
        {
    
          path: '/about/:urlId',
    
          props:true,/*在组件中可以直接当作props
    
          里面的数据*/
    
          /* props:{urlId:'3333'}, props 书写方式2*/ 
    
          /* props:(route)=>({urlId:route.query.b}), props 书写方式3*/
    
          name: 'about',
    
          /*懒加载,到达该path的时候才会加载对应的router.js*/
    
          component: () => import( /* webpackChunkName: "about" */ './views/About.vue')
    
        }
    
      ]
    
    })
    
    

    vue html 里面的router-view

    
    <router-link to="/about">About</router-link>
    
    <router-link to="/about/123">About</router-link>
    
    /*query:a=aaa,b=bbb*/
    
    /*params:urlId=123*/
    
    <router-link to="/about/123?a=aaa&b=bbb">About</router-link>
    
    <router-link :to="{name:'app'}">About</router-link>
    
    <router-view name='Aroutername'/>
    
    /*rotuer 页面显示的时候添加动画效果:name为动画对应的class name*/
    
    <transition name="fade">
    
      <router-view />
    
    </transition>
    
    

    组件内部的操作

    
    mounted:{
    
      console.log(this.$router)//任何组件取得的rotuer信息都是一致的
    
    }
    
    /***************************************/
    
    props:["urlId"]
    
    mounted:{
    
      console.log(this.urlId)//取得router里面的pramas信息,可以实现解耦
    
    }
    
    /******************************************/
    
    

    router 高级信息

    router 配置

    
    /*********main.js 注入router进去app的时候同级配置***************/
    
    /************(router的全局钩子) 每次路由跳转的时候都会被调用的方法**************** */
    
    /*跳转被调用之前进行一些校验 比如验证有些页面需要登陆才会进入等*/
    
    router.beforeEach((to, from, next) => {
    
        console.log("before each invoked")
    
        next()
    
        //  if (to.fullPath === '/app') {
    
        //      next({
    
        //          path: "/login",
    
        //          replace: true /*history 是否存储 ,浏览器后退等作用 */
    
        //      } /*router配置里面的一个路由对象 */ )
    
        //  } else {
    
        //      next();
    
        //  }
    
    })
    
    router.beforeResolve((to, from, next) => {
    
        console.log("before resolve invoked")
    
        next()
    
    })
    
    /*跳转完成后  */
    
    router.AfterEach((to, from) => {
    
        console.log("after each invoked")
    
    })
    
    
    
      /*****router定义的时候每一个路由中的 配置*****/
    
    routes: [{
    
        path: '/',
    
        name: 'home',
    
        component: Home,
    
        /****before enter*****/
    
        beforeEnter(to, from, next) {
    
            console.log('app route before enter')
    
            next()
    
        }
    
    }]
    
    与上一个事件同步的执行顺序
    
    before each invoked,(BeforeEach 事件)
    
    app route before enter,(app route配置里面的beforeEnter事件)
    
    before resolve invoked(beforeResolve 事件)
    
    after each invoked(AfterEach 事件)
    
    
    
      /*******components 定义路由事件响应***********/
    
      beforeReouteEnter(to, from, next) {
    
        /*拿不到组件中的this,组件还没有create*/
    
            console.log("componment before enter")
    
            next()
    
            /*组件被create之后操作数据对象等 this已经存在*/
    
            next(vm=>{
    
              console.log("component after enter this.id is "+vm.urlId)
    
            })
    
        },
    
        /*同一个组件,不同的路由下面显示的时候,比如传递的参数不一样urlId*/
    
        /*组件中的内容根据不同的参数显示不同的内容的时候变更,watch也能实现,复杂度高,*/
    
        beforeReouteUpdate(to, from, next) {
    
            console.log("componment  update enter")
    
            next()
    
            /*组件被create之后操作数据对象等 this已经存在*/
    
            next(vm=>{
    
              console.log("component after enter this.id is "+vm.urlId)
    
            })
    
        },
    
        /*提醒表达离开时候的提醒 confirm等*/
    
        beforeReouteLeave(to, from, next) {
    
            console.log("componment leave enter")
    
            next()
    
            if(confirm('are you sure?'))
    
            {
    
              next()
    
            }
    
        },
    
        methods: {},
    
        data {},
    
        props {},
    
      与上一个事件同步的执行顺序
    
    before each invoked,(BeforeEach 事件)
    
    app route before enter,(app route配置里面的beforeEnter事件)
    
    component before enter(component 内部的beforeRouteEnter事件触发)
    
      component update enter(component 内部的beforeRouteUpdate事件触发)(不同路由之间的同一个组件会有缓存,需要更新数据)
    
    before resolve invoked(beforeResolve 事件)
    
    after each invoked(AfterEach 事件)
    
    
    
    /********比较用途******/
    
    mounted:
    
    {
    
      /*相同组件不同参数之间切换不会被调用,所以需要用
    
      beforeRouteUpdate, 可以用watch 效果不好
    
      */
    
      console.log("todo.mounted");
    
    
    
    }
    
    

    热加载(lazy)

    
    component: () => import( /* webpackChunkName: "about" */ './views/About.vue')
    
    

    路由解耦Props

     routes: [
        { path: '/user/:id', component: User, props: true },
    
        // 对于包含命名视图的路由,你必须分别为每个命名视图添加 props 选项:
        {
          path: '/user/:id',
          components: { default: User, sidebar: Sidebar },
          props: { default: true, sidebar: false }
        }
      ] 
    
    

    路由跳转router.push(...)方法

    push 后面可以是对象,也可以是字符串: 
    // 字符串
    this.$router.push('/home/first')
    // 对象
    this.$router.push({ path: '/home/first' })
    // 命名的路由
    this.$router.push({ name: 'home', params: { userId: wise }})
      
    // 点击事件里面写
    this.$router.push({ name: 'distributesList', query: { ruleForm: this.ruleForm }})
     
    
    // 字符串
    router.push('apple')
    // 对象
    router.push({path:'apple'})
    // 命名路由
    router.push({name: 'applename'})
    //直接路由带查询参数query,地址栏变成 /apple?color=red
    router.push({path: 'apple', query: {color: 'red' }})
    // 命名路由带查询参数query,地址栏变成/apple?color=red
    router.push({name: 'applename', query: {color: 'red' }})
    //直接路由带路由参数params,params 不生效,如果提供了 path,params 会被忽略
    router.push({path:'applename', params:{ color: 'red' }})
    // 命名路由带路由参数params,地址栏是/apple/red
    router.push({name:'applename', params:{ color: 'red' }})
    

    <router-link :to="...">

    // 字符串
    <router-link to="apple"> to apple</router-link>
    // 对象
    <router-link :to="{path:'apple'}"> to apple</router-link>
    // 命名路由
    <router-link :to="{name: 'applename'}"> to apple</router-link>
    //直接路由带查询参数query,地址栏变成 /apple?color=red
    <router-link :to="{path: 'apple', query: {color: 'red' }}"> to apple</router-link>
    // 命名路由带查询参数query,地址栏变成/apple?color=red
    <router-link :to="{name: 'applename', query: {color: 'red' }}"> to apple</router-link>
    //直接路由带路由参数params,params 不生效,如果提供了 path,params 会被忽略
    <router-link :to="{path: 'apple', params: { color: 'red' }}"> to apple</router-link>
    // 命名路由带路由参数params,地址栏是/apple/red
    <router-link :to="{name: 'applename', params: { color: 'red' }}"> to apple</router-link>
    
    1、关于带参数的路由总结如下: 
    无论是直接路由“path" 还是命名路由“name”,带查询参数query,地址栏会变成“/url?查询参数名:查询参数值“;
    直接路由“path" 带路由参数params params 不生效;
    命名路由“name" 带路由参数params 地址栏保持是“/url/路由参数值”; 
    2、设置路由map里的path值: 
     带路由参数params时,路由map里的path应该写成:  path:'/apple/:color' ;
     带查询参数query时,路由map里的path应该写成: path:'/apple' ; 
    3、获取参数方法: 
    在组件中:  {{$route.params.color}}
    在js里: this.$route.params.color
    

    相关文章

      网友评论

          本文标题:Vue Router

          本文链接:https://www.haomeiwen.com/subject/biemnqtx.html