首页 > 其他分享 >Vue2.x 基本认识四:路由

Vue2.x 基本认识四:路由

时间:2023-06-26 23:44:23浏览次数:43  
标签:title 认识 import Vue2 router path id 路由

路由认识

概念

路由(route)就是一组(key  -value)对应关系。多个路由由一个路由器(router)管理。

key 为路径,value 可能是 function 或 component 。

function 是后端路由,用于请求服务器获取数据。

component 是前端路由,用于展示页面内容。但浏览器的路径改变时,对应的组件就会显示。

作用

实现单页面应用。

SPA 应用的理解:

  1. 单页面应用(singe page web application,SPA)
  2. 整个页面只有一个完整的页面
  3. 点击页面中的导航链接不会刷新页面,只会做页面的局部更新。
  4. 数据需要通过 ajax 请求获取

安装

要使用路由,需要用到插件库:vue-router

注意:2022年2月7日,Vue3 成为了默认版本,Vuex、vue-router 也更新到了4版本了,且 4 是默认版本。这两个插件的 4 版本都只能在 Vue3 中使用。Vue2 要指定安装 3 版本的插件。

安装命令:npm i vue-router@3

安装最新版:npm i vue-router

 

路由基本使用

注意

  1. 组件分为一般组件、路由组件。写组件标签。通过 components 配置项配置的组件是一般组件;路由器控制挂载展示的组件是路由组件。
  2. 一般组件,放在在 components 文件夹中;路由组件,则放在 pages 文件夹中。这两个目录都在 src 目录下。
  3. 被切换走的路由组件,默认是被销毁的,需要的时候再去挂载。所以如果有消息订阅和全局事件注册,需要在 beforeDestroy() 函数中取消订阅和解除事件绑定。
  4. 每个组件都有自己的 $route 属性,里面存放这自己的路由信息。
  5. 整个应用只有一个 router,可以通过组件的 $router 属性获取到。

引入与应用 vue-router 插件

在安装完毕插件的基础上。

main.js 中加入下面内容:

import Vue from 'vue'
import App from "./App.vue"

// 引入 vue-router 插件
import VueRouter from 'vue-router'
// 引入自定义路由器(src/router/index.js)
import router from './router'
// 应用 vue-router 插件
Vue.use(VueRouter)

const vm = new Vue({
    render: h => h(App),
    router: router // 配置路由器
}).$mount("#root")

自定义路由器内容

  自定义路由器写在一个 js 文件中,就是 src/router/index.js

/**
 * 该文件专门用于创建整个应用的路由器
 */
// 引入 vue-router 插件
import VueRouter from 'vue-router'
// 引入自定义组件
import About from '../pages/About'
import Home from '../pages/Home'
import Message from '../pages/Message'
import News from '../pages/News'

// 创建并暴露一个路由器
export default new VueRouter({
    // routes 下面是一级路由
    routes:[
        {
            path: '/about',
            component: About
        },
        {
            path: '/home',
            component: Home,
            // 定义 Home 组件的子路由规则
            children: [
                {
                    path: 'news', // 子路由 path 值前面不要斜杆
                    component: News
                },
                {
                    path: 'message',
                    component: Message
                }
            ]
        }
    ]
})

使用路由:一级路由

<template>
    <div id="app">
        <div class="row">
            <Banner/>
        </div>
        <div class="row">
            <div class="col-xs-2 col-xs-offset-2">
                <div class="list-group">
                    <!-- 使用原始 a 标签跳转页面 -->
                    <!-- <a class="list-group-item active" href="./about.html">About</a>
                    <a class="list-group-item" href="./home.html">Home</a> -->

                    <!-- 
                        使用路由标签跳转页面 
                        使用的是 router-link 标签
                        to 属性的值是路由器中的 path 路径
                    -->
                    <router-link class="list-group-item" active-class="active" to="/about">About</router-link>
                    <router-link class="list-group-item" active-class="active" to="/home">Home</router-link>
                </div>
            </div>
            <div class="col-xs-6">
                <div class="panel">
                    <div class="panel-body">
                        <!-- 指定路由组件呈现的位置:通过 router-view 标签 -->
                        <router-view></router-view>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>

<script>
    import Banner from "./components/Banner.vue";
    export default {
        name: 'App',
        components: {Banner},
        data() {
            return {}
        }
    }
</script>

路由使用:多级路由(嵌套路由)

<template>
    <div>
        <h2>我是Home的内容</h2>
        <ul class="nav nav-tabs">
            <li>
                <!-- 使用多级路由时,to 属性必须带上父级路由的 path 路径 -->
                <router-link class="list-group-item" active-class="active" to="/home/news">News</router-link>
            </li>
            <li>
                <router-link class="list-group-item" active-class="active" to="/home/message">Message</router-link>
            </li>
        </ul>
        <div>
            <!-- 路由组件展示的地方 -->
            <router-view></router-view>
        </div>
    </div>

</template>
<script>
export default {
    name: 'Home'
}
</script>

 

路由命名&路由传参

路由命名

简而言之,就是在配置路由地址时,配置 name 属性,后面跳转时可以根据 name 属性值跳转,避免多级路由时,to 属性内容写很长。

/**
 * 该文件专门用于创建整个应用的路由器
 */
// 引入 vue-router 插件
import VueRouter from 'vue-router'
// 引入自定义组件
import About from '../pages/About'
import Home from '../pages/Home'
import Message from '../pages/Message'
import News from '../pages/News'
import Detail from '../pages/Detail'

// 创建并暴露一个路由器
export default new VueRouter({
    // routes 下面是一级路由
    routes:[
        {
            name: 'aboutN',
            path: '/about',
            component: About
        },
        {
            path: '/home',
            component: Home,
            // 定义 Home 组件的子路由规则
            children: [
                {
                    path: 'news', // 子路由 path 值前面不要斜杆
                    component: News
                },
                {
                    path: 'message',
                    component: Message,
                    children: [
                        {
                            name:'detailN',
                            path: 'detail',
                            component: Detail
                        }
                    ]
                }
            ]
        }
    ]
})

 

路由传参(query 传参)& 使用路由名称实现跳转

<template>
    <div>
        <ul>
            <li v-for="item in messages" :key="item.id">
                <!-- 路由跳转,并携带 query 传参,to 字符串写法 -->
                <router-link :to="`/home/message/detail?id=${item.id}&title=${item.title}`">{{ item.title }}</router-link>
                <!-- 路由跳转,并携带 query 传参,to 对象写法 -->
                <router-link 
                    :to="{
                        path: '/home/message/detail',
                        query: {
                            id: item.id,
                            title: item.title
                        }
                    }">
                    {{ item.title }}
                </router-link>
                <!-- 
                    使用路由名称跳转
                    下面 to 属性配置的对象中,name 属性值与路由配置中 detail 路由配置的 name 属性值一致 
                  -->
                <router-link 
                    :to="{
                        name: 'detailN',
                        query: {
                            id: item.id,
                            title: item.title
                        }
                    }">
                    {{ item.title }}
                </router-link>
            </li>
        </ul>
        <hr>
        <router-view></router-view>
    </div>
</template>
<script>
export default {
    name: 'Message',
    data() {
        return {
            messages:[
                {id:'001', title:'消息001'},
                {id:'002', title:'消息002'},
                {id:'003', title:'消息003'}
            ]
        }
    }
}
</script>

 

接收路由 query 传参

<template>
    <div>
        <h3>消息ID:{{ $route.query.id }}</h3>
        <h3>消息标题:{{ $route.query.title }}</h3>
    </div>
</template>
<script>
    export default {
        name: 'Detail'
    }
</script>

 

路由传参(params 传参):在 path 配置中定义占位

/**
 * 该文件专门用于创建整个应用的路由器
 */
// 引入 vue-router 插件
import VueRouter from 'vue-router'
// 引入自定义组件
import About from '../pages/About'
import Home from '../pages/Home'
import Message from '../pages/Message'
import News from '../pages/News'
import Detail from '../pages/Detail'

// 创建并暴露一个路由器
export default new VueRouter({
    // routes 下面是一级路由
    routes:[
        {
            name: 'aboutN',
            path: '/about',
            component: About
        },
        {
            path: '/home',
            component: Home,
            // 定义 Home 组件的子路由规则
            children: [
                {
                    path: 'news', // 子路由 path 值前面不要斜杆
                    component: News
                },
                {
                    path: 'message',
                    component: Message,
                    children: [
                        {
                            name:'detailN',
                            /**
                             * 路由 params 传参必须要占位(下面一共两个占位,占位不懂就学node)
                             * 在 params 传参 to 字符串写法时,参数名称就是冒号后面部分
                             */
                            path: 'detail/:id/:title',
                            component: Detail
                        }
                    ]
                }
            ]
        }
    ]
})

 

路由传参(params 传参):两种写法

<template>
    <div>
        <ul>
            <li v-for="item in messages" :key="item.id">
                <!-- 使用 params 传参,to 字符串写法 -->
                <router-link :to="`/home/message/detail/${item.id}/${item.title}`">{{ item.title }}</router-link>
                <!-- 
                    使用 paras 传参,to 对象写法。
                    注意,对象写法只能根据路由名称跳转,不能使用 path 跳转。
            且,params 对象中,key 是什么,在接收时就用什么
            这里与字符串写法参数名就是占位有点区别,但这种传参也依赖于占位,只是不用占位的名称作为参数名称
--> <router-link :to="{ name: 'detailN', params: { id: item.id, title: item.title } }"> {{ item.title }} </router-link> </li> </ul> <hr> <router-view></router-view> </div> </template> <script> export default { name: 'Message', data() { return { messages:[ {id:'001', title:'消息001'}, {id:'002', title:'消息002'}, {id:'003', title:'消息003'} ] } } } </script>

 

接收路由 params 传参

<template>
    <div>
        <h3>消息ID:{{ $route.params.id }}</h3>
        <h3>消息标题:{{ $route.params.title }}</h3>
    </div>
</template>
<script>
    export default {
        name: 'Detail'
    }
</script>

 

路由的 props 配置

功能:简化路由参数接收。

路由配置中使用 props 配置

/**
 * 该文件专门用于创建整个应用的路由器
 */
// 引入 vue-router 插件
import VueRouter from 'vue-router'
// 引入自定义组件
import About from '../pages/About'
......

// 创建并暴露一个路由器
export default new VueRouter({
    // routes 下面是一级路由
    routes:[
        {
            name: 'aboutN',
            path: '/about',
            component: About
        },
        {
            path: '/home',
            component: Home,
            // 定义 Home 组件的子路由规则
            children: [
                {
                    path: 'news', // 子路由 path 值前面不要斜杆
                    component: News
                },
                {
                    path: 'message',
                    component: Message,
                    children: [
                        {
                            name:'detailN',
                            /**
                             * 路由 params 传参必须要占位(下面一共两个占位,占位不懂就学node)
                             * 在 params 传参 to 字符串写法时,参数名称就是冒号后面部分
                             */
                            // path: 'detail/:id/:title',
                            path: 'detail',
                            component: Detail,

                            // 写法一:值为对象,该对象中所有 key-value 都会以 props 的形式传给当前组件(只能写死key-value)
                            // props: {id:'007', title:'凌凌漆'}
                            // 写法二:值为布尔值,把收到的所有参数,以 props 的形式传给当前组件(只能是 params 传参方式)
                            // props: true
                            // 写法三(推荐):值为函数,把收到的所有参数,以 props 的形式传给当前组件(params 和 query参数都行)
                            props($route) {
                                return {
                                    id: $route.query.id,
                                    title: $route.query.id
                                }
                            }
                        }
                    ]
                }
            ]
        }
    ]
})

 

组件传参方式不变

<template>
    <div>
        <ul>
            <li v-for="item in messages" :key="item.id">
                <!-- 使用 query 传参,to 对象写法。 -->
                <router-link 
                    :to="{
                        name: 'detailN',
                        query: {
                            id: item.id,
                            title: item.title
                        }
                    }">
                    {{ item.title }}
                </router-link>
            </li>
        </ul>
        <hr>
        <router-view></router-view>
    </div>
</template>

 

组件中使用 props 配置接收参数

注意,接收参数名与路由配置 props 中定义的 key 一致

<template>
    <div>
        <h3>消息ID:{{ id }}</h3>
        <h3>消息标题:{{ title }}</h3>
    </div>
</template>
<script>
    export default {
        name: 'Detail',
        props: ['id', 'title']
    }
</script>

 

标签:title,认识,import,Vue2,router,path,id,路由
From: https://www.cnblogs.com/zhousjcn/p/17506129.html

相关文章

  • Kong入门学习实践(5)API网关路由转发
    最近在学习Kong网关,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看。由于我司会直接使用Kong企业版,学习过程中我会使用Kong开源版。本篇,我们学习快速配置一个最常见的基本功能:API网关场景下的路由转发。API网关路由需求在API网关的需求场景中,......
  • vue05_路由
    今日目标1.能够说出什么是路由2.能够说出前端路由的实现原理3.能够使用Vue-Router实现前端路由4.能够实现嵌套路由,动态路由5.能够实现命名路由以及编程式导航6.理解并实现后台管理案例 1.路由的概念路由的本质就是一种对应关系,比如说我们在url地址中输入我们要访问的......
  • django之路由层
    目录django之路由层路由匹配路由匹配小优化转换器转换器种类正则匹配无名分组与有名分组反向解析静态路由的反向解析反向解析语法动态路由的反向解析动态反向解析语法路由分发路由分发后的反向解析django之路由层路由层,主要是路由地址与视图函数的映射关系,如果将网站比作一本......
  • 前端实现权限控制 - 三种方法 - 不同的角色有不同的路由映射
     有代码:https://gitee.com/zhu-longxu/zhulx-rbacps:注意本地路由router有哪些规则?服务器返回的数据格式? 方法一:本地路由router包含静态路由规则;虽然动态路由规则定义了但是没有注入;动态路由规则在登录判断的时候选择性是否注入;服务器返回数据格式 [ "news", "cat......
  • 双网卡上网指定route路由DNS
    双网卡指定上网出口route路由DNS方法如下:route-padd10.130.0.0mask255.255.0.010.130.2.254routedelete0.0.0.0route-padd0.0.0.0mask0.0.0.0192.168.4.1第一条命令route-padd10.130.0.0mask255.255.0.010.130.2.254效果:NetworkAddressNetmask......
  • vue的路由(更新中)
    路由含义及原理路由(router)就是对应关系。地址与页面上组件的对应关系。Hash地址与组件之间的对应关系!锚链接锚链接不会使页面刷新,但有浏览历史。(AnchorLink)是指在网页中通过链接跳转到同一页面的不同位置的技术。它可以让用户通过点击链接或者页面内部的锚点,直接跳转到页面......
  • flask中添加路由的方式
    在Flask中,添加路由有两种方式:(一般情况下都是用第一种方式)方式一:常见的装饰器模式@app.route("/")defindex():return"HelloWorld"方式二:通过阅读装饰器模式添加路由的源码发现 defroute(self,rule,**options):"""Adecoratorthatisusedtoregistera......
  • 11、默认路由(缺省路由)、浮动路由(主备路由)
    静态路由分析可看,管理员配置的路由条目比较多,当网络环境比较大时,路由条目就非常复杂,尤其是部署在企业出口的路由器,不可能明细化配置复杂的静态路由信息,一般在边界路由器配置默认路由,也是静态路由的一种方式。默认路由格式:【H3C】iproute-static0.0.0.00.0.0.0下一跳IP地址......
  • vue项目本地启动history路由模式刷新页面404
    背景:之前一直用hash模式,改成history模式后刷新页面404解决:vue.config.js中publicPath:"/"如果是线上服务则还需要后端修改一些配置,见链接点击查看......
  • OSPF /O E1/ O *E2/O IA路由
    O域内路由  OIA域间路由 OE1域外路由,会累加METRIC值(默认20)OE2域外路由,不累加METRIC值(默认20),由外部重分布进来默认使用OE2OE1和OE2都是自治系统外的路由,O*E2——默认自治系统外的路由。OE1和OE2的区别:它们代表的是外部路由1和外部路由2。OIA就是自治系统......