动力节点Vue3课程笔记——四、Vue与AJAX

news2025/1/16 5:13:22

四、Vue与AJAX

4.1 回顾发送AJAX异步请求的方式

发送AJAX异步请求的常见方式包括:

原生方式,使用浏览器内置的JS对象XMLHttpRequest

  • const xhr = new XMLHttpRequest()
  • xhr.onreadystatechange = function(){}
  • xhr.open()
  • xhr.send()

原生方式,使用浏览器内置的JS函数fetch

  • fetch(‘url’, {method : ‘GET’}).then().then()

第三方库方式,JS库jQuery(对XMLHttpRequest进行的封装)

  • $.get()
  • $.post()

第三方库方式,基于Promise的HTTP库:axios (对XMLHttpRequest进行的封装)

  • axios.get().then()

axios是Vue官方推荐使用的

4.2 回顾AJAX跨域

什么是跨域访问?

在a页面中想获取b页面中的资源,如果a页面和b页面所处的协议、域名、端口不同(只要有一个不同),所进行的访问行动都是跨域的。

哪些跨域行为是允许的?

  • 直接在浏览器地址栏上输入地址进行访问
  • 超链接
  • <img src=”其它网站的图片是允许的”>
  • <link href=”其它网站的css文件是允许的”>
  • <script src=”其它网站的js文件是允许的”>
  • ......

哪些跨域行为是不允许的?

  • AJAX请求是不允许的
  • Cookie、localStorage、IndexedDB等存储性内容是不允许的
  • DOM节点是不允许的

AJAX请求无法跨域访问的原因:同源策略

  • 同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSRF等攻击。同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
  • AJAX请求不允许跨域并不是请求发不出去,请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。

解决AJAX跨域访问的方案包括哪些

① CORS方案(工作中常用的)

  • 这种方案主要是后端的一种解决方案,被访问的资源设置响应头,告诉浏览器我这个资源是允许跨域访问的:response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");

② jsonp方案(面试常问的)

  • 采用的是<script src=””>不受同源策略的限制来实现的,但只能解决GET请求。

③ 代理服务器方案(工作中常用的)

  • Nginx反向代理
  • Node中间件代理
  • vue-cli(Vue脚手架自带的8080服务器也可以作为代理服务器,需要通过配置vue.config.js来启用这个代理)
  • postMesssage
  • websocket
  • window.name + iframe
  • location.hash + iframe
  • document.domain + iframe
  • ......

代理服务器方案的实现原理

同源策略是浏览器需要遵循的标准,而如果是服务器向服务器请求就无需遵循同源策略的。

 

4.3 演示跨域问题

Vue脚手架内置服务器的地址:http://localhost:8080

可以额外再开启一个其它的服务器,这个服务器随意,例如:node server、Apache服务器、JBOSS服务器、WebLogic服务器、WebSphere服务器、jetty服务器、tomcat服务器......我这里选择的是基于Java语言的一个服务器Tomcat,这个web服务器开启了一个8000端口,提供了以下的一个服务,可以帮助我们获取到一个Bug列表:

http://localhost:8000/bugs/

打开BugList案例的代码,在mounted钩子函数中发送ajax请求,获取bug列表。

vue-cli安装axios库:npm i axios。使用时:import导入axios

以上的访问表示:在8080服务器中发送AJAX请求访问8000服务器,必然会出现AJAX跨域问题:

4.4 启用Vue脚手架内置服务器8080的代理功能

1.简单开启

vue.config.js文件中添加如下配置:

  devServer: {

    proxy: 'http://localhost:8000' // 含义:Vue脚手架内置的8080服务器负责代理访问8000服务器

  }

发送AJAX请求时,地址需要修改为如下:

原理:访问地址是http://localhost:8080/bugs,会优先去8080服务器上找/bugs资源,如果没有找到才会走代理。

另外需要注意的是:这种简单配置不支持配置多个代理。

2.高级开启

支持配置多个代理。  

devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:8000',
        pathRewrite:{'^/api', ''},
        ws: true, // 支持websocket
        changeOrigin: true // true表示改变起源(让目标服务器不知道真正的起源)
      },
'/abc': {
        target: 'http://localhost:9000',
        pathRewrite:{'^/abc', ''},
        ws: true, // 默认值true
        changeOrigin: true // 默认值true
      }
    }
  }

4.5 使用AJAX改造BugList案例

mounted钩子中发送ajax请求即可。

4.6 Vue插件库vue-resource发送AJAX请求

  1. 安装:npm i vue-resource
  2. import vueResource from ‘vue-resource’
  3. 使用插件:Vue.use(vueResource)
  4. 使用该插件之后,项目中所有的vm和vc实例上都添加了:$http属性。
  5. 使用办法:
  • this.$http.get(‘’).then() 用法和axios相同,只不过把axios替换成this.$http

4.7天气预报

1、实现效果

 2、接口来自:Сurrent weather and forecast - OpenWeatherMap

3、开发者进行注册,获取api key

4、获取当前天气的接口

5、根据城市名字获取经度和纬度的接口

 

6、功能实现要点:

(1)首先实现静态组件

  • App根组件下有两个子组件:Search、Weather

(2)根据城市名获取经度纬度的接口:

  • `http://api.openweathermap.org/geo/1.0/direct?q=${this.cityName}&appid=${apiKey}`
  • 以上红色字体采用了ES6的模板字符串。
  • 经度:const lon = response.data[0].lon
  • 纬度:const lat = response.data[0].lat

(3)获取天气信息的接口:

  • `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${apiKey}`
  • 天气图标:response.data.weather[0].icon
  • 温度:response.data.main.temp
  • 湿度:response.data.main.humidity
  • 风力:response.data.wind.speed

(4)以上免费接口已经在服务端解决了跨域的问题,可以直接用。

(5)兄弟组件之间通信采用全局事件总线。

(6)以上接口返回的图标的id,根据图标id动态拼接图片地址

(7)初次打开页面的时候,不应该显示天气的任何信息,Weather组件应该是隐藏的。

(8)查询天气过程中,显示“正在拉取天气信息,请稍后...”

(9)如果访问的城市不存在时,应该提示“对不起,请检查城市名”

(9)如果出现其它错误一律显示“网络错误,请稍后再试”

(11)在Search组件中触发事件的时候,将多个属性封装为对象的形式(语义化更明确)传给Weather组件。

  • 在Weather组件中可以采用对象的形式一次性接收。
  • 注意结构中的代码:<p class="wind">{{weather.windSpeed}} m/s</p>

(12)ES6语法,合并对象

  • this.weather = {...this.weather, ...weather}

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

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

相关文章

30天学会《Streamlit》(7)

30学会《Streamlit》是一项编码挑战&#xff0c;旨在帮助您开始构建Streamlit应用程序。特别是&#xff0c;您将能够&#xff1a; 为构建Streamlit应用程序设置编码环境 构建您的第一个Streamlit应用程序 了解用于Streamlit应用程序的所有很棒的输入/输出小部件 第7天 - st…

聚焦商会 | 活动彰显一个商会的战斗力与影响力

4月13日&#xff0c;北京厦航嘉年华酒店。 一个普通的日子&#xff0c;对北京茶业企业商会来说却是值得纪念的一天&#xff0c;可以浓笔重墨书写的一天。 一天成功举办了三场活动&#xff0c;得到社会各界的支持与肯定。 北京茶业企业商会是如何做到的&#xff1f;经过与商会领…

python批量下载怀俄明大学探空数据Wyoming soundings并处理

下载怀俄明大学的探空数据&#xff0c;之前用的是气象家园写的maltab脚本&#xff0c;但总是链接不上&#xff0c;而且有的站点需要用新网址&#xff0c;有的有需要用老网址&#xff0c;很麻烦&#xff0c;痛定思痛用决定终于用python了&#xff0c;主要有两种方式&#xff0c;…

nightingale-0-介绍单机二进制部署

(一) 夜莺介绍 Nightingale | 夜莺监控&#xff0c;一款先进的开源云原生监控分析系统&#xff0c;采用 All-In-One 的设计&#xff0c;集数据采集、可视化、监控告警、数据分析于一体&#xff0c;与云原生生态紧密集成&#xff0c;提供开箱即用的企业级监控分析和告警能力。于…

渗滤液除氨氮、矿井水除氨氮,氨氮吸附技术

垃圾渗滤液是生活垃圾的必然产物&#xff0c;顾名思义&#xff0c;垃圾渗滤液是指来源于垃圾填埋场中垃圾本身含有的水分、进入填埋场的雨雪水及其他水分&#xff0c;扣除垃圾、覆土层的饱和持水量&#xff0c;并经历垃圾层和覆土层而形成的一种高浓度的有机废水。垃圾在堆放和…

[golang gin框架] 24.Gin 商城项目-redis讲解以及操作

一.reids相关文章 Redis五种数据类型及其应用场景 REDIS中的缓存穿透&#xff0c;缓存击穿&#xff0c;缓存雪崩原因以及解决方案 redis实现用户签到&#xff0c;统计活跃用户&#xff0c;用户在线状态&#xff0c;用户留存率 [golang gin框架] 12.Gin 商城项目-base64Captcha生…

KDXJ-8 SF6气体泄漏报警在线检测系统

一、功能特点 1. 定量测量SF6&#xff08;六氟化硫&#xff09;气体浓度&#xff1b; 2. 定量测量O2&#xff08;氧气&#xff09;气体浓度&#xff1b; 3. 定量测量大气温湿度&#xff1b; 4. 可根据需要设置SF6和O2气体浓度的报警点&#xff1b; 5. 后台监控&#xff1b; 6.…

【通过加载plist文件显示分组数据 Objective-C语言】

一、展示汽车品牌数据 1.首先,我们还是先把控制器调成3.5英寸,再把模拟器调成iPhone4S, 2.然后呢,我们要先把素材拷进来, 我们要展示,要把一个plist文件中的数据展示到我们的这个UITableView里面,所以说,首先,是要把我们的plist文件拷进来, 找到我们这个plist文件…

爱智EdgerOS之深入解析在爱智应用中如何使用Socket.IO轻松实现双向通信

一、什么是 Socket.IO&#xff1f; Socket.IO 是一个基于事件通信的实时应用程序框架&#xff0c;它在即时通讯、通知和消息推送&#xff0c;实时分析等场景中有广泛的应用。Socket.IO 包括两个部分&#xff1a; 在 Server 端的模块&#xff08;JSRE 已提供了 socket.io 模块&…

Onnx 转Ncnn

Onnx 转Ncnn 算法工程师给了onnx,需要转成ncnn才能用到安卓上去&#xff0c;步骤如下 简化onnx 算法给了.onnx后缀的文件&#xff0c;100多兆&#xff0c;太大&#xff0c;第一步&#xff0c;先简化&#xff1a; conda env list 查看conda环境&#xff08;前提是之前已经配…

企业级实践:分布式系统中的可靠消息最终一致性方案

背景 公司由于业务爆发式增长&#xff0c;新上了许多业务系统&#xff0c;例如&#xff1a;本地生活、社区团购、旅投B2B、旅投B2C等系统&#xff1b;同时&#xff0c;由于业务系统越来越多&#xff0c;为了运营方便&#xff0c;把分销、营销、订单、会员等多个业务系统公共业…

Babel零基础教程

参考https://www.jiangruitao.com/babel/ 写的非常好&#xff0c;本人只是为了方便查找&#xff0c;记录在自己博客上&#xff0c;原文可以去该链接拜读 1、 Babel 简介 Babel是什么&#xff1f; Babel是一个工具集&#xff0c;主要用于将ES6版本的JavaScript代码转为ES5等向…

遗传算法的概念和python实现

遗传算法是一个非常经典的智能算法&#xff0c;主要用于解决优化问题。本文主要简单介绍一些原理&#xff0c;同时给出一个基于python实现的&#xff0c;用于解决实数内优化问题的模板。 本文参考&#xff1a; 原理&#xff1a;遗传算法入门详解 - 知乎 简单介绍 遗传算法就…

服务型企业如何使用飞项实现项目化管理?

服务型企业的业务模式一般都是按项目来运作的&#xff0c;其业务分为售前&#xff0c;售中和售后三个阶段&#xff0c;分别由不同部门和人员对客户进行个性化服务。在这个过程中需要对人、流程和知识的高效统筹管理&#xff0c;即项目的整体管理&#xff0c;因此存在着不小的挑…

Nvidia Jetson Orin: SPE/AON Cortex-R5 固件开发

Nvidia Jetson Orin: SPE/AON Cortex-R5 固件开发 写在最前边开发/下载 SPE 固件关于修改DTS 写在最前边 SPE 只能控制 AON GPIO 最多32个PIN 开发/下载 SPE 固件 S1&#xff1a;打开 https://developer.nvidia.com/embedded/jetson-linux S2&#xff1a;这里下载 S3&#x…

Linux环境使用日志切割工具-cronolog

Linux环境使用日志切割工具 需明白的点&#xff1a;1.安装 2.如何使用 一、安装cronolog 1.首先检查是否存在cronolog 命令&#xff1a;whereis cronolog 或 which cronolog 2.不存在则安装 安装方式&#xff1a; a.yum 安装&#xff1a;yum install cronolog b. 源码安装&am…

C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-数组-学习笔记(10)

参考&#xff1a;麦子学院-嵌入式C语言高级-内存空间 2-3 : C语言内存空间的使用-数组 内存分配的一种形式 数组的定义及初始化 定义一个空间: 1、大小 2、读取方式 数组名[]:升级为连续空间的名称&#xff0c; [m]的作用域只在申请的时候起作用 每个多大&#xff1f;数组…

太给力了,这款java表单设计器可提高办公协作效率!

随着办公自动化的快速发展&#xff0c;java表单设计器的应用价值和突出优势也逐渐成为企业提高办公效率的好帮手。传统的表单操作起来费时费力&#xff0c;效率不高&#xff0c;逐渐满足不了日益繁多的业务需求了&#xff0c;在广大用户的呼声和市场发展下&#xff0c;简洁、灵…

ESP32学习五-启动流程

一、简介 在ESP32的开发中&#xff0c;通常我们会从app_main函数中开始我们的代码开发。但是为什么是app_main呢&#xff1f;app_main又是从哪里被调用的&#xff1f;app_main之前又做了什么操作呢&#xff1f;今天我们就来详细分析一下。 官方参考文档&#xff1a;应用程序的启…

柔性作业车间生产调度中MK算例文本各行数字表示的含义以及算例的数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 MK算例其他MK02~MK10柔性作业车间数据 MK算例 Brandimarte给出了10组柔性作业车间的实例分别是MK01~Mk10&#xff0c;下方即为MK01的实例数据 10 6 26 2 1…