VueRouter学习笔记1.0

VueRouter

官方定义

tip:Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。 — 官方定义
VueRouter 是 SPA(单页应用)的路径管理器,它允许我们通过不同的 URL 访问不同的内容

模块化打包系统下的安装

必须显式地通过Vue.use()来安装:

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

基本使用

Vue.js + VueRouter构建应用
Vue.js让我们可以通过组合组件来组成应用程序
想要把VueRouter加进来,需要将component映射到routes
然后告诉VueRouter在哪里渲染它们。

VueRouter两个内置组件:

  • <router-link>:用于设置导航链接,切换不同HTML内容。to表示目标地址,即要显示的内容;
  • <router-view>:渲染路由匹配到的组件内容;
    使用例子:
<div id="app">
    <div>
      <router-link to="/index">首页</router-link>
      <router-link to="/article">文章</router-link>
    </div>
    <router-view></router-view>
</div>

/*
	定义组件 Index,Article
*/
const Index = Vue.component('index', {
  template: '<div>Hello,欢迎使用慕课网学习 Vue 教程!</div>',
})
const Article = Vue.component('myArticle', {
  template: `<ul><li>1. Vue 计算属性的学习</li><li>2. React 基础学习</li></ul>`,
})

/*
	定义路由数组
*/
const routes = [
  { path: '/index', component: Index },
  { path: '/article', component: Article }
]

/*
	使用路由数组,创建路由实例
*/
const router = new VueRouter({
  routes: routes
})

/*
	通过router配置注入路由
*/
var vm = new Vue({
  el: '#app',
  router: router,
  data() {
    return {}
  }
})

嵌套路由

/*
	要配置嵌套路由,需要在配置的参数中使用children属性
*/
{
    path: '路由地址',
    component: '渲染组件',
    children: [
      {
        path: '路由地址',
        component: '渲染组件'
      }
    ]
  }

使用例子:

 <div id="app">
    <div>
      <router-link to="/index">首页</router-link>
      <router-link to="/article">文章</router-link>
    </div>
    <router-view></router-view>
  </div>
const Index = Vue.component('index', {
  template: '<div>Hello,欢迎使用慕课网学习 Vue 教程!</div>',
})

const Article = Vue.component('myArticle', {
  template: `<div>
      <div>
        <router-link to="/article/vue">vue</router-link>
        <router-link to="/article/react">react</router-link>
      </div>
      <router-view></router-view>
    </div>`,
})

const VueArticle = Vue.component('vueArticle', {
  template: `<ul><li>1. Vue 基础学习</li><li>2. Vue 项目实战</li></ul>`,
})

const ReactArticle = Vue.component('reactArticle', {
  template: `<ul><li>1. React 基础学习</li><li>2. React 项目实战</li></ul>`,
})

const routes = [
  { path: '/index', component: Index },
  { 
    path: '/article', 
    component: Article ,
    children: [
      {
        path: 'vue', 
        component: VueArticle ,
      },
      {
        path: 'react', 
        component: ReactArticle ,
      }
    ]
  }
]

const router = new VueRouter({
  routes: routes
})

  var vm = new Vue({
    el: '#app',
    router,
    data() {
    	return {}
    }

不希望使用嵌套路径的情况

/*
	以'/'开头的嵌套路径会被当作根路径
	我们访问'/vueArticle'就相当于访问之前的'/article/vue'
*/
const routes = [
  { path: '/index', component: Index },
  { 
    path: '/article', 
    component: Article ,
    children: [
      {
        path: '/vueArticle', 
        component: VueArticle ,
      },
      {
        path: '/reactArticle', 
        component: ReactArticle ,
      }
    ]
  }
]

编程式导航

重点:pushreplacego三种方法的使用与区别

router.push

有时候,我们可能需要通过onclick事件进行跳转,也就是通过JS跳转。
示例:

<div id="app">
    <div>
      <button @click="jump('index')">首页</button>
      <button @click="jump('article')">文章</button>
    </div>
    <router-view></router-view>
</div>
/*
	组件的定义
*/
const Index = Vue.component('index', {
  template: '<div>Hello,欢迎使用慕课网学习 Vue 教程!</div>',
})

const Article = Vue.component('myArticle', {
  template: `<ul><li>1. Vue 计算属性的学习</li><li>2. Vue 侦听器的学习</li></ul>`,
})
/*
	路由数组
*/
const routes = [
  { path: '/index', component: Index },
  { path: '/article', component: Article }
]
/*
	路由实例
*/
const router = new VueRouter({
  routes: routes
})
/*
	Vue实例
	跳转函数的编写
	push
*/
var vm = new Vue({
    el: '#app',
    router,
    data() {
    	return {}
    },
    methods: {
      jump(name) {
        this.$router.push(name)
      }
    }
  })
对象格式的参数
// 字符串形式的参数
router.push('home')
// 通过路径描述地址
router.push({ path: 'home' })
// 通过命名的路由描述地址
router.push({ name: 'user' }})
//还可以有其他属性,如查询参数params、query。
router.replace

push唯一的不同:不会向history添加新纪录,而是跟它的方法名一样,替换当前的history记录。
示例:

/*
	改写上一个示例
*/
 methods: {
      jump(name) {
        this.$router.replace(name)
      }
router.go

参数是一个整数,意思是history记录中前进或后退。
示例:

// 在浏览器记录中前进一步
router.go(1)
// 后退一步记录
router.go(-1)
// 前进 3 步记录
router.go(3)
// 如果 history 记录不够用,路由将不会进行跳转
router.go(-100)
router.go(100)

命名路由

重点:如何定义命名路由、如何利用命名路由实现路由跳转

定义
const router = new VueRouter({
  routes: [
    {
      path: '/user',
      name: 'user',
      component: '[component-name]'
    }
  ]
})
<router-link>跳转命名路由

实际上to属性可以接收一个对象

<router-link :to="{path: 'path'}">...</router-link>
<router-link :to="{name: 'name'}">...</router-link>
编程式导航跳转命名路由
 methods: {
      jump(name) {
        this.$router.push({
          name: name
        })
      }
    }

命名视图

重点:定义命名视图、使用命名视图

命名视图名
默认视图

之前的示例没有为<router-view/>指定一个name属性,实际上它有一个默认的属性default

<router-view></router-view>
/*
	默认视图名匹配组件
*/
const routes = [
  { path: '/index', components: {default: Index} },
  { path: '/article', components: {default: Article} }
]
具名视图
  <router-view name="name"/>
const routes = [
  { path: '/index', components: {name: Index} },
  { path: '/article', components: {name: Article} }
]

路由别名和重定向

路由重定向

也是通过routes配置完成的,可以配置路由重定向到具体路由地址、具名路由或者动态返回重定向目标。

重定向至路由地址
const router = new VueRouter({
  routes: [
    { path: '/a', redirect: '/b' }
  ]
})

示例:

const routes = [
  { path: '/', redirect: '/index' },
  { path: '/index', component: Index },
  { path: '/article', component: Article }
]
重定向至具名路由
const router = new VueRouter({
  routes: [
    { path: '/a', redirect: {name: 'name'} }
  ]
})
动态返回重定向目标
const router = new VueRouter({
  routes: [
    { path: '/a', redirect: to => {
      // 方法接收 目标路由 作为参数
      // return 重定向的 字符串路径/路径对象
    }}
  ]
})

示例:

const routes = [
{ path: '/', redirect: to => {
  if(Math.random() > 0.5) {
    return '/index'
  }else {
    return {
      name: 'article'
    }
  }
}},
  { path: '/index', name: 'index', component: Index },
  { path: '/article', name: 'article', component: Article }
]
路由别名

/a的别名是/b,意味着,当用户访问/b时,URL会保持/b,但是路由匹配则为/a。

const router = new VueRouter({
  routes: [
    { path: '/a', component: A, alias: '/b' }
  ]
})

路由传参

包括paramsquery两种方式

params传参
  1. 定义路由及路由接收的参数;
  2. 路由跳转时传入对应参数;
    路由参数:
const routes = [
  { path: '/detail/:name', name: 'detail', component: Detail },
]
 <!-- router-link 跳转 -->
<router-link :to="{name: 'detail', params: {name: 'React 基础学习'}}"> React 基础学习</router-link>

示例:

<div id="app">
    <div>
      <router-link to="/">首页</router-link>
    </div>
    <router-view></router-view>
</div>
/*
	定义组件
*/
const Detail = Vue.component('detail', {
  template: '<div>这是 {{$route.params.name}} 的详情页面</div>'
})

const Article = Vue.component('myArticle', {
  template: `<ul>
              <li>
                <router-link :to="{name: 'detail', params: {name: 'Vue 计算属性的学习'}}">
                  1. Vue 计算属性的学习
                </router-link>
              </li>
              <li>
                <router-link :to="{name: 'detail', params: {name: 'React 基础学习'}}">
                  2. React 基础学习
                </router-link>
              </li>
            </ul>`
})
/*
	定义路由数组并创建路由实例
*/
const routes = [
  { path: '/detail/:name', name: 'detail', component: Detail },
  { path: '/', component: Article }
]

const router = new VueRouter({
  routes: routes
})

使用$router的方式跳转:

 // $router 跳转
 this.$router.push({
  name: 'detail',
  params: {
    name: 'Vue 教程'
  }
})

示例:

const Article = Vue.component('myArticle', {
  template: `<ul>
              <li @click="getDetail('Vue 计算属性的学习')">
                1. Vue 计算属性的学习
              </li>
              <li @click="getDetail('React 基础学习')">
                2. React 基础学习
              </li>
            </ul>`,
  methods: {
    getDetail(name) {
      this.$router.push({
        name: 'detail',
        params: {
          name: name
        }
      })
    }
  }
})
query传参

方法较为简单,只需要在对应路由跳转的时候传入参数即可:

 <!-- router-link 跳转 -->
<router-link :to="{path: '/detail', query: { id: 1 }}">2. React 基础学习</router-link>
/*
	定义组件,并在组件中接收query参数
*/
const Detail = Vue.component('detail', {
  template: '<div>这是 id 为 {{$route.query.id}} 的详情页面</div>'
})

const Article = Vue.component('myArticle', {
  template: `<ul>
              <li>
                <router-link :to="{path: '/detail', query: {id: 1}}">
                  1. Vue 计算属性的学习
                </router-link>
              </li>
              <li>
                <router-link :to="{path: '/detail', query: {id: 2}}">
                  2. React 基础学习
                </router-link>
              </li>
            </ul>`
})

/*
	使用$router的方式跳转路由
*/
 this.$router.push({
  path: '/detail',
  query: {
    id: 2
  }
})
posted @ 2021-05-15 21:28  卷の掌门  阅读(54)  评论(0)    收藏  举报