前端开发:Vue以及Vue的路由

news2025/3/23 10:58:21

Vue是什么

警告:本文作者是底层程序员,对Vue只是偶尔用到,研究并不深入,对Vue的理解可能非常肤浅甚至存在错误,请多包含。以下文字只为外行记录分享,专业前端朋友可以略过。

作为一个底层老程序员,比如经常写驱动或者内核的,再不济也像我这样整天跟Epoll、Socket打交道的老家伙,可能对Vue的那一大套东西,有点儿陌生。

甚至,可能会有点儿疑惑,有Java、PHP、Python、go、Rust等一大票后端语言,有HTTP协议交换数据,有HTML负责显示,有CSS渲染参数,还有JavaScript在浏览器里动态执行,还要Vue这种东西干什么呢?

按照我的理解就是,虽然以上这些技术已经足够完成Web开发了,但是对于纯前端来说,工程化的程度并不够。

比如,HTML里面已经定义好了各种组件,比如输入框、文本框、单选按钮等等,但是问题也就在这里,即HTML不支持自定义组件。或者说,支持自定义组件,但是并不容易。很多开发团队使用HTML+CSS+JavaScript实现了自己的组件,但是被其它团队开箱即用。

再比如,虽然JavaScript足够灵活,但是是语言层面的。即JavaScript支持各种语言特性,但是这些语言特性,跟真正的前端结合起来,就需要CSS、HTML等东西的配合,另外很多跟浏览器还强相关。

所以,就有了Vue这种更工程化的库(我是这么理解的)。

使用Vue,可以方便地定义一些前端组件,其它团队只要引入Vue的这些组件,就可以像Java、Python的包一样引入,像Rust的crate一样开箱即用。

Vue的Router

Vue可以支持单页面应用。即整个项目就在一个大的首页里面,所有的跳转都在这个首页里面,所有的操作观感,就类似于通过Ajax技术,不断地拖动地图应用里面的地址,放大缩小,前前后后。

对于开发来说,就不需要再写HTML,只需要写Vue就好。在Vue里面,把一些动作指向不同的组件,跳来跳去。

而这种跳转,就可以通过Router来做。

其实,很多后端语言里面,都是通过把URL集合做成路由的,前端语言也采取了这种设定。

使用Vue的Router需要安装vue-router,之后使用CreateRouter方法。

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export default new Router({
  mode: 'hash',
  routes: [
    {
      path: '/login',
      name: 'login',
      component: login
    },
    {
      path: '/logout',
      name: 'logout',
      component: logout
    }
    ]
    })

上面的代码就是,/login就会跳转到login组件,/logout就会跳转到logout组件。

Router的两种mode

需要注意的是,Router的mode选项有两种。

一种是上面设置的hash,这种mode的url会加上#。即,如果我们部署在http://test.com网站,那么我们的登录页url将会是http://test.com/#login。

这样的好处是,当我们在网页中打开http://test.com/#login之后,刷新页面的时候,仍然会向Web服务器请求/,然后通过本地的Vue代码,跳转到#login页面。

如果我们使用的是另一种mode,即history,跳转的url会是http://test.com/login,这样如果我们刷新页面,浏览器就会向Web服务器请求http://test.com/login。默认情况下,我们的服务器解析不了这个url,会返回404。

为了让这种模式工作,我们需要在Web服务器上,配置/login到/,有多少就需要配置多少。当然也可以使用正则表达式,把所有相关的url都重定向到/,但是这样的问题是,有些真正需要服务端处理的url,就也被重定向了。在使用中,需要根据具体业务,灵活配置。

比如,如果在Django中,就可以在urls.py文件里使用re_path来添加:

urlpatterns = [  
    # admin url  
    path('admin/', admin.site.urls),  
    # vue  url  
    path('', TemplateView.as_view(template_name="index.html")),

    # 正则表达式满足login、logou
    re_path('/log.*', TemplateView.as_view(template_name="index.html"))
]

Router的动态匹配

Vue的Router也支持动态匹配,只要在url字段里加入:即可。

如:

export default new Router({
  mode: 'hash',
  routes: [
    {
      path: '/user/:id',
      name: 'user',
      component: User
    }
    ]
    })

之后类似 /user/a、/user/b、/usr/cdlkafdjkl 等这样的url都会映射到User组件上。

当一个路由被匹配时,值将在每个组件中以 route.params 的形式暴露出来。因此,我们可以通过User 的模板来呈现当前的id:

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

另外,Router也支持多个参数,只要每个都以:开头,之后就可以在router.params里访问了,非常方便。

Vue的Router的组件复用问题

当使用了动态匹配之后,当连续进入同一个组件的时候,Vue就不会刷新组件了。我们为了更改其中动态的页面部分,需要在回调里面,实现动态更改组件的逻辑。

如:

export default {
 beforeRouteEnter (to, from, next) {  
   console.log('beforeRouteEnter: ' + to.path)  
   next(vm => {  
     vm.urlChanged(to);  
   })  
 },  
 
 beforeRouteUpdate (to) {  
   console.log('beforeRouteUpdate: ' + to.path)  
   this.urlChanged(to);
   next()
 },
}

**一定注意beforeRouteUpdate回调函数中,最后要加上next调用,这样Router的回调链才能继续下去。

NavigationDuplicated

重复打开同样的url,Vue-Router会拒绝执行,终端返回一个错误:

Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location: ......

不影响使用。

但是,如果想关闭这个错误记录,也是可以的。即覆写一下Router的push方法,在错误回调中,把这种错误信息过滤掉。

const originalPush = Router.prototype.push  
Router.prototype.push = function (location) {  
  originalPush.call(this, location).catch((err) => {  
    if (err.name !== 'NavigationDuplicated') {  
      console.trace(err)  
    }  
  })  
}

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

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

相关文章

【JavaEE进阶】Linux常用命令

目录 &#x1f343;前言 &#x1f334;pwd 与 ls &#x1f6a9;pwd &#x1f6a9;ls &#x1f38d;cd &#x1f332;mkdir与touch &#x1f6a9;mkdir &#x1f6a9;touch &#x1f340;cat与rm &#x1f6a9;cat &#x1f6a9;rm &#x1f38b;vim &#x1f6a9;…

【FastGPT】利用知识库创建AI智能助手

【FastGPT】利用知识库创建AI智能助手 摘要创建知识库上传文档创建应用准备提示词准备开场白关联知识库AI回答效果 摘要 关于FastGPT的部署&#xff0c;官方提供了docker-compose方式的部署文档&#xff0c;如果使用的是podman和podman-compose的同学&#xff0c;可以参考这篇…

【DeepSeek 学c++】dynamic_cast 原理

用于向下转化。 父类引用指向指类对象 假设父亲是a, 子类是b. B* pb new B; 子类对象 A* pa 父类引用指向子类对象&#xff0c; 那么向上转化 Apa pb 这个是自动完成的&#xff0c;隐式转化&#xff0c;不需要dynamic_cast 向下转化指的是 A pa new B。 这个是指向子类对象…

【递归,搜索与回溯算法篇】- 名词解释

一. 递归 1. 什么是递归&#xff1f; 定义&#xff1a; 函数自己调用自己的情况关键点&#xff1a; ➀终止条件&#xff1a; 必须明确递归出口&#xff0c;避免无限递归 ➁子问题拆分&#xff1a; 问题需能分解成结构相同的更小的子问题缺点&#xff1a; ➀栈溢出风险&#x…

Beans模块之工厂模块注解模块@Qualifier

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

数据结构---图的深度优先遍历(DFS)

一、与树的深度优先遍历之间的联系 1.类似于树的先根遍历。 递归访问各个结点&#xff1a; 2.图的深度优先遍历 先设置一个数组&#xff0c;初始值全部设置为false&#xff0c;先访问一个结点&#xff0c;在用一个循环&#xff0c;依次检查和这个结点相邻的其他结点&#xff0c…

健康养生:拥抱生活,从呵护身心开始

在这个瞬息万变的时代&#xff0c;人们好似不停旋转的陀螺&#xff0c;在忙碌中迷失了对健康的关注。然而&#xff0c;健康养生绝非可有可无的点缀&#xff0c;它是幸福生活的基石&#xff0c;如同阳光与空气&#xff0c;滋养并支撑着我们的生命。当我们懂得拥抱健康养生&#…

QT网页显示的几种方法及对比

一.直接跳转打开网页 1.使用QDesktopServices::openUrl调用系统浏览器 原理&#xff1a;直接调用操作系统默认浏览器打开指定URL&#xff0c;不在应用程序内嵌入网页。 优点&#xff1a; 实现简单&#xff0c;无需额外模块或依赖。 适用于仅需跳转外部浏览器的场景。 缺点&…

Linux python 安装 conda(内部自带的有python的版本了)

位置网站 https://repo.anaconda.com/miniconda/也可以在https://www.anaconda.com/download/success 官方下载之后方linux中 切换路径之后 执行 bash Miniconda3-py310_25.1.1-2-Linux-x86_64.sh [rootVM-4-5-centos ~]# [rootVM-4-5-centos ~]# uname -a Linux VM-4-5-cen…

git原理与常用命令及其使用

认识工作区、暂存区、版本库 ⼯作区&#xff1a;是在电脑上你要写代码或⽂件的⽬录。 暂存区&#xff1a;英⽂叫 stage 或 index。⼀般存放在 .git ⽬录下的 index ⽂件&#xff08;.git/index&#xff09;中&#xff0c;我们 把暂存区有时也叫作索引&#xff08;index&#xf…

19681 01背包

19681 01背包 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;动态规划、01背包 &#x1f4d6; &#x1f4da; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N 10001…

Guava:Google开源的Java工具库,太强大了

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

蓝桥杯每日一题----海底高铁

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 题目链接 P3406 海底高铁 - 洛谷https://www.luogu.com.cn/problem/P3406 解题思路 在这道题来说&#xff0c;主要使用的想法就是使用一维的差分数组&#xff0c;这道题中有两个买…

触动精灵对某东cookie读取并解密--记lua调用C语言

在Mac上构建Lua扩展模块&#xff1a;AES解密与Base64解码实战 今天我要分享一个实用技术&#xff1a;如何在Mac系统上为Lua编写和编译C扩展模块&#xff0c;特别是实现一个某东iOS PIN码解密功能的扩展。这对于需要在Lua环境中执行高性能计算或使用底层系统功能的开发者非常有…

【设计模式】三十二、策略模式

系列文章|源码 https://github.com/tyronczt/design-mode-learn 文章目录 系列文章|源码一、模式定义与核心思想二、模式结构与Java实现1. 核心角色2. Java代码示例 三、策略模式的五大核心优势四、适用场景五、与其他模式的对比六、最佳实践建议总结 &#x1f680;进阶版【更…

Cyberchef实用功能之-json line格式文件美化和查询

本文将介绍一下如何使用cyberchef对json line格式数据进行美化方便阅读&#xff0c;以及json line格式数据的批量查询操作。 之前的文章介绍了json格式数据的美化和查询&#xff0c;即Cyberchef实用功能之-json解析美化和转换&#xff0c;Cyberchef实用功能之-批量提取json数据…

计算机基础:编码03,根据十进制数,求其原码

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;计算机基础&#xff1a;编码02&#xff0c;有符号数编码&#xf…

FaryGui文字shader修改,弧线排列

因项目要求,希望将文字进行标题那样的弧线排列,如下图: 对FaryGUI的文字Shader进行了一些修改,基本达到要求,shader设置如下: shader代码如下: // Upgrade NOTE: replaced _Object2World with unity_ObjectToWorld // Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with Un…

C++ string的模拟实现

Hello!!大家早上中午晚上好&#xff0c;昨天复习了string的使用&#xff0c;今天来模拟实现一下string&#xff01;&#xff01;&#xff01; 一、string的框架搭建 1.1首先我们需要一个string的头文件用来做变量、函数、类等声明&#xff1b;再需要一个test文件来做测试,还需…

使用LangChain实现基于LLM和RAG的PDF问答系统

目录 前言一.大语言模型(LLM)1. 什么是LLM&#xff1f;2. LLM 的能力与特点 二、增强检索生成(RAG)三. 什么是 LangChain&#xff1f;1. LangChain 的核心功能2. LangChain 的优势3. LangChain 的应用场景4. 总结 四.使用 LangChain 实现基于 PDF 的问答系统 前言 本文将介绍 …