导航


HTML

CSS

JavaScript

浏览器 & 网络

版本管理

框架

构建工具

TypeScript

性能优化

软实力

算法

UI、组件库

Node

冷门技能

作用:前端路由

核心:锚点值的改变,根据不同的值,渲染指定DOM位置的不同数据

原理:

<div class="h">我是头部</div>
<div id="content" class="b"></div>
<div class="f">我是底部</div>
<script type="text/javascript">
//监视锚点值的改变
window.addEventListener('hashchange', function() {
    var text = '';
    switch (location.hash) {
        case '#/music':
            text = '各种音乐的数据';
            break;
        case '#/movie':
            text = '各种电影的数据';
            break;
    }
    document.getElementById('content').innerHTML = text;
})
</script>

经验:以后看到vue开头的插件,就知道必须Vue.use

Vue的核心插件:

使用方式:

  1. 下载 npm i vue-router -S
  2. 封装路由
import Vue from 'vue';
//配置路由
import VueRouter from 'vue-router';
Vue.use(VueRouter);

//1.创建组件
import Home from '../components/Home.vue';
import News from '../components/News.vue';

//2.配置路由   注意:名字
const routes = [
    { path: '/home', component: Home },
    { path: '/news', component: News, name: 'news' },
    { path: '*', redirect: '/home' }   /*默认跳转路由*/
]

//3.实例化VueRouter  注意:名字
const router = new VueRouter({
    mode: 'hash',   /*hash模式改为history*/
    routes // (缩写)相当于 routes: routes
})

//5 <router-view></router-view> 放在 App.vue
export default router;
  1. 在main.js引入router.js
import router from './router/router.js';
new Vue({
	el: '#app',
  router,
  render: h => h(app);
});
  1. 在app.vue中留坑 <router-view></router-view>

⭐️ router-link

基本使用

let router = new VueRouter({
    routes: [
        { name: 'home', path: '/home', component: Home },
        { name: 'music', path: '/music', component: Music },
        { path: '*', redirect: '/home' }
    ]
});

//1. 推荐写法,:to带name
// 更利于维护,如果只修改了路由配置中的path,该a标签会根据修改后的值生成href属性
<router-link :to="{name: 'home'}">首页</router-link>
<router-link :to="{name: 'music'}">音乐</router-link>
<router-view></router-view>

//2. 不推荐,直接写路径,不带冒号的to
<router-link to="/music">音乐</router-link>

⭐️ 传递参数

在vue-router中,有两大对象被挂载到了实例 this

查询字符串:

  1. 去哪里(列表页传参) <router-link :to="{name:'detail',query:{id:1} } ">xxx</router-link>
  2. 导航(router中) { name:'detail' , path:'/detail', component: Detail }
  3. 去了干嘛(详情页接收参数)

path方式:

  1. 去哪里 <router-link :to="{name:'detail',params:{name:1} } ">xxx</router-link>
  2. 导航(path方式需要在路由规则上加上/:xxx)
  3. 去了干嘛(获取路由参数)

编程导航

作用:

使用:

goMoive() {
   this.$router.push({
   		name: 'movie',
     	query: {id: 1, name: '古典'}
   })
}
goNews() { this.$router.push({ path: '/content/495' }); }

路由高亮

  1. 组件内重写默认提供的类属性
.router-link-active {
	color: red;
  ...
}
  1. VueRouter中全局配置
var router = new VueRouter({
  routes: [...],
  linkActiveClass: 'myactive'
});

重定向和404

多视图/命名视图

main.js

//路由切换页面
import header from './components/header.vue'
import footer from './components/footer.vue'

//创建路由对象并配置路由规则
let router = new VueRouter({
    routes: [{
            path: '/',
            components: {
                header: header,
                default: header,
                footer: footer
            }
        }]
});

App.vue

// 一个组件中,放多个 router-view
<template>
    <div>
        <div>我是头部啊</div>
        <hr/>
            <!-- 留坑,非常重要 坑名-->
            <router-view class="b" name="header"></router-view>
            <router-view class="b" ></router-view>
            <router-view class="b" name="footer"></router-view>
        <hr/>
        <div>我是底部啊</div>
    </div>
</template>

⭐️ 嵌套路由

注意:

// main.js
let router = new VueRouter({
    routes: [
        { name: 'home', path: '/home', component: Home },
        { name: 'music', path: '/music', component: Music, // <====== 第一层路由
            children: [ // <====== 第二层路由
                { name: 'oumei', path: 'oumei', component: Oumei },
                { name: 'guochan', path: 'guochan', component: Guochan }
            ]
        },
        { path: '*', redirect: '/home' }
    ]
});

// App.vue
<div>
    <sw-header></sw-header>
    <router-view></router-view>
    <sw-footer></sw-footer>
</div>

// Music.vue
<div>
    <h3>我是音乐页</h3>
    <router-link :to="{ name: 'oumei' }">欧美</router-link>
    <router-link :to="{ name: 'guochan' }">国产</router-link>
    <router-view></router-view>
</div>
// 一级页面
const Foo = {
	template: `
		<div>
			<h2>Foo</h2>
			<router-link to="/foo/bar">Go to Bar</router-link>
			<router-view></router-view>
		</div>
	`
}
// 二级页面
const Bar = {
	template: `
		<div>Bar</div>
	`
}

// 顶层出口
<template>
	<div id="app">
    <router-link to="/foo">Go to Foo</router-link>
		<router-view></router-view>
  </div>
</template>

const routes = [
  {
  	path: '/foo',
    component: Foo,
    children: [
      {
        // 当 /foo/bar 匹配成功
        // Bar 会被渲染在 Foo 组件的 <router-view> 中
      	path: 'bar',
        component: Bar
      }
    ]
  }
]