Vue路由(详解)

简介: Vue路由(详解)

路由原理

路由是Vue中的一个重要的插件。

Vue是单页面应用就一个HTML页面,但是我们要实现页面的跳转效果,那么我就需要使用路由。

单页面的跳转是什么呢?实际上就是局部改变,其实还是一个单页面,只是看起来像跳转的样子。

单页应用的路由模式有两种

1、哈希模式(利用hashchange 事件监听 url的hash 的改变)

2、history模式(使用此模式需要后台配合把接口都打到我们打包后的index.html上)

路由到底有什么作用?

下图淘宝例子:底部红色框中的按钮点击的话,绿色框中的内容会发生改变,实现单页面应用

路由安装和使用(vue2

路由下载地址上个博客写过,没下的可以去看看。

导入路由插件:

<script src="../js/vue2.7.js"></script><!--vue文件-->
<script src="../js/vue-router.js"></script><!--路由文件-->

安装路由插件到Vue中:

<script>
    //安装路由,前提要导入路由js
    Vue.use(VueRouter)
</script>

创建VueRouter对象:

var Login = Vue.extends({
    template:`
        <div>
        我是登录页面
        </div>
    `
});
// 创建VueRouter对象,并配置路由
var myRouter = new VueRouter({
    // 配置路由
    routes:[
        // 指定路由链接、路由名称、路由页面(组件)
        {path:'/login',name:'login',component:Login}
    ]
});

使用路由:

var app= new Vue({
    el:'#app',
    // 引入到vue 实例中,并在模板中使用<router-view>
    router:myRouter,
    template:`
        <div>
          头部
          <router-view></router-view><!--路由出口-->
          尾部
        </div>
    `
})

路由跳转

路由的跳转有两种方式:

  • 使用<router-link>标签
<router-link to='/login'></router-link>
  • 编程式路由,使用js
this.$router.push({path:'/login'});
this.$router.replace({path:'/login'});

说明:

  1. this.$router.push(); 会向history中添加记录
  2. this.$router.replace();不会向history中添加记录。
  3. this.$router.go(-1)常用来做返回上一个地址。

push和replace的区别就是在跳转后,后退或前进能不能使用

路由中的对象:

  1. this.$route 路由信息对象,只读。
  2. this.$router 路由操作对象,只写。

跳转实例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        头部
        <router-link to="/login">登录</router-link><!--登录的标签方式-->
        <router-link to="/person">个人</router-link><!--个人的标签方式-->
        <button @click="toLogin">登录按钮</button><!--登录的点击事件方式-->
        <button @click="toPerson">个人按钮</button><!--个人的点击事件方式-->
        <!--下面是路由出口-->
        <router-view></router-view>
        尾部
    </div>
</body>
<script src="../js/vue2.7.js"></script>
<script src="../js/vue-router.js"></script>
<script>
    //安装路由,前提要导入路由js
    Vue.use(VueRouter)
    //创建一个登录子组件
    var login={
        template:`
            <div>
                登陆页面
            </div>
        `,
    }
    //创建一个个人子组件
    var person={
        template:`
            <div>
                个人页面
            </div>
        `,
    }
    //创建路由配置实例,主要实现 路由和子组件之间的映射
    var myrouter=new VueRouter({
        routes: [
            {path:'/login',name:'login',component:login},
            {path:'/person',name:'person',component:person}
        ]
    })
    let app=new Vue({
        el:"#app",
        router:myrouter,
        methods: {
            toLogin(){
                this.$router.push({
                    path:'/login'
                })
            },
            toPerson(){
                this.$router.replace({
                    path:'/person'
                })
            },
        },
    })
</script>
</html>

路由的传值和取值

查询参

配置。查询参可以和path属性匹配,也可以和name属性匹配。

<router-link :to="{path:'/login',query:{id:queryid}}"></router-link>

或者

<router-link :to="{name:'login',query:{id:queryid}}"></router-link>

或者

this.$router.push({path:'/login',query:{id:this.queryid}});

取参

 // 此代码可以写到子组件的钩子函数中
 this.$route.query.id

路由参

配置路由规则

var router = new VueRouter({
    routers:[
        // 需要在配置路由规则时,使用冒号指定参数
        {name:'login',path:'/login/:id',component:LoginVue}
    ]
});

配置。意:在这里path和params两个参数不能同时使用,

路由参配置的时候要使用name,因为path会根据参数的不同会改变。

<router-link :to="{name:'login',params:{id:paramId}}"></router-link>

或者

this.$router.push({name:'login',params:{id:this.paramId}});

取参

// 此代码可以写到子组件的钩子函数中
this.$route.params.id

传值实例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        头部
        <router-link :to="{path:'/login',query:{id:loginId}}">登录query-link方式</router-link>
        <button @click="toLogin">登录query-按钮方式</button>
        <router-link :to="{name:'person',params:{id:personId}}">个人params-link方式</router-link>
        <button @click="toPerson">个人params-按钮方式</button>
        <br>
        <router-view></router-view><!--路由出口-->
        尾部
    </div>
</body>
<script src="../js/vue2.7.js"></script>
<script src="../js/vue-router.js"></script>
<script>
    //安装路由,前提要导入路由js
    Vue.use(VueRouter)
    var login={
        template:`
            <div>
                登陆页面
            </div>
        `,
        mounted() {
            console.log(this.$route.query.id);
        },
    }
    //创建一个个人子组件
    var person={
        template:`
            <div>
                个人页面
            </div>
        `,
        mounted() {
            console.log(this.$route.params.id);
        },
    }
    //创建路由配置实例,主要实现 路由和子组件之间的映射
    var myrouter=new VueRouter({
        routes: [
            {path:'/login',name:'login',component:login},
            {path:'/person/:id',name:'person',component:person}
        ]
    })
    let app=new Vue({
        el:"#app",
        router:myrouter,
        data() {
            return {
                loginId:66,
                personId:33
            }
        },
        methods: {
            toLogin(){
                this.$router.push({
                    path:'/login',
                    query:{id:this.loginId}
                })
            },
            toPerson(){
                this.$router.push({
                    name:'person',
                    params:{id:this.personId}
                })
            },
        },
    })
</script>
</html>

查询参和路由参的区别:

在地址栏参数的不同

查询参:                                                路由参:

大家会出现的问题:

相同路由,但参数不同。造成页面不刷新的问题,只需要给路由出口加一个属性就行。

<router-view :key="$route.fullPath"></router-view>

嵌套路由

路由间有层级关系。他们在模板中也有嵌套关系。

可以一次性配置多个路由。

嵌套实例:

实例里面写的都有注释方便大家理解,对于不理解的地方大家多看几遍,或许就能理解了。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <router-view></router-view><!--路由出口-->
    </div>
</body>
<script src="../js/vue2.7.js"></script>
<script src="../js/vue-router.js"></script>
<script>
    Vue.use(VueRouter);
    //导航组件
    let nav={
        template:`
        <div>
            <router-link :to="{name:'nav.index'}">首页</router-link>
            <router-link :to="{name:'nav.person'}">个人</router-link>
            <router-link :to="{name:'nav.message'}">消息</router-link>
            <router-view></router-view><!--导航组件的路由出口-->
        </div>
        `
    }
    //主页面子组件
    let index={
        template:`
            <div>主页面</div>
        `
    }
    //个人页面子组件
    let person={
        template:`
            <div>个人页面</div>
        `
    }
    //消息页面子组件
    let message={
        template:`
            <div>消息页面</div>
        `
    }
    let router=new VueRouter({
        routes:[
            {
                path:'/nav',
                name:'nav',
                component:nav,
                children:[//配置二级路由
                    {path:'',redirect:'/nav/index'},//默认显示二级路由页面链接是/nav/index的路由
                    {path:'index',name:'nav.index',component:index},
                    {path:'person',name:'nav.person',component:person},
                    {path:'message',name:'nav.message',component:message},
                ]
            },
            {
                path:'',
                redirect:'/nav'//默认显示页面链接是/nav的路由
            }
        ]
    })
    let app = new Vue({
        el:'#app',
        router,//这个地方使用的是简写根据ES6新语法,对象名和参数相同可以直接使用对象名。
    });
</script>
</html>

路由守卫

可以做登录的验证判断,购物车是否购买后跳转页面判断。

使用路由的钩子函数beforeEach实现

守卫实例:

我将路由守卫放在了刚才的嵌套路由的实例里面,作用是判断路径是否是首页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <router-view></router-view><!--路由出口-->
    </div>
</body>
<script src="../js/vue2.7.js"></script>
<script src="../js/vue-router.js"></script>
<script>
    Vue.use(VueRouter);
    //导航子组件
    let nav={
        template:`
        <div>
            <router-link :to="{name:'nav.index'}">首页</router-link>
            <router-link :to="{name:'nav.person'}">个人</router-link>
            <router-link :to="{name:'nav.message'}">消息</router-link>
            <router-view></router-view><!--导航组件中的路由出口-->
        </div>
        `
    }
    //主页面子组件
    let index={
        template:`
            <div>主页面</div>
        `
    }
    //个人页面子组件
    let person={
        template:`
            <div>个人页面</div>
        `
    }
    //消息页面子组件
    let message={
        template:`
            <div>消息页面</div>
        `
    }
    let router=new VueRouter({
        routes:[
            {
                path:'/nav',
                name:'nav',
                component:nav,
                children:[//配置二级路由
                    {path:'',redirect:'/nav/index'},//默认显示二级路由页面链接是/nav/index的路由
                    {path:'index',name:'nav.index',component:index},
                    {path:'person',name:'nav.person',component:person},
                    {path:'message',name:'nav.message',component:message},
                ]
            },
            {
                path:'',
                redirect:'/nav'//默认显示页面链接是/nav的路由
            }
        ]
    })
    let app = new Vue({
        el:'#app',
        router,//这个地方使用的是简写根据ES6新语法,对象名和参数相同可以直接使用对象名。
        mounted() {
            this.$router.beforeEach((to,from,next)=>{
                console.log(to);
                if(to.path=='/nav/index'){
                    // 跳转到目标路由
                    next();
                }else{
                    //如果路径不对的话延时两秒再进入
                    setTimeout(function(){
                        next();
                    },2000);
                }
            });
        }
    });
</script>
</html>


相关文章
|
12天前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
118 2
|
4月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
555 0
|
4月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
3月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
108 0
|
3月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
241 1
|
4月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
371 17
|
4月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
211 1
|
4月前
|
JavaScript API 开发者
Vue框架中常见指令的应用概述。
通过以上的详细解析,你应该已经初窥Vue.js的指令的威力了。它们是Vue声明式编程模型的核心之一,无论是构建简单的静态网站还是复杂的单页面应用,你都会经常用到。记住,尽管Vue提供了大量预定义的指令,你还可以创建自定义指令以满足特定的需求。为你的Vue应用程序加上这些功能增强器,让编码变得更轻松、更愉快吧!
72 1
|
4月前
|
存储 JavaScript 前端开发
如何高效实现 vue 文件批量下载及相关操作技巧
在Vue项目中,实现文件批量下载是常见需求。例如文档管理系统或图片库应用中,用户可能需要一次性下载多个文件。本文介绍了三种技术方案:1) 使用`file-saver`和`jszip`插件在前端打包文件为ZIP并下载;2) 借助后端接口完成文件压缩与传输;3) 使用`StreamSaver`解决大文件下载问题。同时,通过在线教育平台的实例详细说明了前后端的具体实现步骤,帮助开发者根据项目需求选择合适方案。
313 0
|
4月前
|
JavaScript 前端开发 UED
Vue 项目中如何自定义实用的进度条组件
本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
134 0

热门文章

最新文章