Tracy 小笔记 Vue - 路由

2023-11-11

Vue-Router

路由中有一个非常重要的概念叫路由表:本质上就是一个映射表,决定了数据包的指向。

服务器渲染/后端渲染
如 jsp, php, java ... 服务器直接生产渲染好对应的 html 页面,返回到客户端进行展示。 这种情况下渲染好的页面不需要单独加载任何的 css, js, 可以直接交给浏览器显示,这样也有利于 SEO. 缺点是逻辑代码和 html 混合在一起,维护糟糕,都是由后端人员完成。
后端处理 url 和页面之间的映射关系

前后端分离阶段
前端人员由 js 执行 ajax 接口,后端人员只负责提供数据。

前端渲染
浏览器中显示的网页中的大部分内容,都是由前端编写的 js 代码在浏览器中执行,最终渲染出来的网页。

前端路由阶段
SPA: 单页面富应用阶段,主要特点是在前后端分离的基础上增加了一层前端路由。 只有 一个 html. 改变 url 页面不进行整理的刷新。 如何实现呢?有如下三种方式

  • location.hash = "/about"
  • html5 的 history 模式: pushState
    入栈:
    history.pushState({},'','/about');
    history.pushState({},'','/home');
    history.pushState({},'','/me');
    出栈:
    history.back();
  • htm5 的 history 模式: go
    history.go(-1); == history.back(); history.go(1); == history.forward();
    history.go(2);
  • 刷新跳转 location.href="/about"

vue-router 基本使用

  • 它是 vue 的一个插件 安装: npm install vue-router --save
  • 安装之后的配置步骤分为三步:
    • 第一步:导入路由对象,并且调用 vue.use(VueRouter)
      import Vue from 'vue'
      import Router from 'vue-router';
      Vue.use(Router) //通过 Vue.use(插件) 来安装路由插件
    • 第二步:创建路由实例(new Router),并且传入路由映射配置
      const routes = [
          {
            path: '/',
            redirect: '/home' //一进来网页就默认跳转到首页,重定向
          },
          {
            path: '/home',
            component: Pay
          },
          {
            path: '/about',
            component: About
          }
        ];
      
      export default new Router({
        routes,
        mode:'history', //默认情况下路径改变使用的是 url 的 hash 模式,所以带#,这里把它变成 html5 的 history 模式
        linkActiveClass:'tracyActiveClass' //高亮的 router-link 修改默认的 router-link-active 为我自定义的
      })
    • 第三步:在 Vue 实例中挂载创建的路由实例
      main.js 入口文件中
      import router from './router'
      new Vue({
        el: '#app',
        router, //将 router 对象传入 Vue 实例
        render: h => h(App)
      })
      
  • 使用路由的步骤也分为三步
    • 第一步:创建路由组件
    • 第二步:配置路由映射,组件和路径映射关系
      创建映射关系前要引入 组件: import HelloWorld from '@/components/HelloWorld'
    • 第三步:使用路由 通过 <router-link> 和 <router-view />
      <router-link>: 该标签是一个 vue-router 中已经内置的组件,它会被渲染成一个 a 标签
      <router-view />: 该标签会根据当前的路径渲染出不同的组件,网页的masterhead, navigation and footer 会和它处于同一个等级;在路由切换时,切换的是它挂载的组件,其他内容不会发生改变
  • router-link 的使用
    • 基本用法 to="用于指定跳转的路径" <router-link to="/home">首页</router-link>
    • tag="指定 router-link 之后渲染成什么组件" <router-link tag="button">首页</router-link>
    • replace 不会留下 history 记录, 后退键返回不能返回到上一个页面中 <router-link replace>首页</router-link>
    • active-class: 当 router-link 对应的理由匹配成功时,会自动给当前元素设置一个 router-link-active 的 class, 我们可以把它重命名
  • 通过代码的方式修改路由
    • @click="toHome"
      toHome(){
      this.$router.push('/home'); // html5 的 history 模式: pushState
      this.$router.replace('/home'); //返回不了上一页
    • const routeData = this.$router.resolve({ path: '/home', query: { id: 1 } }); window.open(routeData.href, '_blank'); //新窗口
    • },

动态路由

  • /user/aaa 或 /user/bbb
  • { path: '/user/:abc', component: 组件 }
    {{ $route.params.abc }}
  • $router 和 $route 的区别
    • $router 就是 router 文件夹 index.js 中 new 出来的 Router 对象
      想要导航到不同的 url 则使用 this.$router.push 方法
    • $route为当前 router 跳转到的对象, 可以获取 name、path、query、params、meta、matched 等
      其中 matched 里放的是这 url 打开之后(除了 APP 之外的所有的)components
      this.$route.path 当前路径

路由的懒加载

  • 当打包构件应用时,js 会变得非常大,影响页面加载
  • 把不同的路由对应的组件分割成不同的代码块,当路由被访问的时候才加载对应组件,会更加高效
  • 正常打包所有文件都只会打包成如下三个文件
    • vendor.####.js: 所有第三方插件,如 vue/vue-router/axios/bs
    • manifest.####.js: 为了打包而做的底层支撑
    • app.####.js: 当前应用程序"自己写"的所有代码(业务代码)
  • 路由懒加载做了什么?
    将路由对应的组件打包成一个丹迪的 js 文件,只有在这个路由被访问的时候才加载对应的组件
  • 它们只在引用组件的时候有区别
    正常加载: import About from '@/components/About';
    懒加载: const About = () => import ('@/components/About');

vue-router 嵌套路由

  • /home/abc 这种多层的 url 结构就涉及到嵌套路由
  • 实现嵌套路由的两个步骤
    1. 创建对应的子组件,并且在路由映射中配置对应的子组件
    2. 在父组件内部使用 <router-view></router-view> 标签
  • 在父路由里配置 children

    {
    path: '/home',
    component: home的组件, //这里要写 router-view 标签了
    children: [{
    path: '',
    redirect: 'abc' //重定向
    }, {
    path:'abc', //子路由不用写斜线了 不用写 "/abc"
    component: abc的组件
    },
    {
    ... 其他子路由
    }]
    }

vue-router 参数传递

  • Params的类型
    参考动态路由
    http://www.##.com/about/aaa
    http://www.##.com/about/bbb
    的传递方式
  • query 的类型
    http://www.##.com/about?name=tracy&age=18 的传递方式

    router-link 写法
    <router-link :to="{path:'about',query:{name:'tracy', age: 18}}">

    @click 事件写法
    click(){
    this.$router.push({
    path:'/about',
    query:{
    name: 'tracy',
    age:18
    }
    })
    }
  • url 组成
    协议://主机:端口/路径?查询#片段
    scheme://host:port/path?query#fragment

vue-router 导航守卫

  • 为何使用导航守卫:如想在一个地方统一修改每个页面的 meta title
  • 在 router 文件夹的 index.js 文件中, 在 router 实例下面编写 beforeEach 函数
    const router = new Router(....);
    
    //前置守卫(guard)
    router.beforeEach((to, from, next) =>{
      document.title = to.matched[0].meta.title;
      next(); //这个函数必须要写,不写路由切换不了
      //to 要去的页面
      //from 从哪里来的页面
    })
    
    
  • 映射关系中也要编写 meta 信息
    {
    path: '/home',
    component: Pay,
    meta:{title: "首页"},
    },
  • 后置钩子(hook):router.afterEach
    不需要主动调用 next();
  • 上面我们所说的守卫是全局守卫,其实还有 路由独享守卫和组件内的守卫

keep-alive

  • keep-alive 可以使被包含的组件保留状态,或者避免重新渲染
  • 两个重要的属性
    • include: 字符串正则表达式,只有匹配的组件会被缓存
      (因为是正则,所以不能随便加空格)
    • exclude: 与上面相反
    • 只有在这个时候 组件内部的 name 属性才会派上用场
      如一个组件name :"tabBar", 另一个name:"hello"
       
    • <keep-alive include="tabBar,hello">
          <router-view />
      </keep-alive>

      对应的是 exclude, 写在 exclude 中的会销毁,其他的都不销毁

  • router-view 被包裹在 keep-alive 中的时候,所有匹配到的视图组件都会被缓存, 也就是说切换页面的时候所有组件不会重新渲染
  • 用 keep-alive 被包含的组件内的变量都会缓存,也就是说当你设置了 a = 2,离开这个页面再回来的时候, a 还是等于 2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tracy 小笔记 Vue - 路由 的相关文章

  • ReferenceError:找不到变量:需要

    我在加载时遇到问题node modules到我的网页之一 我已经安装了 npm node js 并且我想使用require 函数在我的网站上初始化 Firebase 我不知道为什么 但它抛出引用错误 ReferenceError 找不到变量
  • jQuery 中的 Javascript .files[0] 属性

    jQuery 中是否有与此语句等效的语句 var value document getElementById id files 0 使用附加 files 0 的标准 jQuery 选择器似乎不起作用 并且我找不到与 files 等效的 jQ
  • 如何使用键盘和鼠标控制相机 - Three.js

    我在 WEB GL 中有一个带有 Three js 的 3D 环境 并且我曾经使用 Orbitcontrols js http codepen io nireno pen cAoGI http codepen io nireno pen c
  • 从 x,y 屏幕空间坐标查找 2D 等距网格上的列、行(将方程转换为函数)

    我试图在屏幕空间点 x y 的二维等距网格中找到行 列 现在我几乎知道我需要做什么 即找到上图中红色向量的长度 然后将其与表示网格边界的向量的长度 由黑色向量表示 进行比较 现在我在数学堆栈交换中寻求帮助 以获得用于计算点 x y 与黑色边
  • 如何将中间件绑定到socket.io中的事件

    现在您可以将中间件绑定到io use middleware 但这仅在建立套接字连接时触发 有没有办法在将其传递给事件句柄之前拦截它 就像在expressjs中一样 换句话说 In 快递 js你可以做 app get middleware1
  • 将 Sweet Alert 弹出窗口添加到 React 组件中的按钮

    我为 Bootstrap 和 React 找到了这个完美的 Sweet Alert 模块 我在 Meteor 应用程序中使用它 http djorg83 github io react bootstrap sweetalert http d
  • 响应式网格布局框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用模态表单 ajax 超出 HTMLFormElement.toString 的最大调用堆栈大小

    我想使用模态窗口中的 ajax 请求提交表单 单击此链接可打开该模式 a class btn btn primary i class fa fa edit i Write a review a 模态窗口 div class modal fa
  • 如何使用 jQuery 向表中添加新行,并为其分配递增的 id

    我有一个现有的 HTML 表格 它是用户输入 GPS 点的表单的一部分 用户还可以选择上传 GPS 数据点 我想要一个用户可以按下的按钮 其中一些 Javascript 会向表中添加一个或多个新行 但新行必须继续增加表中使用的名称和 id
  • 使react-leaflet能够离线使用

    我一直在使用反应传单 https github com PaulLeCam react leaflet图书馆 到目前为止运作良好 现在我希望网站预加载尽可能多的图块 以便网络应用程序 也是 PWA 可以在没有互联网的情况下使用 我找到了一些
  • 使用 jquery 将字符串数组转换为整数

    我正在尝试将 jquery 中的字符串数组转换为整数数组 这是我的尝试 var cdata data values split each cdata function i l l parseInt l 我认为在这种情况下你不需要使用 Jqu
  • 是否可以使用打字稿映射类型来创建接口的非函数属性类型?

    所以我正在研究 Typescript 的映射类型 是否可以创建一个接口来包装另一种类型 从而从原始类型中删除函数 例如 interface Person name string age number speak void type Data
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • Jquery:选择菜单以显示和隐藏某些div元素

    我正在创建一个选择菜单 根据所选选项显示和隐藏某些 div 像这样的东西
  • ng-model 和值组合不适用于输入文本框

    我有两个输入文本框 我需要组合在两个文本框中输入的值并将其显示在第三个文本框中 如果我只使用value在第三个文本框中 Box 1
  • 如何获取使用 .map 渲染的第一个元素的 ref?

    我需要在几行中显示视频 卡片 的缩略图 并重点关注第一个缩略图 我使用嵌套地图进行了显示 该代码基本上迭代视频数组并返回多行视频 我们如何关注第一个渲染的元素 我认为我们需要获得第一个要聚焦的元素的引用 但是我们如何在这里设置 ref 并在
  • React Native - 跨屏幕传递数据

    我遇到了一些麻烦react native应用程序 我不知道如何跨屏幕传递数据 我意识到还有其他类似的问题在 SO 上得到了回答 但是这些解决方案对我来说不起作用 我正在使用StackNavigator 这是我的设置App js file e
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • Restangular - _.contains() 不是一个函数

    如果您最近通过 Bower 更新了 Restangular 它将安装最新的 Lodash 新的 4 0 然而 这是一个问题 因为 Restangular Angular 现在会抛出错误 contains 不是函数 你怎么解决 解决方案非常简
  • 我可以使用 jQuery 动态创建文件(及其内容)吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这是我的 HTML 代码 ul li

随机推荐

  • C++11多线程std::thread的简单使用

    文章转载自http blog csdn net star530 article details 24186783 在cocos2dx 2 0时代 我们使用的是pthread库 是一套用户级线程库 被广泛地使用在跨平台应用上 但在cocos2
  • SQL--多表查询(多表联查,如:LEFT JOIN、LEFT JOIN、LEFT JOIN、UNION ALL等)

    1 常见多表连接的三种方式 LEFT JOIN 左连接 查询左表所有数据和右表与左表属性值相等的记录 SELECT FROM TABELONE A LEFT JOIN TABELTWO B ON A id B id RIGHT JOIN 右
  • MySQL索引和性能优化

    索引 MySql底层的数据结构主要是基于Hash 和 B Tree 如果一个B tree的树高时3的话 那么非叶子节点2层 叶子节点1层 非叶子节点 16 1024 8 6 1170 非叶子节点两层 1170个元素 如果是两层 那么元素数量
  • logback和slf4j的使用之encoder和Layout

    一 encoder介绍 1 encoder 主要工作有两个 将一个event事件转换成一组byte数组 将转换后的字节数据输出到文件中 2 encoder组件是在0 9 19版本之后才引进来的 在以前的版本中 appender是使用layo
  • 计算sinx=x-x^3/3!+x^5/5!-x^7/7!+.........

    计算sinx x x 3 3 x 5 5 x 7 7 include stdio h include stdlib h include string h include math h int main float sum t int i x
  • Driver not loaded Driver not loaded(QT打包后在别人的电脑上运行出现这个错误)解决方法

    Driver not loaded Driver not loaded QT打包后在别人的电脑上运行出现这个错误 解决方法 出现这个错误 导致的原因有很多 所以不妨先试试我找的这种解决方法 我也是试过了很多方法 这种方法也许不适合所有人的错
  • 微信小程序 live-pusher 实时音视频录制 组件

    完整微信小程序 Java后端 技术贴目录清单页面 必看 实时音视频录制 v2 9 1 起支持同层渲染 需要用户授权 scope camera scope record 暂只针对国内主体如下类目的小程序开放 需要先通过类目审核 再在小程序管理
  • HTB-Tier2- Unified

    HTB Tier2 Unified Tags Web Vulnerability Assessment Databases Injection Custom Applications Outdated Software MongoDB Ja
  • Element ‘aop:before‘ must have no character or element information item [children], because

    报错的XML配置
  • centos8用阿里云安装yum源

    Centos8用阿里云装yum源 首先ping外网 ping baidu com能通就可以开始做了 阿里云yum源设置官方文档 https developer aliyun com mirror centos spm a2c6h 13651
  • Blender几个简单建模

    吉普车 这里车窗添加了玻璃材质 看起来更真实 简易台灯 可以设置成自己喜欢的形状 颜色 酒瓶 这是还没有上色的 啤酒瓶大多数都是绿色的 一把红色的椅子 个人喜欢红色系列的 就添加了红色 以上都是简单的模型 初学者还需要继续努力
  • Ajax&JavaScript&css模仿百度一下模糊查询功能

    1 效果 如下图所示 我们在输入大学时 程序会到后端查询名字中包含大学的数据 并展示到前端页面 用户选择一个大学 该大学值会被赋值到input表单 同时关闭下拉表单 当页面展示的数据都不符合条件时 用户点击空白处 可关闭表单 2 前端 2
  • 微信小程序案例分享

    微信小程序 后台管理类 1 社区团购小程序 2 音乐播放器小程序 3 家具商城小程序 4 二手交易小程序 5 疫苗小程序 6 智慧停车小程序 7 读书小程序 8 美食小程序 前后端分类 管理后台类 1 企业招聘 2 客户关系管理系统 3 试
  • 敏捷开发中asp.net MVC的开发次序感受(先开发View?先开发Model?先开发Controller!)

    转载自 http blog csdn net cheny com article details 6592493 各种思路和顺序都试过 最开始时先编写Model 毕竟Model是所有一切的基础 再说没有Model Controller里边用
  • 2019年中山大学数据科学与计算机学院研究生统考机试

    2019年中山大学数据科学与计算机学院研究生统考机试题目回忆 本文回忆了2019年中山大学数据科学与计算机学院研究生考试机试题目 希望能对以后的同学的学习有所帮助 机试共十道题 1 继承 一共有3个类 animal cat dog cat和
  • ciscn 2022 misc 部分wp

    everlasting night 提示是注意png数据块 然后注意图片通道数据可以用来lsb解码 下载是一张图片 尝试几种方法之后没有太大发现 得到提示于是看了一下stegsolve f78dcd383f1b574b 这里发现了一串可疑字
  • 90、Tensorflow实现分布式学习,多台电脑,多个GPU 异步试学习

    Created on 2017年5月28日 author weizhen import time import tensorflow as tf from tensorflow examples tutorials mnist import
  • Vue 实现左边导航栏且右边显示具体内容(element-ui)

    最终效果图 现在开始进入正题 1 安装element ui npm i element ui S CDN 目前可以通过 unpkg com element ui 获取到最新版本的资源 在页面上引入 js 和 css 文件即可开始使用
  • 探索人工智能

    前言 模型训练是指使用算法和数据对机器学习模型进行参数调整和优化的过程 模型训练一般包含以下步骤 数据收集 数据预处理 模型选择 模型训练 模型评估 超参数调优 模型部署 持续优化 文章目录 前言 数据收集 数据预处理 模型选择 模型训练
  • Tracy 小笔记 Vue - 路由

    Vue Router 路由中有一个非常重要的概念叫路由表 本质上就是一个映射表 决定了数据包的指向 服务器渲染 后端渲染 如 jsp php java 服务器直接生产渲染好对应的 html 页面 返回到客户端进行展示 这种情况下渲染好的页面