Vue Router

2019-04-30  本文已影响0人  岁月静好_cd54

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
上一篇下一篇

猜你喜欢

热点阅读