当前位置: 首页 > news >正文

Ajax 与 Vue 框架应用点——随笔谈

老式

  • 在老式的技术中,一个网页通常由前端工程师直接使用 HTML、CSS、JavaScript 编写而成

  • 这种方式的优点很明显:简单粗暴,方便工程师以简单的思维完成工作

  • 当然,缺点也很明显,包括但不限于:

    • 直接原生开发,对工程师技术要求高
    • 每次从零开始,开发效率底下,代码复用性较差
    • 前端项目构建的开放性较大,不方便统一管理
  • 聪明的程序员们怎么会忍受这些?

  • 于是,在众多大神的努力下,新式技术应运而生,百家争鸣

新式

Ajax 技术解决获取资源的问题

引入

  • 在过去,哪怕是现在,依然有很多网页是通过刷新整个页面,进行加载并重组资源
  • 这种技术很好,没有问题。
  • 然而,我们有新的需求:在一些场景下,我们并不希望整个页面重新加载,而只是希望页面里面的某个区域的内容自己更新(比如:当你在百度搜索框输入内容时,下面的提示词会不断变化)
  • 这时候,我们就要用到 Ajax 技术。

详情

Ajax 技术,值得并不是一个具体的技术,而是一个技术统称,一个笼统的概念。

这种技术有什么特点呢?

  • 异步特性
  • 发送资源请求,监听响应
  • 接受资源响应,作出渲染

简单来说,如果你能实现上面的特点,就可以说你使用了 Ajax 技术

下面简单介绍几种实现 Ajax 技术的方式

原生方式:通过原生 JavaScript 技术,实现 Ajax。具体操作是通过 XMLHttpRequest (XHR)发送资源请求 + Promise 处理响应(包括:响应中、响应成功、响应失败)。其中,XMLHttpRequest 负责资源的获取,Promise 负责异步处理结果

使用框架:使用别人开发的框架,实现 Ajax。比如使用 axios 框架,很方便的实现 “异步请求,处理响应”。

新语法糖 + axios框架:ES2017 引入了新的语法糖 asyncawait,它们用于简化 JavaScript 中异步代码的编写。Ajax 技术的重点就是"异步" + “资源(请求资源,处理响应)”,通过新语法糖,我们很方便的解决了 “异步” 的问题,剩下的就是 “资源” 的问题,所以我们还需要借助 axios框架获取资源的这个特性(当然,使用XMLHttpRequest获取资源也可以)

// 定义一个异步函数
async function fetchUserData() {try {// 使用 await 等待 axios 请求完成const response = await axios.get('https://api.example.com/user');// 处理响应数据console.log(response.data);} catch (error) {// 处理错误console.error(error);}
}// 调用异步函数
PromiseObj = fetchUserData();
  • 通过 async 与 await 语法糖,写一个异步函数
  • await 附近的变量存储的是什么?
  • response 变量存储的是 axios.get 调用成功后返回的结果。这个结果不是 Promise 对象,而是 Promise 被解决后传递给 .then() 方法(或者在 await 表达式中)的值。在 axios 的案例中,这个值通常是包含服务器响应数据的对象。
  • 异步函数的返回值是什么?
  • **这个异步函数总是返回一个 Promise 对象。**无论 async 函数内部的执行是否完成,它都会立即返回一个 Promise 对象。这个 Promise 对象代表了异步函数的最终完成(或失败)状态。
  • 如果 async 函数内部的所有操作都成功完成,并且没有抛出任何错误,那么返回的 Promise 对象最终会被解决(即成功状态)。
  • 如果 async 函数内部抛出了错误,并且这个错误没有被 try...catch 捕获,那么返回的 Promise 对象最终会被拒绝(即失败状态)。
  • 异步函数的返回值有什么用?
  • **异步函数的返回值是一个 Promise 对象,它可以进行链式调用。**比如:你可以使用 .then() 方法来链式调用后续的操作,这在需要按顺序执行多个异步操作时很有用,也可以使用 .catch() 方法来捕获异步函数中可能发生的错误。
  • 在另一个异步函数中,你可能需要等待多个异步操作完成后再继续执行。
async function复合材料() {const result1 = await asyncFunction1();const result2 = await asyncFunction2();// 使用 result1 和 result2
}
  • 组合多个异步操作,使用 Promise.all() 来同时处理多个异步函数的返回值。
Promise.all([asyncFunction1(), asyncFunction2()]).then(results => {// 处理所有结果}).catch(error => {// 处理第一个失败的 promise 的错误});
  • 可以不关心返回值(如果异步函数内部已经处理了所有的逻辑,包括错误处理,那么外部可能不需要关心返回的 Promise)
async function doSomething() {try {const result = await someAsyncOperation();// 处理 result} catch (error) {// 处理错误}
}// 调用 doSomething(),不需要关心返回的 Promise
doSomething();

Vue 解决数据绑定的问题

在前端中,页面要展示的数据和 js 这种动态的数据,往往需要进行绑定的,比如,我们通常会用 addEventListener 方法进行监听某个操作,如果执行了操作,就更新数据。这个本质上其实就是为了将 js 动态数据和 页面的静态数据进行绑定。由静态数据到动态数据,往往意味着用户输入的静态数据要进行动态处理;而由动态数据到静态数据,往往意味着来自服务器的数据给到了 动态的 js 处理了,就差渲染到页面的这最后一步。

上面的问题其本质就是数据的绑定问题。通常,前端工程师在写项目的时候,往往需要写大量的 dom 操作:“获取元素对象” + “将此对象数据修改”(由动到静) ,或者 “监控用户数据的修改” + “执行计算操作,或者上传服务器”(由静到动);而如果前端工程师使用了 Vue 框架之后,这个问题就大大被削弱了,因为 vue.js 其中一大特点就是数据绑定(包括:双向数据绑定、单向数据绑定)

https://img-blog.csdnimg.cn/2f9fb673cb5446e9b84bf6fa6c12902e.png

Vue 单页面与路由机制解决加载流畅的问题

question:为什么使用Vue所制作的网页是单页面的呢?

answer:https://blog.csdn.net/qq_53715003/article/details/120658699

vue 单页面本质就是:通过 vue 环境编写代码,通过 vue 构建工具 将vue代码 转变成 类似原生的 html、css、js 组成的浏览器可识别的代码,然后大部分资源都已经发送到客户端,客户端的浏览器运行 vue.js ,就形成了类似 本地小型服务器一样的 东西,而说它是单页面,原因是因为它本质就只有一个 html 文件,只是通过 js 技术,进行页面内容的切换,注意!是页面内容的切换,是内容的切换,本质上页面还是哪个页面,所以在我们使用 vue 中的路由机制时,它大部分都不用请求资源,直接利用本地的资源包,通过 vue.js 将页面的内容改变即可。

所以,大部分普通网站一般都是使用按需加载,就是平常我们刷新一些,加载一个页面,跳转一下,又跳到新的页面,这些都是按需加载的。而 vue 构建的单页面应用网站,当你访问它的时候,如果没有优化的话,大部分情况是你第一次访问此网站时候,需要加载大量的资源到本地,然后 vue.js 运行在浏览器,形成一个类型小型服务器帮助你切换页面和页面效果。之后你第二次访问,基本上速度是很快的,因为只需要少量资源补充,大部分内容你早就有了。

以下是 AI 回答的内容:

  1. Vue代码转变成浏览器可识别的代码: 使用Vue构建工具(如Vue CLI)可以将Vue单文件组件(.vue文件,包含模板、脚本和样式)编译成浏览器可以解析的HTML、CSS和JavaScript代码。这个过程通常涉及打包工具(如Webpack)来处理模块化和资源加载。
  2. 单页面本质: 单页面应用(SPA)确实只有一个HTML文件。当用户首次访问网站时,这个HTML文件会被加载,并且所有必要的JavaScript、CSS和其他资源也会被下载到用户的浏览器中。
  3. 页面内容切换: 当用户在应用内部进行导航时,Vue Router会拦截浏览器的默认行为,阻止页面刷新,并通过JavaScript动态地替换页面的内容。这是通过替换<router-view>组件中的内容来实现的,而不是重新加载整个页面。
  4. 资源加载: 在单页面应用中,一旦初始资源被加载,用户在应用内的进一步导航通常不需要再次下载HTML文件或其他资源,因为它们已经被缓存了。只有当需要新的组件或数据时,才会进行额外的资源请求。
  5. 首次加载与后续访问: 首次访问单页面应用时,由于需要加载整个应用框架和初始视图所需的资源,可能会有较长的加载时间。但是,一旦资源被缓存,用户在后续访问时,应用可以快速加载,因为大部分资源已经存在于本地。
  6. 与普通网站的对比: 传统多页面应用(MPA)每次页面跳转都需要从服务器加载新的HTML文件,而单页面应用则避免了这种重复的资源加载,通过JavaScript动态更新视图。

值得注意的是,为了优化用户体验和提高性能,开发者通常会采取一些措施,比如代码分割(code splitting)、懒加载(lazy loading)和资源预加载(preloading),以确保应用即使在首次加载时也能快速响应。

Vue 解决项目规范与代码复用的问题

我们在上面粗略的介绍了 vue 的全貌,接下来在这里,我们就进入它的开发环境进行介绍。

Vue.js 框架提供了一系列的特性和最佳实践来帮助开发者解决项目规范和代码复用的问题。以下是一些方法和工具:

项目规范

  1. Vue CLI:
    • Vue CLI 提供了一套预设的项目结构和配置,帮助开发者快速搭建符合Vue最佳实践的项目框架。
    • 它还允许自定义配置,以便于团队根据特定需求来调整项目规范。
  2. ESLint:
    • 通过集成ESLint,Vue CLI可以在开发过程中实时检查代码质量,确保代码风格的一致性。
    • ESLint规则可以根据团队的编码习惯进行配置。
  3. EditorConfig:
    • 通过EditorConfig文件,可以统一不同开发者的编辑器配置,如缩进风格、换行符等。
  4. Style Guide:
    • Vue官方提供了Vue风格指南,建议开发者遵循,以保持代码的一致性和可维护性。
  5. 组件库和命名约定:
    • 组件命名约定可以确保组件的清晰性和可预测性。
    • 使用统一的组件库,如Vuetify、Element UI等,可以保持UI的一致性。

代码复用

  1. 组件化:
    • Vue鼓励开发者将UI拆分成可复用的组件,每个组件包含自己的逻辑和样式。
    • 组件可以跨项目复用,只需导入即可。
  2. Mixins:
    • Mixins允许开发者封装可复用的代码片段,然后在多个组件中混入使用。
    • 但要注意过度使用Mixins可能会导致代码难以追踪和维护。
  3. Vuex:
    • Vuex是Vue的官方状态管理库,它允许跨组件共享状态。
    • 通过Vuex,可以集中管理应用的状态,减少重复的状态逻辑。
  4. 自定义指令:
    • 自定义指令可以将可复用的行为抽象出来,用于不同的元素和组件。
  5. 插件:
    • Vue插件提供了一种方式来全局添加功能,如全局方法、过滤器、指令等。
    • 可以将常用的功能封装成插件,以便在不同项目中复用。
  6. 插槽(Slots):
    • 插槽允许开发者向组件内部传递内容,从而增加组件的灵活性。
  7. HOC(Higher-Order Components):
    • 高阶组件是一个函数,接收一个组件作为参数,返回一个新的组件。
    • 它可以用于封装可复用的逻辑和功能。

通过上述方法和工具,Vue.js能够有效地解决项目规范和代码复用的问题,帮助开发者构建高效、可维护的Vue应用。

相关文章:

Ajax 与 Vue 框架应用点——随笔谈

老式 在老式的技术中&#xff0c;一个网页通常由前端工程师直接使用 HTML、CSS、JavaScript 编写而成 这种方式的优点很明显&#xff1a;简单粗暴&#xff0c;方便工程师以简单的思维完成工作 当然&#xff0c;缺点也很明显&#xff0c;包括但不限于&#xff1a; 直接原生开发…...

The Internals of PostgreSQL 翻译版 持续更新...

为了方便自己快速学习&#xff0c;整理了翻译版本&#xff0c;目前翻译的还不完善&#xff0c;后续会边学习边完善。 文档用于自己快速参考&#xff0c;会持续修正&#xff0c;能力有限,无法确保正确!!! 《The Internals of PostgreSQL 》 不是 《 PostgreSQL14 Internals 》…...

redis 原理篇 31 redis内存回收 内存淘汰策略

哦哦&#xff0c; 内存满了咋搞 就算过期key 删除&#xff0c;还是不够用&#xff0c; 这种问题没办法&#xff0c;只能了解一下啥解决方案了&#xff0c; 内存是有限的&#xff0c;一直存&#xff0c;肯定会满&#xff0c;这时&#xff0c;咋处理&#xff1f; 首先&#xff…...

微信小程序——实现二维码扫描功能(含代码)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

【go从零单排】HTTP客户端和服务端

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;net/http 包提供了强大的 HTTP 客户端和服务器功能。 &…...

Android 配置默认输入法

1.背景 最近有个国内的项目&#xff0c;预制了输入法apk&#xff0c;但是无法调出软键盘。原因是没有配置默认输入法&#xff0c;本文主要记录下如何配置默认输入法。 2.代码设置 设置默认输入法需要配置Settings.Secure.ENABLED_INPUT_METHODS和Settings.Secure.DEFAULT_IN…...

交易术语汇总(Technical Trading Dictionary)

Arbitrage (套利) --- 一种利用交易所之间的差价获利的方法。 Accumulation (累积) --- 在一种资产中建立头寸的过程。 Ask/Bid (询价/竞价) --- 卖出订单是询价(Ask)&#xff0c;买入订单是出价(Bid)。 ATH&#xff08;历史最高价) --- All-time high 全时高。 Bearish MS…...

【Docker】Docker基础及docker-compose

一、Docker下载 更新yum包 yum update 安装需要的软件包&#xff08; yum-util 提供yum-config-manager功能&#xff0c;后两个是devicemapper驱动依赖&#xff09; yum install -y yum-utils device-mapper-persistent-data lvm2 设置stable镜像仓库&#xff08;使用阿里…...

从零开始的 Hugging Face 项目:我的首个在线 SQL 查询工具之旅20241111

从零开始的 Hugging Face 项目&#xff1a;我的首个在线 SQL 查询工具之旅 作为一名 AI 初学者&#xff0c;我最近完成了一个意义非凡的项目&#xff1a;在 Hugging Face Spaces 上构建了一个简单却实用的在线 SQL 查询工具。这个项目不仅让我了解了 Hugging Face 平台的核心功…...

让AI为你发声!Windows电脑快速部署ChatTTS文本转语音神器

文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 嘿&#xff0c;朋友们&#xff01;今天我们来聊聊如何在Windows系统上快速搭建ChatTTS&#xff0c;一个超酷的开源文本转语音项目。更棒的是&#xff0c;我们还可以用Cp…...

【AI换脸整合包及教程】FaceFusion 3.0.0:AI换脸技术的革新之旅

在人工智能技术的飞速发展中&#xff0c;AI换脸技术成为了近年来备受瞩目的焦点之一。FaceFusion 3.0.0&#xff0c;作为这一领域的最新力作&#xff0c;不仅继承了前代产品的优点&#xff0c;还在功能和用户体验上进行了全面升级和优化&#xff0c;为用户带来了前所未有的换脸…...

更新对象或数组的值的方法

一、数组的映射或更新 map(): 用于创建一个新数组&#xff0c;数组中的每个元素是对原数组元素执行函数后的结果。 const arr [1, 2, 3]; const newArr arr.map(item > item * 2); // [2, 4, 6]forEach(): 用于遍历数组&#xff0c;对每个元素执行操作&#xff0c;但不返…...

Java线程池浅谈(创建线程池及线程池任务处理)

1-认识线程池 什么是线程池&#xff1f; 线程池就是一个可以复用线程的技术。 不使用线程池的问题 比方说淘宝&#xff0c;不使用线程池&#xff0c;现在有一亿个线程同时进来&#xff0c;CPU就爆了。用户每发起一个请求&#xff0c;后台就需要创建一个新线程来处理&#xf…...

Dockerfile的使用

简介 制作docker镜像可以通过修改容器的方式&#xff0c;也通过通过Dockerfile文件的方式&#xff0c;下面通过Dockerfile文件的例子进行说明。 Dockerfile文件 FROM openjdk:8-alpine#ENV http_proxy http://127.0.0.1:7890 #ENV https_proxy http://127.0.0.1:7890#ENV TZ…...

自動換IP為什麼會不穩定?

自動換IP可能導致不穩定的原因有以下幾點&#xff1a; 1. 連接中斷 自動換IP的一個直接後果就是連接中斷。每當IP地址發生變化時&#xff0c;網路連接可能會短暫中斷。這就像你在搬家時&#xff0c;暫時無法接收郵件一樣。對於需要持續連接的任務&#xff0c;比如視頻會議或線…...

【0x0043】HCI_Write_Inquiry_Scan_Type详解

目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Write_Inquiry_Scan_Type命令格式 2.2. Scan_Type 2.3.具体格式示例 三、响应事件及参数说明 3.1. HCI_Command_Complete事件 3.2. Status 四、命令执行流程 4.1. 命令准备阶段 4.2. 命令传输阶段 4.3. 命令处理…...

飞牛云fnOS本地部署WordPress个人网站并一键发布公网远程访问

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress 前言 本文旨在详细介绍如何在飞牛云NAS上利用Docker部署WordPress&a…...

ctfshow-web入门-SSTI(web361-web368)上

目录 1、web361 2、web362 3、web363 4、web364 5、web365 6、web366 7、web367 8、web368 1、web361 测试一下存在 SSTI 注入 方法很多 &#xff08;1&#xff09;使用子类可以直接调用的函数来打 payload1&#xff1a; ?name{{.__class__.__base__.__subclasses__…...

pyinstaller+upx给python GUI程序添加自定义图标

一、在线.ico图标生成 windows用48x48尺寸 https://www.ico51.cn/ 二、upx打包图标工具 https://upx.github.io/ 三、UI文件生成py代码 pyside2-uic window.ui > window.py 四、打包命令 1、–icon&#xff1a;这个是.ico图标路径 2、–upx-dir&#xff1a;upx打包工…...

LeetCode【0034】在排序数组中查找元素的第一个和最后一个位置

本文目录 1 中文题目2 求解方法&#xff1a;左右边界二分查找2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 给定一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存…...

react-markdown内容宽度溢出和换行不生效问题

情景复现&#xff1a; 解决办法&#xff0c;添加样式进行限制 /* index.css */ .markdown-container {word-break: break-word; /* 强制长单词断行 */white-space: pre-wrap; /* 保留空白符序列&#xff0c;但是正常地进行换行 */overflow-wrap: break-word; /* 在长单词或…...

uniapp 上传 base64 图片

在图片裁剪时候返回的是base64文件 需要上传到obs一般出现在h5网页端 可以直接使用 js 原始解决 应该只可以在h5浏览器内使用 // 提取 Base64 编码部分 const base64Data e.tempFilePath.replace(/^data:image\/(\w);base64,/, ""); // 将 Base64 编码转换为 Arra…...

让Git走代理

有时候idea提交代码或者从github拉取代码&#xff0c;一直报错超时或者:Recv failure: Connection was reset,下面记录一下怎么让git走代理从而访问到github。 1.打开梯子 2.打开网络和Internet设置 3.设置代理 记住这个地址和端口 4.打开git bash终端 输入以下内容 git c…...

通义千问API调用测试 (colab-python,vue)

文章目录 代码&#xff08;来自官网&#xff09;colab中用python测试Qwen2.5在官网上查看并确定过期时间这里看到我的免费额度到25年5月在同一个页面&#xff0c;点击API示例 前端调用直接在前端调用的优缺点以vue为例&#xff08;代码是基于官网node.js的代码转换而来&#xf…...

H3C ER8300G2-X未授权导致信息泄露漏洞(CVE-2024-32238)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

随手记:简单实现纯前端文件导出(XLSX)

1.需求背景&#xff1a; 由于导入需要经过后端存储数据库&#xff0c;所以导入还是和后端联调 但是简单的前端导出有部分是可以直接给到用户 xlsx插件简介 xlsx插件&#xff08;通常指的是SheetJS/js-xlsx&#xff09;是一个强大的JavaScript库&#xff0c;它允许你在浏览器…...

SwiftUI 高级开发教程系列 - 第 3 章:数据持久化

在现代应用中,数据持久化是一项非常重要的功能,它使得应用的数据可以在重启后依然保留,提升用户体验。SwiftUI 提供了多种数据持久化方法,包括使用 UserDefaults 保存简单数据和 Core Data 进行更复杂的数据管理。本章将详细讲解这两种技术的用法,并展示如何在 SwiftUI 项…...

代码随想录第二十四天| 93.复原IP地址 78.子集 90.子集II

93. 复原IP地址 题目描述 给定一个只包含数字的字符串 s&#xff0c;复原它并返回所有可能的有效 IP 地址格式。 一个有效的 IP 地址 由四个整数部分组成&#xff0c;每部分的取值范围是 0-255&#xff0c;每个部分不能包含前导零。 解题思路 这道题目要求我们将一个数字字…...

Linux编程:基于 Unix Domain Socket 的进程/线程间通信实时性优化

文章目录 0. 引言1. 使用 epoll 边缘触发模式非不要不选择阻塞模式边缘触发&#xff08;ET&#xff09;模式优点示例 2. 使用实时调度策略3. CPU 绑定4. 使用无锁缓冲区5. 优化消息传递的大小和频率6. 使用 SO_RCVTIMEO 和 SO_SNDTIMEO7. 示例代码其他阅读 0. 引言 前几天被问…...

PET-文件包含-FINISHED

include发生错误报warning&#xff0c;继续执行。require发生错误直接error&#xff0c;不继续执行 无视扩展名&#xff0c;只要能解析&#xff0c;就能当可执行文件执行&#xff0c;哪怕文件后缀或没后缀 1 条件竞争 pass17 只需要知道tmp的路径。把xieshell.jpg上传&…...