Vue学习(二十一)路由

Vue-路由(route)

vue-router 理解

Vue中的一个插件库,专门用来实现SPA(single page web application)应用

SPA应用

  1. 单页面应用(single page web application,SPA)。
  2. 整个应用只有一个完整的页面
  3. 页面不出现跳转和整体刷新,只是局部刷新
  4. 数据需要通过ajax请求获取

路由

定义

  1. 一个路由就是一组映射关系(key-value)。
  2. key为路径,value可能是function或component。

分类

  1. 后端路由
    1. 定义:value是function,用于处理客户端提交的请求。
    2. 工作过程:服务器收到一个请求是,根据请求路径找到匹配的函数来处理请求,返回响应数据。
  2. 前端路由
    1. 定义:value是component,用于页面内容渲染。
    2. 工作过程:当浏览器的路径发生改变时,对应的组件会被渲染。

基本使用

  1. 安装vue-router
npm i vue-router@3 # 安装3版本,适用于vue2
npm i vue-router # 安装最新版本
# 或
yarn add vue-router@3
  1. 引入和应用
// 引入VueRouter
import VueRouter from 'vue-router'
...
// 使用VueRouter
Vue.use(VueRouter)
  1. 编写router配置项
// 该文件用于创建整个应用的路由器
import VueRouter from 'vue-router'

// 引入组件
import About from '../components/About'
import Home from '../components/Home'

// 创建并暴露一个路由器
export default new VueRouter({
    routes: [
        {
            path: "/about",
            component: About
        },
        {
            path: "/home",
            component: Home
        },
    ]
})
  1. 实现切换router-linkactive-class可配置高亮样式)
<router-link to="/about" class="list-group-item" active-class="active">About</router-link>
  1. 指定展示位置router-view
<router-view></router-view>

注意:

  1. 路由组件通常放在pages文件夹,一般组件通常放在components文件夹。
  2. 通过切换,隐藏了的路由组件,默认是被销毁的,需要时再去挂载。
  3. 每个路由组件都有自己的$route属性,存储着自己的路由信息。
  4. 整个应用只有一个router,可以通过组件的$router属性获取到。

main.js

// 引入Vue
import Vue from "vue";
// 引入App组件
import App from "./App"
// 引入Vue Router
import VueRouter from 'vue-router'
// 引入路由器
import router from './router'

// 关闭生产提示
Vue.config.productionTip = false
Vue.use(VueRouter)

// 创建vm
new Vue({
    render: h => h(App),
    router: router,
}).$mount("#app");

App.vue

<template>
	<div>
		<div class="row">
			<div class="col-xs-offset-2 col-xs-8">
				<div class="page-header"><h2>Vue路由案例(Vue Router Demo)</h2></div>
			</div>
		</div>
		<div class="row">
			<div class="col-xs-2 col-xs-offset-2">
				<div class="list-group">
					<!-- 原多页面方式跳转方式 -->
					<!-- <a href="./about.html" class="list-group-item active">About</a>
					<a href="./home.html" class="list-group-item">Home</a> -->
					
					<!-- Vue中借助router-link标签实现路由的切换 -->
					<router-link to="/about" class="list-group-item" active-class="active">About</router-link>
					<router-link to="/home" class="list-group-item" active-class="active">Home</router-link>

				</div>
			</div>
			<div class="col-xs-6">
				<div class="panel">
					<div class="panel-body">
						<!-- 此处展示组件靠用户点击的导航决定 -->
						<!-- 指定组件的呈现位置 -->
						<router-view></router-view>
					</div>
				</div>
			</div>
		</div>
	</div>
</template>

<script>
	export default {
		name: 'App',
	}
</script>

router/index.js

// 该文件用于创建整个应用的路由器
import VueRouter from 'vue-router'

// 引入组件
import About from '../components/About'
import Home from '../components/Home'

// 创建并暴露一个路由器
export default new VueRouter({
    routes: [
        {
            path: "/about",
            component: About
        },
        {
            path: "/home",
            component: Home
        },
    ]
})

About.vue

<template>
  <h2>我是About的内容</h2>
</template>

<script>
    export default {
        name: "About",
    }
</script>

Home.vue

<template>
  <h2>我是Home的内容</h2>
</template>

<script>
    export default {
        name: "Home",
    }
</script>

路由嵌套

  1. 配置路由规则,使用children配置项
routes: [
    {
        path: "/about",
        component: About
    },
    {
        path: "/home",
        component: Home,
        children:[
            {
                path: 'news',
                component: News,
            },
            {
                path: 'message',
                component: Message
            }
        ]
    },
]
  1. 跳转需要写完整路径,依旧使用router-link标签,显示使用<router-view></router-view>标签
<router-link to="/home/message" class="list-group-item" active-class="active">Message</router-link>

路由传参

query参数

  1. 传递参数

    • 字符串写法:
    <router-link :to="`path?key1=value1&key2=value2....`">{{message.title}}</router-link>
    
  • 对象写法:
   <router-link :to="{
       path:'path',
           query: {
               key1: value1,
               key2: value2
           }
       }">
       {{m.title}}
   </router-link>
  1. 接收参数
$route.query.key

命名路由

  1. 作用:简化路由跳转

  2. 使用:

    • **命名:**在路由配置中添加name配置项
    routes: [
        {
            name: 'about',
            path: "/about",
            component: About
        },
        {
            name: 'home',
            path: "/home",
            component: Home,
            children:[
                {
                    path: 'news',
                    component: News,
                },
                {
                    path: 'message',
                    component: Message,
                    children: [
                        {
                            name: 'messageDetail',
                            path: 'detail',
                            component: Detail,
                        }
                    ]
                }
            ]
        },
    ]
    
  • **使用:**需要使用对象方式配置路径,将path替换成name:配置名
<router-link :to="{
    name:'messageDetail',
        query: {
            id: m.id,
            title: m.title
    }
}">
    {{m.title}}
</router-link>

params参数

  1. 配置路由,声明接收params参数
routes: [
    {
        name: 'about',
        path: "/about",
        component: About
    },
    {
        name: 'home',
        path: "/home",
        component: Home,
        children:[
            {
                path: 'news',
                component: News,
            },
            {
                path: 'message',
                component: Message,
                children: [
                    {
                        name: 'messageDetail',
                        path: 'detail/:id/:title',
                        component: Detail,
                    }
                ]
            }
        ]
    },
]
  1. 传递参数

    • 字符串写法:
    <router-link :to="`/home/message/detail/value1/value2`">...</router-link>
    
  • 对象写法:
   <router-link :to="{
       name:'messageDetail',
           params: {
               key1: value1,
               key2: value2,
                   ...
           }
   }">
   {{m.title}}
   </router-link>
  1. 接收参数:
$route.params.key

注意:路由携带params参数时,如果使用对象写法,不能使用path配置项,必须使用name

路由的props

作用:让路由组件更方便的接收到参数

  1. **对象写法:**对象写法,该对象中的所有key-value都会以props形式传递给Detail组件
{
    name: 'messageDetail',
        path: 'detail',
            component: Detail,
                // 对象写法,该对象中的所有key-value都会以props形式传递给Detail组件
                props: {
                    key1: value1,
                    key2: value2 
                },
}
  1. **boolean写法:**如果值为真,就会把该路由组件收到的params参数,以props形式传递给对应组件
{
    name: 'messageDetail',
        path: 'detail',
            component: Detail,
                // boolean值写法,如果值为真,就会把该路由组件收到的params参数,以props形式传递给对应组件
                props: true,
}
  1. **函数写法:**返回对象中的每一组key-value都会通过props传给对应组件
{
    name: 'messageDetail',
        path: 'detail',
            component: Detail,
                // 函数写法,返回对象中的每一组key-value都会通过props传给对应组件
                /* props($route) {
                                return { id: $route.query.id, title: $route.query.title }
                            }, */
                /* props({query}) {
                                return { id: query.id, title: query.title }
                            }, */
                props({query:{id, title}}) {
                return { id: id, title: title }
            },
}
  1. 接收:props:["key1", "key2"]

router-link的replace属性

  • **作用:**控制路由跳转时操作浏览器历史记录
  • 浏览器的历史记录有两种写法(默认为push):
    • push:追加历史记录(压栈)
    • replace:替换当前记录
  • 开启方式replace模式:<router-link replace ... >...</router-link>

编程式路由导航

作用: 不借助<router-link>实现路由跳转

  • $router.back():后退
  • $router.forward():前进
  • $router.go(3):前进/后退指定步数(整数为前进,负数为后退)
  • $router.push:push方式跳转路由(有痕)
  • $router.replace:replace方式跳转路由(无痕)
methods: {
    back() {
        this.$router.back();
    },
    forward() {
		this.$router.forward();
    },
	testGo() {
		this.$router.go(3);
	}
    pushShow(m) {
        this.$router.push({
            name:'messageDetail',
            query: {
                id: m.id,
                title: m.title
            }
        });
    },
        repalceShow(m) {
            this.$router.replace({
                name:'messageDetail',
                query: {
                    id: m.id,
                    title: m.title
                }
            });
        },
},

缓存路由组件

  1. 作用: 让不展示的路由组件保持挂载,不被销毁

  2. 使用: 使用<keep-alive></keep-alive>标签包裹<router-view></router-view>

    1. <keep-alive></keep-alive>,所有被包裹的<router-view></router-view>中展示的组件被缓存
    2. <keep-alive :include="['组件名',...]"></keep-alive>指定的组件被缓存
    <keep-alive include="News">
        <router-view></router-view>
    </keep-alive>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值