Vue基础知识总结 11:前端路由vue-router

news2025/2/25 22:03:59

🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪

🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

🍅 关注公众号【哪吒编程】,回复1024,获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步

目录

​一、前端路由vue-router

1、维基百科

2、路由的机制

3、后端渲染

4、后端路由阶段

​5、前后端分离

6、单页面富应用阶段

7、SPA页面

8、前端路由

二、改变URL,但是页面不进行整体的刷新

​1、URL的hash

2、HTML5的history 

三、安装和使用vue-router

1、安装vue-router

2、在模块化工程中使用它(因为它是一个插件,所以可以通过Vue.use()来安装路由功能)

3、使用vue-router的步骤

4、router-link与router-view

5、vue-router代码实例

 四、router-link的其它属性补充

五、vue-router动态路由的使用

六、vue-router打包文件的解析

七、路由懒加载

1、什么是懒加载

2、懒加载的方式

3、代码实例

八、路由嵌套

1、嵌套路由是一个很常见的功能

2、实现嵌套路由的两个步骤

 3、嵌套路由代码实例

九、vue-router参数传递

1、传递参数主要有两种类型: params和query

2、代码实例

十、vue-router全局导航守卫

1、生命周期函数

2、前置守卫

十一、keep-alive与vue-router


​一、前端路由vue-router

1、维基百科

路由就是通过互联的网络把信息从源地址传输到目的地址的活动。

2、路由的机制

路由包括路由和转发。
路由器 -> 公网IP -> 映射表 -> 内网IP
映射表:[内网ip1:电脑标识1,内网ip2:电脑标识2]

3、后端渲染

JSP:java server page
后端渲染 == html + css + java
java代码的作用是从数据库中读取数据,然后将他们动态的放在页面中。
后端渲染的意思就是,前端请求后端,页面的数据在后端已经渲染好了,然后再返回前端,内容包括HTML+css,当然是包含数据的HTML。
后端路由:后端处理URL和页面之间的映射关系。

4、后端路由阶段

早期的网站开发整个HTML页面是由服务器来渲染的。
服务器直接生产渲染好对应的HTML页面, 返回给客户端进行展示。

但是, 一个网站, 这么多页面服务器如何处理呢?

  1. 一个页面有自己对应的网址, 也就是URL。
  2. URL会发送到服务器, 服务器会通过正则对该URL进行匹配, 并且最后交给一个Controller进行处理。
  3. Controller进行各种处理, 最终生成HTML或者数据, 返回给前端。
  4. 这就完成了一个IO操作。

上面的这种操作, 就是后端路由:

  • 当我们页面中需要请求不同的路径内容时, 交给服务器来进行处理, 服务器渲染好整个页面, 并且将页面返回给客户顿。
  • 这种情况下渲染好的页面, 不需要单独加载任何的js和css, 可以直接交给浏览器展示, 这样也有利于SEO的优化。 

后端路由的缺点:

  1. 一种情况是整个页面的模块由后端人员来编写和维护的。
  2. 另一种情况是前端开发人员如果要开发页面, 需要通过PHP和Java等语言来编写页面代码。
  3. 而且通常情况下HTML代码和数据以及对应的逻辑会混在一起, 编写和维护都是非常糟糕的事情。

​5、前后端分离

后端只负责提供数据,不负责其它任何阶段。
浏览器中显示的网页中的大部分内容,都是由前端写的JS代码在浏览器中执行,最终渲染出来的网页。

随着Ajax的出现, 有了前后端分离的开发模式。

后端只提供API来返回数据, 前端通过Ajax获取数据, 并且可以通过JavaScript将数据渲染到页面中。

这样做最大的优点就是前后端责任的清晰, 后端专注于数据上, 前端专注于交互和可视化上。
并且当移动端(iOS/Android)出现后, 后端不需要进行任何处理, 依然使用之前的一套API即可。
目前很多的网站依然采用这种模式开发。

6、单页面富应用阶段

其实SPA最主要的特点就是前后端分离的基础上加上了一层前端路由;
也就是前端来维护一套路由规则

7、SPA页面

SPA:单页富应用
整个网页只有一个HTML网页。

8、前端路由

URL和前端页面的映射关系。
-----> vue router

前端路由的核心是什么呢?
改变URL,但是页面不进行整体的刷新。

二、改变URL,但是页面不进行整体的刷新

​1、URL的hash

URL的hash也就是锚点,本质上是改变window.location的href属性。
我们可以通过直接赋值location.hash来改变href,但是页面不发生刷新。

2、HTML5的history 

history.pushState({},'','home')

history.pushState相当于栈的操作,先进后出,弹栈和入栈的操作。

history.pushState入栈;

history.back()出栈;

history.go(-1)  相当于 history.back();

history.forward 相当于history.go(1);

history.replaceState():不能返回;

三、安装和使用vue-router

1、安装vue-router

npm install vue-router --save

2、在模块化工程中使用它(因为它是一个插件,所以可以通过Vue.use()来安装路由功能)

  1. 导入路由对象,并且调用Vue.use(VueRouter)
  2. 创建路由实例,并传入路由映射配置
  3. 在Vue实例中挂载创建的路由实例

3、使用vue-router的步骤

  1. 创建路由组件
  2. 配置路由映射,组件和路径映射关系
  3. 使用路由:通过<router-link>和<router-view>

4、router-link与router-view

<router-link>:该标签是一个vue-router中已经内置的组件,它会被渲染成一个<a>标签。
<router-view>:该标签会根据当前的路径,动态渲染出不同的组件。
网页的其他内容,比如顶部的标题/导航,或者底部的一些版权信息等会和<router-view>处于同一个等级。
在路由切换时,切换的是<router-view>挂载的组件,其他内容不会发生改变。

5、vue-router代码实例

(1)App.vue

<template>
  <div id="app">
    <router-link to="/home" >首页</router-link>
    <router-link to="/about">关于</router-link>
    <router-view></router-view>
  </div>
</template>

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

(2)Home.vue

<template>
  <div>
    <h2>我是首页</h2>
    <p>我是首页内容, 哈哈哈</p>
  </div>
</template>

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

<style scoped>

</style>

(3)About.vue

<template>
  <div>
    <h2>我是关于</h2>
    <p>我是关于内容, 呵呵呵</p>
  </div>
</template>

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

<style scoped>

</style>

(4)main.js

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

Vue.config.productionTip = false

new Vue({
  el: '#app',
  router,
  render: h => h(App)
})

(5)index.js

// 配置路由相关的信息
import VueRouter from 'vue-router'
import Vue from 'vue'

import Home from '../components/Home'
import About from '../components/About'

// 1.通过Vue.use(插件), 安装插件
Vue.use(VueRouter)

// 2.创建VueRouter对象
const routes = [
  {
    path: '',
    // redirect重定向
    redirect: '/home'
  },
  {
    path: '/home',
    component: Home
  },
  {
    path: '/about',
    component: About
  }
]
const router = new VueRouter({
  // 配置路由和组件之间的应用关系
  routes,
  mode: 'history',
  linkActiveClass: 'active'
})

// 3.将router对象传入到Vue实例
export default router

(6)浏览器展示

 四、router-link的其它属性补充

  1. tag:tag可以指定router-link之后渲染成什么组件,比如<router-link tag='button'></router-link>,此时就是一个button了;
  2. replace:增加replace属性,就相当于replaceState;
  3. class:可以为标签增加样式,比如选中的会自动赋值router-link-active;
  4. active-class=“active”:选中的;也可以在router组件中配置linkActiveClass: 'active';

通过代码跳转路由:

<script>
export default {
  name: 'App',
  methods: {
    homeClick() {
      // 通过代码的方式修改路由 vue-router
      // push => pushState
      this.$router.push('/home')
      //this.$router.replace('/home')
      console.log('homeClick');
    },
    aboutClick() {
      this.$router.push('/about')
      //this.$router.replace('/about')
      console.log('aboutClick');
    }
  }
}
</script>

五、vue-router动态路由的使用

在某些情况下,一个页面的path路径可能是不确定的,比如我们进入用户界面时,希望路径中存在用户id,这种path和Component相互匹配的关系,我们称之为动态路由,也是路由传递数据的一种方式。

this.$route表示正在活跃的路由。

获取路径中的姓名:

...
<router-link :to="'/user/'+userId">用户</router-link>
...
<template>
  <div>
    <h2>我是用户界面</h2>
    <p>我是用户的相关信息, 嘿嘿嘿</p>
    <h2>{{userId}}</h2>
    <h2>{{$route.params.id}}</h2>
    <button @click="btnClick">按钮</button>
  </div>
</template>

<script>
  export default {
    name: "User",
    computed: {
      userId() {
        return this.$route.params.id
      }
    }
</script>

六、vue-router打包文件的解析

七、路由懒加载

1、什么是懒加载

当打包构建应用时,JavaScript包会变得非常大,影响页面加载。

如果我们能吧不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。

2、懒加载的方式

(1)结合Vue的异步组件和Webpack的代码分析

const Home = resolve => { require.ensure(['../components/Home.vue'], 
() => { resolve(require('../components/Home.vue')) })};

(2)amd写法

const About = resolve => require(['../components/About.vue'], resolve);

(3)ES6我们可以有更加简单的写法来组织Vue异步组件和Webpack的代码分割

const Home = () => import('../components/Home.vue')

3、代码实例

index.js

// import Home from '../components/Home'
// import About from '../components/About'
// import User from '../components/User'

// 懒加载方式
const Home = () => import('../components/Home')
const About = () => import('../components/About')
const User = () => import('../components/User')

八、路由嵌套

1、嵌套路由是一个很常见的功能

比如在home页面中,我们希望通过/home/news和/home/message访问一些内容;

一个路径映射一个组件,访问这两个路径也分别渲染这两个组件;

2、实现嵌套路由的两个步骤

  1. 创建对应的子组件,并且在路由映射中配置对应的子路由;
  2. 在组件内部使用<router-view>标签;

 3、嵌套路由代码实例

(1)index.js

// 配置路由相关的信息
import VueRouter from 'vue-router'
import Vue from 'vue'

const Home = () => import('../components/Home')
const HomeNews = () => import('../components/HomeNews')
const HomeMessage = () => import('../components/HomeMessage')

const About = () => import('../components/About')
const User = () => import('../components/User')
const Profile = () => import('../components/Profile')

// 1.通过Vue.use(插件), 安装插件
Vue.use(VueRouter)

// 2.创建VueRouter对象
const routes = [
  {
    path: '',
    // redirect重定向
    redirect: '/home'
  },
  {
    path: '/home',
    component: Home,
    meta: {
      title: '首页'
    },
    children: [
      {
        path: 'news',
        component: HomeNews
      },
      {
        path: 'message',
        component: HomeMessage
      }
    ]
  }
]
const router = new VueRouter({
  // 配置路由和组件之间的应用关系
  routes,
  mode: 'history',
  linkActiveClass: 'active'
})

// 3.将router对象传入到Vue实例
export default router

(2)Home.vue

<template>
  <div>
    <h2>我是首页</h2>
    <p>我是首页内容, 哈哈哈</p>

    <router-link to="/home/news">新闻</router-link>
    <router-link to="/home/message">消息</router-link>

    <router-view></router-view>

    <h2>{{message}}</h2>
  </div>
</template>

<script>
  export default {
    name: "Home",
    data() {
      return {
        message: '你好啊',
        path: '/home/news'
      }
    }
  }
</script>

<style scoped>

</style>

(3)HomeNews.vue

<template>
  <div>
    <ul>
      <li>美女1</li>
      <li>美女2</li>
      <li>美女3</li>
      <li>美女4</li>
    </ul>
  </div>
</template>

<script>
  export default {
    name: "HomeNews"
  }
</script>

<style scoped>

</style>

九、vue-router参数传递

1、传递参数主要有两种类型: params和query

params的类型:

  1. 配置路由格式: /router/:id
  2. 传递的方式: 在path后面跟上对应的值
  3. 传递后形成的路径: /router/123, /router/abc

query的类型:

  1. 配置路由格式: /router, 也就是普通配置
  2. 传递的方式: 对象中使用query的key作为传递方式
  3. 传递后形成的路径: /router?id=123, /router?id=abc
     

2、代码实例

(1)传值

<script>
...
export default {
  ...
  methods: {
    userClick() {
      this.$router.push('/user/' + this.userId)
    },
    profileClick() {
      this.$router.push({
        path: '/profile',
        query: {
          name: 'kobe',
          age: 19,
          height: 1.87
        }
      })
    }
  }
}
</script>

(2)取值

<template>
  <div>
    <h2>{{$route.query.name}}</h2>
    <h2>{{$route.query.age}}</h2>
    <h2>{{$route.query.height}}</h2>
  </div>
</template>

十、vue-router全局导航守卫

1、生命周期函数

<script>
  export default {
    name: "Home",
    data() {
      return {
        message: '你好啊',
        path: '/home/news'
      }
    },
    created() {
      console.log('home created');
    },
    destroyed() {
      console.log('home destroyed');
    },
    // 这两个函数, 只有该组件被保持了状态使用了keep-alive时, 才是有效的
    activated() {
      this.$router.push(this.path);
      console.log('activated');
    },
    deactivated() {
      console.log('deactivated');
    },
    beforeRouteLeave (to, from, next) {
      console.log(this.$route.path);
      this.path = this.$route.path;
      next()
    }
  }
</script>

2、前置守卫

(1)动态修改标题

跳转前回调

// 前置守卫(guard)
router.beforeEach((to, from, next) => {
  // 从from跳转到to
  document.title = to.matched[0].meta.title
  // 必须调用next(),表示执行下一步的意思
  next()
})

(2)beforeEach源码分析:

 (3)跳转后回调

// 后置钩子(hook)
router.afterEach((to, from) => {
  // console.log('--我是CSDN哪吒--');
})

十一、keep-alive与vue-router

keep-alive是vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。

router-view也是一个组件,如果直接被包在keep-alive里面,所有路径匹配到的试图组件都会被缓存。

Java学习路线总结,搬砖工逆袭Java架构师 

10万字208道Java经典面试题总结(附答案)

Java基础教程系列

Java基础教程系列(进阶篇)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue自适应布局(各种浏览器,分辨率)

1.前言 spa页面的layout布局对于前端项目的影响至关重要&#xff0c;在我们进行web端开发的时候&#xff0c;前端的各种大小屏幕&#xff0c;各种内核的浏览器不同&#xff0c;会导致我们的页面呈现出不一样的效果&#xff0c;如何进行更好的取舍&#xff0c;怎么能够达到产品…

使用Nginx部署Vue+SpringBoot前后端分离项目(超详细!)

目录 一、前后端环境准备 1、前端环境准备 2、后端环境准备 二、前后端打包 1、前端打包 2、后端打包 三、服务器前后端配置及部署 1、前端配置 安装nginx 创建项目目录 前端项目部署 2、后端配置 安装宝塔 安装mysql 使用本地Navicat连接远程数据库 安装jdk环境…

echarts文档解读

前言&#xff1a;今天给大家分享一个前端的开源可视化图标库echarts。 &#x1f495;点击下方名片&#xff0c;即可领取学长个人微信&#x1f495; echarts 全局 echarts 对象&#xff0c;在 script 标签引入 echarts.js 文件后获得&#xff0c;或者在 AMD 环境中通过 require…

Vue 插槽(slot)详细介绍(对比版本变化,避免踩坑)

目录 前言 正文 插槽是什么&#xff1f; 怎么使用插槽&#xff1f; 基本用法 后备&#xff08;默认&#xff09;内容 具名插槽 作用域插槽 插槽版本变化 总结 前言 Vue中的插槽&#xff08;slot&#xff09;在项目中用的也是比较多的&#xff0c;今天就来介绍一下插…

npm install 提示Unable to authenticate, need: BASIC realm=“Sonatype Nexus Repository Manager“

场景&#xff1a; 执行npm install时提示Unable to authenticate Password: Email: (this IS public) xxqq.com Logged in as uploader on http://192.168.xx.xxx:8074/repository/npm-internal/. PS D:\GitworkspaceUi\gisquest-cloud-ui-workcenter> npm install npm ERR…

【登录界面】vue、element-ui登录界面模板

vue、element-ui登录界面模板这里总结一个用vue、element-ui写的登录界面&#xff0c;为以后复制粘贴备用。 截图 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录</title><!--…

vue-quill-editor富文本编辑器使用步骤

首先放上效果图 目录 1.安装 2.引入到项目中 3.在页面上写组件 4.配置option 5.给工具栏鼠标悬停加上中文释义 6.上传图片到七牛云 7.自定义控制图片大小 1.安装 npm install vue-quill-editor -S2.引入到项目中 有两种挂载方式&#xff1a; 全局挂载 和 在组件中挂载&…

【Vue插槽详解】

Vue插槽详解Vue插槽的作用一、默认插槽完整代码&#xff1a;二、具名插槽完整代码&#xff1a;三、作用域插槽完整代码如下&#xff1a;Vue插槽的作用 Vue插槽是Vue中常见的一种组件间的相互通信方式&#xff0c;作用是让父组件可以向子组件指定位置插入html结构&#xff0c;适…

记录--前端性能优化——首页资源压缩63%、白屏时间缩短86%

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 提升首屏的加载速度&#xff0c;是前端性能优化中最重要的环节&#xff0c;这里笔者梳理出一些 常规且有效 的首屏优化建议 目标&#xff1a; 通过对比优化前后的性能变化&#xff0c;来验证方案的有效…

除夕最绚丽3D烟花代码(html+音效)

今天就是除夕了&#xff0c;新年怎么能少得了烟花呢&#xff1f;虽然绝大部分地区禁止燃放烟花&#xff0c;但该欣赏的烟花还是要欣赏滴~~ 最近整理文件&#xff0c;找到了一份烟花代码&#xff0c;3D特效&#xff0c;今天分享给大家&#xff0c;希望大家喜欢。 话不多说&#…

uni.getLocation和wx.getLocation方法调用无效,也不返回失败,解决方案!!!

线上已解决问题的代码 记录时间 2022.12.10 //获得地理定位信息uni.getLocation({type: wgs84,success: function(resp) {console.log(11111);//保存纬度数据let latitude resp.latitude;//保存经度度数据let longitude resp.longitude;console.log(经度 latitude);console…

【Vue项目搭建】修改【若依框架】的侧边栏、导航栏、面包屑样式、修改全局页面样式

掌握分寸感&#xff0c;找目标一致的人协同你&#xff0c;有效地调配资源&#xff0c;就可以提高效率。 写在前面的话&#xff1a;博主最近想要搭建自己的前端若依项目&#xff0c;因此此系列博客会做一些记录。我的项目gitee地址&#xff1a; https://gitee.com/xuruicong/rac…

less和sass的区别[简洁易懂]

一、基础知识 1.sass&#xff0c;less都是CSS的预处理器&#xff0c;其基本思想就是用编程的思路编写CSS代码。增加了变量&#xff0c;嵌套&#xff0c;函数&#xff0c;语句&#xff0c;继承等概念。有助于模块化开发&#xff0c;例如写一个换肤的效果&#xff0c;以前我们需要…

前端200道面试题及答案(更新中)

目录 html相关 1&#xff09;说一下对cookie和Storage(localStorage和sessionStorage) 的认识和区别&#xff1f; 2&#xff09;link和import的区别 3&#xff09;浏览器如何实现不同标签页的通信&#xff1f; 4&#xff09;iframe的优缺点 5&#xff09;canvas 6&#x…

Sublime Text 4 (Build 4143) 注册方法STEP BY STEP

To 初学Python的Pythonista: Sublime Text相对于PyCharm和Visual Studio Code&#xff0c;确实有不足之处&#xff0c;但提供了众多功能丰富的插件&#xff0c;且最大优点就是相对于Pycharm和VSCODE&#xff0c;它体积小&#xff0c;启动速度快。对于Python的初学者来说&#…

JavaScript基础总结---重点

目录JavaScript简介什么是JavaScript浏览器执行JS过程JS的组成JS的引入方式函数与作用域arguments的使用全局变量与局部变量预解析对象创建对象的三种方式1.利用字面量创建对象2.利用 new Object 创建对象3.利用构造函数创建对象遍历对象属性变量、属性、函数、方法总结new关键…

节点流和处理流详解

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 1. 基本介绍 节点流可以从一个特定的数据源读写数据&#xff0c;如FileReader&#xff0c;FileWriter处理流&#xff08;也叫包装流&#xff09;是“连接”在已存在的流&#xff08;节点流或处理流&#xff09;之上&#x…

web服务器项目常见面试题目(C++)

项目介绍 1、为什么要做这样一个项目&#xff1f; 在学习CPP语言的时候&#xff0c;发现需要做一个项目来巩固一下&#xff0c;网上有推荐这个项目&#xff0c;然后就自己尝试做了一下。这个项目综合性比较强&#xff0c;从中既能学习Linux环境下的一些系统调用&#xff0c;也…

Vue3创建项目(一)新手教程

✅作者简介&#xff1a; 我是痴心阿文&#xff0c;你们的学友哥。 整理一下Vue3创建项目&#xff0c;新手教程&#xff0c;看完需要预计花费10分钟。 1.环境准备 Vue依赖NodeJs的环境&#xff0c;需要先安装Nodejs。 2.NodeJs安装 打开NodeJs下载页选择自己系统对应的版本下载。…

【JAVA】书店管理系统(附带前后端源码及资源)

【JAVA_Web】书店管理系统&#xff08;附带前后端源码及资源&#xff09; 一、项目的目的和意义 1.1目的 在“互联网”的大趋势下&#xff0c;线上销售以其简单、便捷、高效的特点受到人们的青睐。网上书店不受时间或者空间的限制&#xff0c;只要在网络覆盖的地方人们就可以…