五、VUE学习笔记 5 | 进阶 Vue CLI---路由

目录

1、安装

路由组件的设定-仅两步

2、第一个例子

3、动态路由

4、嵌套路由

5、路由拼图

6、重定向及别名

7、多参数路由


1、安装

VUE CLI可以选择安装,如果没有安装则运行以下命令

$ npm install vue-router --save --save-exact

 

路由组件的设定-仅两步

1、src/router/index.js  --- 路由的配置文件,做组件映射

import Vue from 'vue'
import Router from 'vue-router'  
import HelloWorld from '@/components/HelloWorld'

Vue.use(Router) //将路由组件注册到全局区
//输出类,定义各种URL映射
export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld //这里HelloWorld是第三行导入的组件
    }
  ]
})

 2、src/main.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import 'bootstrap/dist/css/bootstrap.min.css'
import axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, axios)

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,//将router里的index.js在VUE中进行注册
  components: { App },
  template: '<App/>'
})

2、第一个例子

做一个简单的路由

涉及文件:

* HelloWorld.vue
* News.vue
* About.vue
* router/index.js
* App.vue

 

### HelloWorld.vue

<template>
    <div>
        <h1>Hello World!</h1>
    </div>
</template>

### News.vue

<template>
    <div>
        <h1>News Page</h1>
    </div>
</template>

### About.vue
 

<template>
    <div>
        <h1>About Page</h1>
    </div>
</template>


### router/index.js

添加路由

当URL是根URL /,绑定组件HelloWorld;

当URL是/about,绑定组件About


import About from '@/components/About'
import News from '@/components/News'
...
    {
        path: '/',
        name: 'HelloWorld',
        component: HelloWorld
    },
    {
        path: '/about',
        name: 'About',
        component: About
    },
    {
        path: '/news',
        name: 'News',
        component: News
    }
 

import Vue from 'vue'
import Router from 'vue-router'  
import HelloWorld from '@/components/HelloWorld'
import News from '@/components/News'
import About from '@/components/About'
Vue.use(Router) //将路由组件注册到全局区
//输出类,定义各种URL映射
export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld //这里HelloWorld是第三行导入的组件
    },
    {
      path: '/news',
      name: 'News',
      component: News 
    },
    {
      path: '/about',
      name: 'About',
      component: About 
    }
  ]
})

### App.vue

 <router-link to="URL"></router-link> 这里的(/、/news、/about在index.js中进行了路由映射)实际效果是在页面渲染出页面链接,渲染到 <router-view/>中进行显示

<template>
  <div id="app">
     <img src="./assets/logo.png">
        <p>
            <!-- 使用 router-link 组件来导航. -->
            <!-- 通过传入 `to` 属性指定链接. -->
            <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
            <router-link to="/">Home</router-link>
            <router-link to="/news">新闻</router-link>
            <router-link to="/about">关于</router-link>
        </p>
        <!-- 路由出口 -->
        <!-- 路由匹配到的组件将渲染在这里 -->
        <router-view/>
  </div>
</template>

<script>
import './assets/my.css'
export default {
  name: 'App'
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

3、动态路由

动态路由是指在URL路径中含有动态参数的路由,比如说:/player/1, /player/2, /player/3等等。同一个组件,传的参数不同,显示的内容不同

## 实战演习

定制玩家的动态路径:/player/:id

* Player.vue
* router/index.js
* App.vue

 

### Player.vue
 

<template>
    <div>
        <h1>球员页面</h1>
        <p>{{ detail }}</p>
    </div>
</template>

<script>
    export default {
        name: "Player",
        data() {
            return {
                detail: {}
            };
        },
        mounted() {
            //当组件初始化完成时
            // 接受url参数id
            this.detail = this.getPlayer(this.$route.params.uid);
        },
        
        beforeRouteUpdate(to, from, next) {
            //当从非首页点击其他路由时,重新设置detail的信息
            //关于此处详细原因 视频地址:https://www.bilibili.com/video/av24419291/?p=12
            this.detail = this.getPlayer(to.params.uid);
            next();
        },
        
        methods: {
            getPlayer(uid) {
                switch (uid) {
                    case '1':
                        return {uid: 1,name: '库里',point: 26};
                    case '2':
                        return {uid: 2,name: '哈登',point: 30};
                    default:
                        return {uid: -1};
                }
            }
        }
    };
</script>

 

### router/index.js

加入以下内容


...
import Player from '@/components/Player'
...
export default new Router({
    routes: [
        {
            path: '/player/:uid',
            name: 'Player',
            component: Player
        }
    ]
})
 

通过URL把参数传给mounted,然后再通过getPlayer()的switch 进行判断

 

### App.vue

添加以下内容

<template>
    <div id="app">
        <p>
            <router-link to="/">Home</router-link>
            <router-link to="/player/1">库里</router-link>
            <router-link to="/player/2">哈登</router-link>
        </p>
        <router-view/>
    </div>
</template>

 

结合上一张图看 

结果

4、嵌套路由

嵌套路由是指在动态路由的基础上再加上附加的嵌套URL(即:组件),比如说:(/player/:uid/*)/player/1/profile, /player/1/stats等。表示球员1的简介信息、数据。

 

这里是要在球员组件里添加球员信息和球员数据的子路由

## 实战演习

* Player/Profile.vue
* Player/Stats.vue
* router/index.js
* Player.vue

### Player/Profile.vue

<template>
    <div>
        <h2>球员简介:{{$route.params.uid}}</h2>
    </div>
</template>

### Player/Stats.vue

<template>
    <div>
        <h2>球员数据:{{$route.params.uid}}</h2>
    </div>
</template>

### router/index.js

import Vue from 'vue'
import Router from 'vue-router'  
import HelloWorld from '@/components/HelloWorld'
import Player from '@/components/Player'
import PlayerProfile from '@/components/Player/Profile'
import PlayerStats from '@/components/Player/Stats'
Vue.use(Router) //将路由组件注册到全局区
//输出类,定义各种URL映射
export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld //这里HelloWorld是第三行导入的组件
    },
    {
      path: '/player/:uid',
      name: 'Player',
      component: Player,
      children:[
        {
          path:'profile',
          component:PlayerProfile
        },
        {
          path:'stats',
          component:PlayerStats
        }
      ]
  },
  
  ]
})

### Player.vue

<template>
    <div>
        <h1>球员页面</h1>
        <ul>
            <li>编号:{{detail.uid}}</li>
            <li>名字:{{detail.name}}</li>
            <li>得分:{{detail.point}}</li>
        </ul>
        <!-- 当点击profile、stats时,组件会自动渲染到<router-view>中 -->
        <router-link :to="profile">简介</router-link>
         <router-link :to="stats">数据</router-link>
         <hr>
         <router-view></router-view>
    </div>
</template>

<script>
    export default {
        name: "Player",
        data() {
            return {
                detail: {},
                profile:'',
                stats:''
            };
        },
        mounted() {
            //当组件初始化完成时
            // 接受url参数id
            this.detail = this.getPlayer(this.$route.params.uid);
            this.profile = '/player/'+this.$route.params.uid+'/profile';
            this.stats = '/player/'+this.$route.params.uid+'/stats';
       },
        
        beforeRouteUpdate(to, from, next) {
            this.detail = this.getPlayer(to.params.uid);
            this.profile='/player/'+to.params.uid+'/profile';
            this.stats = '/player/'+to.params.uid+'/stats';
            next();
        },
        
        methods: {
            getPlayer(uid) {
                switch (uid) {
                    case '1':
                        return {uid: 1,name: '库里',point: 26};
                    case '2':
                        return {uid: 2,name: '哈登',point: 30};
                    default:
                        return {uid: -1};
                }
            }
        }
    };
</script>


 

结果

5、路由拼图

为一个路由(画面)组合多个组件,完成整个页面。

* router-view[name]
* components

## 实战演习

* Header.vue
* Sidebar.vue
* Detail.vue
* router/index.js
* App.vue

 

### setting/Header.vue
 

<template>
    <div>
        <h1>标题栏</h1>
        <div>欢迎来到小马Vue.js课程系列</div>
    </div>
</template>

### setting/Sidebar.vue

<template>
    <div>
        <h1>边条</h1>
    </div>
</template>

### setting/Detail.vue

<template>
    <div>
        <h1>详细显示</h1>
        <p>Vue.js是一套用于构建用户界面的渐进式框架。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。</p>
    </div>
</template>

### router/index.js

import Vue from 'vue'
import Router from 'vue-router'  
import SettingDetail from '@/components/setting/Detail'
import SettingHeader from '@/components/setting/Header'
import SettingSidebar from '@/components/setting/Sidebar'
Vue.use(Router) //将路由组件注册到全局区
//输出类,定义各种URL映射
export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      components: {
        myHeader: SettingHeader,
        mySidebar: SettingSidebar,
        myDetail: SettingDetail
    }
    }
  ]
})

 ### App.vue

<template>
    <div id="app">
        <table width="100%">
            <tr>
                <td colspan="2" style="background-color:darkgoldenrod">
                    <router-view name="myHeader"></router-view>
                </td>
            </tr>
            <tr>
                <td width="20%" style="background-color:thistle">
                    <router-view name="mySidebar"></router-view>
                </td>
                <td width="80%" style="background-color:aquamarine">
                    <router-view name="myDetail"></router-view>
                </td>
            </tr>
        </table>
    </div>
</template>

<script>
import "./assets/my.css";
export default {
  name: "App"
};
</script>

<style>
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

结果

6、重定向及别名

* 重定向指令:redirect
* 路由别名:alias

## 实战演习

* About.vue
* router/index.js
* App.vue

### About.vue

<template>
    <div>
        <h1>About Page</h1>
    </div>
</template>

### router/index.js
 

import Vue from 'vue'
import Router from 'vue-router'  
import SettingDetail from '@/components/setting/Detail'
import SettingHeader from '@/components/setting/Header'
import SettingSidebar from '@/components/setting/Sidebar'
import Player from '@/components/Player'
import PlayerProfile from '@/components/Player/Profile'
import PlayerStats from '@/components/Player/Stats'
import About from '@/components/About'
Vue.use(Router) //将路由组件注册到全局区
//输出类,定义各种URL映射
export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      components: {
        myHeader: SettingHeader,
        mySidebar: SettingSidebar,
        myDetail: SettingDetail
    }
    },
    {
      path: '/player/:uid',
      name: 'Player',
      component: Player,
      children:[  
        {
          path:'profile',
          component:PlayerProfile
        },
        {
          path:'stats',
          component:PlayerStats
        }
      ]
  },
  {
    path: '/about',
    name: 'About',
    component: About,
    alias: '/aboutme' //输入/aboutme或/about 都访问同样的页面/about
},
{
    path: '/curry',//输入/curry就能重定向到/player/1
    redirect: '/player/1'
    //redirect: { name: 'About' } //重定向到About组件
    //redirect: '/about'
}
  ]
})

### App.vue

<template>
    <div id="app">
        <router-link to="/">Home</router-link>
        <router-link to="/aboutme">About</router-link>
        <router-link to="/player/1">Player1</router-link>
        <router-link to="/curry">Curry</router-link>
        <hr>
        <router-view></router-view>
    </div>
</template>
<script>
import "./assets/my.css";
export default {
  name: "App"
};
</script>

<style>
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

7、多参数路由

## 知识点

* 路由属性props

## 实战演习

* User.vue
* router/index.js
* App.vue

 

### User.vue

<template>
    <div>
        <h1>User</h1>
        <p>uid={{ uid }}, {{ nationality }}</p>
        <p>$route.params.uid={{ $route.params.uid }}</p>
        <p>$route.params.uid={{ $route.params.nationality }}</p>
    </div>
</template>

<script>
    export default {
        name: "User",
        props: ['uid', 'nationality']
    };
</script>

### router/index.js

import Vue from 'vue'
import Router from 'vue-router'  
import User from '@/components/User'
Vue.use(Router) //将路由组件注册到全局区
//输出类,定义各种URL映射
export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
    },
    {
      path: '/user/:uid/:nationality',
      name: 'User',
      component: User,
      props: true
  }
  ]
})

### App.vue

<template>
    <div id="app">
        <router-link to="/">Home</router-link>
        <router-link to="/user/1/usa">User1</router-link>
        <router-link to="/user/2/china">User2</router-link>
        <router-link to="/user/3/korea">User3</router-link>
        <hr>
        <router-view></router-view>
    </div>
</template>
<script>
import "./assets/my.css";
export default {
  name: "App"
};
</script>

<style>
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值