vue-router全部搞定(附源码)

2024-06-10 22:36

本文主要是介绍vue-router全部搞定(附源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

源码下载链接(先转存,后下载)https://pan.quark.cn/s/b0c6edd68c21

怎么用vue-cli搭建项目

我们固然可以用传统html+js的方式来搭建vue项目,但是如果组件很多,就需要通过Vue.component的方式一个个去引入,很麻烦。 我们可以用脚手架来创建vue-cli项目。

1)安装vue-cli脚手架

npm install -g @vue/cli

2)项目初始化

vue create hello-world

image.png

选择vue的版本,用Vue2

image.png

开始创建了

image.png

创建完毕了

image.png

根据提示启动项目,监听在8080端口。

image.png

vue-router

为什么要用vue-router?以上个项目为例,主应用文件是App.vue

image.png

<template><div id="app"><img alt="Vue logo" src="./assets/logo.png"><HelloWorld msg="Welcome to Your Vue.js App"/></div>
</template><script>import HelloWorld from './components/HelloWorld.vue'export default {name: 'App',components: {HelloWorld}}
</script>

我们看到引入了一个HelloWorld组件,如果我们想看其他页面怎么办?因为是单页SPA应用,不好意思,目前你还真就没有办法。 对于一个vue.js应用,其实就只有一个App.vue组件能看到,如果你想看其他页面,就必须通过vue-router。 vue-router解决了路由和组件的对应关系问题,路由你可以理解为网页的url,不同的url对应的不同的路由,然后通过路由我们能找到不同的页面。

1)安装vue-router
npm i -S vue-router

-S 代表要加入到项目的依赖,因为我们在运行项目的时候就要用到vue-router,所以要加上。

image.png

这里有个坑,默认下载的vue-router是最新的,而我们是vue2.0的项目,版本不匹配。会报这个错误:

image.png

这个时候你首先应该卸载原有的vue-router版本,安装对应的版本,卸载命令如下:

npm uninstall vue-router

卸载完成之后,安装对应版本,安装你想安装的版本时在vue-router后面加@对应的版本号,安装命令如下:

npm install vue-router@3.5.2

image.png

最后,重新安装后,要重启服务!

2)使用vue-router插件

image.png

image.png

3)初始化Route
import AComponent from './components/A'
import BComponent from "./components/B";//初始化路由(参数是数组)
const routes = [{path:'/a',component:AComponent},{path:'/b',component:BComponent}
];
const router = new Route({routes,mode:'hash' //默认hash模式,会有#
});new Vue({render: h => h(App),router, // 路由要作为参数传入根 Vue实例
}).$mount('#app')

引入组件的时候,可以用@代替/src目录,这属于别名。 所以我们也可以写成这样:

import AComponent from '@/components/A'
import BComponent from "@/components/B";

当我们用代码提示引入AB组件的时候,默认就是这种。

A组件:

<template><h1>A</h1>
</template><script>
export default {name: "AComponent"
}
</script>

B组件:

<template><h1>B</h1>
</template><script>
export default {name: "BComponent"
}
</script>

最后,在App.vue上添加

<template><div id="app"><img alt="Vue logo" src="./assets/logo.png"><router-view /></div>
</template>

我们在浏览器输入http://localhost:8080/#/a 就可以访问A组件,B组件同理。

image.png

但是很显然,我们只有手动改变url去访问不同的页面,这是不合适的,改用router-link

<template><div id="app"><img alt="Vue logo" src="./assets/logo.png"><ul><li style="list-style: none"><router-link to="/a">A页面</router-link></li><li style="list-style: none"><router-link to="/b">B页面</router-link></li></ul><router-view /></div>
</template>

这个用法就类似于a标签

image.png

router嵌套和重定向

嵌套就是一个路由加一个children属性,里面又有其他路由,然后夫路由的页面也要加上,否则就是给静态的,看不到子路由。注意,子路由的path不要加 / ,否则还是全路径的,嵌套了个寂寞啊。

const routes = [{path:'/a',component:AComponent,children: [{path:'aa',component:AA}]},{path:'/b',component:BComponent}
];

a页面,加动态路由

<template><div><h1>A</h1><router-view /></div></template>

地址栏访问:http://localhost:8080/#/a/aa

image.png

成功,再来说说重定向,a在实际开发中,很可能是左侧菜单栏,所以我们应该要再配置一个默认的首页,当你打开A页面,A页面里面的动态路由应该显示默认的首页,而不是空白一片。

const routes = [{path:'/a',component:AComponent,redirect:'/a/aa', //这里要写全路径children: [{path:'aa',component:AA}]},{path:'/b',component:BComponent}
];

路由参数

有时候,我们希望采用restful的路由风格,跳转路由的时候携带参数,可以这样做。

const routes = [{path:'/a',component:AComponent,redirect:'/a/aa', //这里要写全路径children: [{path:'aa',component:AA},{path:':id',component:AA}, //这样携带参数,相当于/a/:id]},{path:'/b',component:BComponent}
];

然后在AA组件中这样去接收

<template><h1>AA<div>{{$route.params.id}}</div></h1>
</template>

当我们访问http://localhost:8080/#/a/111

image.png

这样就拿到参数了,注意这种参数路由的优先级比普通路由低,也就是如果你输入/a/aa,会优先匹配普通路由,而不是这个。

编程式路由

其实更多的时候,我们希望手动用js跳转路由,并携带参数,就要用到编程式路由了。 在B组件,我们做页面跳转。

<template><h1>B<button @click="gotoA">跳转到A页面</button></h1>
</template><script>
export default {name: "BComponent",methods: {gotoA(){this.$router.push({path:'/a/aa',query:{name:'keke'}});}}
}
</script>

然后AA组件这样去接收参数

<div>{{$route.query.name}}</div>

最终效果:

image.png

image.png

以上所有的路由跳转,都会在history进行缓存,即可以通过浏览器的回退按钮,退回到上一步。

image.png

如果你不想回退,就不要用push,改成replace。 如果你想用js回退,就用 this.$router.go(-1)

这篇关于vue-router全部搞定(附源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049462

相关文章

vue, 左右布局宽,可拖动改变

1:建立一个draggableMixin.js  混入的方式使用 2:代码如下draggableMixin.js  export default {data() {return {leftWidth: 330,isDragging: false,startX: 0,startWidth: 0,};},methods: {startDragging(e) {this.isDragging = tr

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

js+css二级导航

效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

vue+el国际化-东抄西鉴组合拳

vue-i18n 国际化参考 https://blog.csdn.net/zuorishu/article/details/81708585 说得比较详细。 另外做点补充,比如这里cn下的可以以项目模块加公共模块来细分。 import zhLocale from 'element-ui/lib/locale/lang/zh-CN' //引入element语言包const cn = {mess

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在

vue+elementUI下拉框联动显示

<el-row><el-col :span="12"><el-form-item label="主账号:" prop="partyAccountId" :rules="[ { required: true, message: '主账号不能为空'}]"><el-select v-model="detailForm.partyAccountId" filterable placeholder="

vue+elementui分页输入框回车与页面中@keyup.enter事件冲突解决

解决这个问题的思路只要判断事件源是哪个就好。el分页的回车触发事件是在按下时,抬起并不会再触发。而keyup.enter事件是在抬起时触发。 so,找不到分页的回车事件那就拿keyup.enter事件搞事情。只要判断这个抬起事件的$event中的锚点样式判断不等于分页特有的样式就可以了 @keyup.enter="allKeyup($event)" //页面上的//js中allKeyup(e