盘点前端的那些Ajax请求:从ES5到React
说起前端开发,Ajax请求是绕不开的技术点。然而,程序语言更新换代越来越快,Ajax请求的方式也是各有不同。
在使用ES5开发的时候,我们还在使用最原始的XMLHttpRequest对象:
// createXHR函数,返回浏览器支持的异步请求对象
function createXHR() {
if(typeof XMLHttpRequest != "undefined"){
return new XMLHttpRequest(); // IE7+、Firefox、Opera、Chrome、Safari
}
else if(typeof ActiveXObject != "undefined"){
return new ActiveXObject("Microsoft.XMLHTTP"); // IE7及以前版本的浏览器
}
else{
throw new Error("No XHR object available.");
}
}
var xhr = createXHR(); //创建XHR对象
xhr.onreadystatechange = function(){ //readyState状态改变及触发onreadystatechange事件
if(xhr.readyState == 4){ //readyState状态改变可从0到4,4表示所有数据已就绪
if((xhr.status >= 200 && xhr.status <300) || xhr.status == 304){ //status为200,响应成功;status为304,表示请求的资源未被修改
alert(xhr.responseText); //responseText表示响应主体返回的文本
} else {
alert("Request was unsuccessful: " + xhr.status);
}
}
};
xhr.open("get", "test.php?uid=1&name=xiaoming", true); //启动一个请求以备发送
xhr.send(null);
上面是get请求方式。
发送相同量数据时,get比post快得多,所以如无必要,应尽量使用get请求方式。
post可以发送更多的数据,且不限格式。
post请求需要添加额外的请求头,并把发送数据放在send方法中,如:
xhr.open("post", "test.php", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // post请求需要设置Content-Type
var form = document.getElementById("user");
xhr.send(serialize(form)); // 假如form是一个表单节点,serialize()序列化了表单数据
/*
假如需要发送的数据是一个对象,如data,也可以使用JSON.stringify(data)把数据字符串化,在使用send()方法发送
*/
后来出现了JQuery ,极大的简化了Ajax请求的代码编写,几乎只需要一行代码。
$.ajax({
url: "demo_test.php",
type: "POST",
data: {name: 'xiaoming'},
success: function(result, status, xhr){
alert(result);
},
error: function(result, status, xhr){
alert('错误:'+status);
}
});
单独使用post请求,也可以写成:
$.post("test.php", {uid:'001'}, function(data,status,xhr){
alert(data);
});
单独使用get请求,也可以写成:
$.get("test.php",{name: 'xiaom'}, function(data,status,xhr){
alert("数据: " + data + "\n状态: " + status);
});
到ES6出现的时候,有了新的对象 Promise ,它带有的then和catch方法可以获取异步执行代码的数据,我们就可以把ajax请求获取的数据取出,做我们想要的操作。
根据需要,我们可以把ajax请求放在一个Promise对象中:
function ajax(URL) {
return new Promise(function (resolve, reject) {
// createXHR函数,返回浏览器支持的异步请求对象
function createXHR() {
if(typeof XMLHttpRequest != "undefined"){
return new XMLHttpRequest(); // IE7+、Firefox、Opera、Chrome、Safari
}
else if(typeof ActiveXObject != "undefined"){
return new ActiveXObject("Microsoft.XMLHTTP"); // IE7及以前版本的浏览器
}
else{
throw new Error("No XHR object available.");
}
}
var xhr = createXHR(); //创建XHR对象
xhr.onreadystatechange = function(){ //readyState状态改变及触发onreadystatechange事件
if(xhr.readyState == 4){ //readyState状态改变可从0到4,4表示所有数据已就绪
if((xhr.status >= 200 && xhr.status <300) || xhr.status == 304){ //status为200,响应成功;
//status为304,表示请求的资源未被修改
resolve(xhr.responseText); //responseText表示响应主体返回的文本
} else {
reject("Request was unsuccessful: " + xhr.status);
}
}
};
xhr.open("get", "test.php?uid=1&name=xiaoming", true); //启动一个请求以备发送
xhr.send(null);
});
}
获得的数据可以使用then和catch方法处理:
ajax('test.php').then((value) => {
alert(value); // 请求成功
}).catch((error) => {
alert(error); // 请求失败
});
也可以使用async和await获取:
async function getData(){
try {
const responceText = await ajax();
alert(responceText);
} catch (error) {
alert(error); //输出异常错误
}
}
getData();
而对于React来说,它是组件化编程方式,如果你想在组件初次渲染时就展示ajax请求获取的数据,我们一般把ajax请求放在生命周期钩子componentDidMount中:
class User extends React.Component {
// ......
componentDidMount() {
// 以JQuery的ajax请求举例
this.serverRequest = $.get('test.php', {uid: '001'},function (result) {
// 用获取的数据更新组件的state数据
this.setState({
username: result.username,
lastTime: result.lastTime
});
}.bind(this));
}
// 组件卸载,销毁未结束的请求
componentWillUnmount() {
this.serverRequest.abort();
}
// ......
}
如果需要用户的操作(如:点击按钮)以获取数据,请将ajax请求放在onClick事件句柄函数中。
新版的React推荐使用函数式组件,那就没有生命周期函数了,一般把第一次渲染后需要的ajax请求放在React Hook Effect中:
import { useEffect, useState } from 'react';
const [username, setUsername] = useState('');
const [lastTime, setLastTime] = useState('');
// 在开发环境,组件渲染之后,Effect会执行两次,第一次是调试
// 为了不更新两次数据,需要设置清理函数
// 在生产环境,Effect只会执行一次
let ignore = false;
useEffect(() => {
// 以JQuery的ajax请求举例
// 如果是初次请求,ajax请求数据,更新state
if(!ignore){
$.get('test.php', { uid: '001' },function (result) {
setUsername( result.username );
setLastTime( result.lastTime );
});
}
// 清理函数,第一次请求之后,把ignore设为true,第二次请求时不会再获取数据
return () => {
ignore = true;
};
}, []);
盘点前端的那些Ajax请求:从ES5到React的更多相关文章
- phpStudy4——前端页面使用Ajax请求并解析php返回的json数据
项目需求: 在html页面显示所有用户列表信息. 需求分析: 1. html页面使用ajax向后端php请求用户数据 2. php脚本查询数据库,并将查询后的结果以json格式返回前端html页面 3 ...
- 前端javascript发送ajax请求、后台书写function小案例
HTML端页面: <td> <input class="pp_text" type="text" name="" valu ...
- [Web 前端] 如何在React中做Ajax 请求?
cp from : https://segmentfault.com/a/1190000007564792 如何在React中做Ajax 请求? 首先:React本身没有独有的获取数据的方式.实际上, ...
- spring security:ajax请求的session超时处理
当前端在用ajax请求时,如果没有设置session超时时间并且做跳转到登录界面的处理,那么只是靠后台是很难完成超时的一系列动作的:但是如果后台 没有封装一个ajax请求公共类,那么在ajax请求上下 ...
- react中使用Ajax请求(axios,Fetch)
React本身只关注于界面, 并不包含发送ajax请求的代码,前端应用需要通过ajax请求与后台进行交互(json数据),可以使用集成第三方ajax库(或自己封装) 常用的ajax请求库 jQuery ...
- ajax请求下载Execl表
Execl表是经常要用到的存放二位数据的表格,Java也可以直接操作Execl表,经常用到的方式就是jxl和poi. 在这次项目中,我用到的poi往Execl中写数据,刚开始设计的是前端发送一个aja ...
- springmvc 前端 发ajax请求的几种方式
一.传json单值或对象 1.前端 var data = {'id':id,'name':name}; $.ajax({ type:"POST", url:"user/s ...
- BBS(第一天)项目之 注册功能实现通过forms验证与 前端ajax请求触发查询数据库判断用户是否存在的功能实现
1.BBS项目之注册功能通过forms验证 from django import forms from blog.models import User from django.contrib.auth ...
- 前端通信:ajax设计方案(七)--- 增加请求错误监控、前端负载均衡以、请求宕机切换以及迭代问题修复
距离上个迭代过了很长时间,中间经历了很多事情,也在每个空余时间构思了这个迭代的东西以及下个迭代要做的东西.时间周期稍微长了,望见谅. 而且,至今这个开源库的start也已经到了165个了,会支持关注和 ...
- 前端通信:ajax设计方案(六)--- 全局配置、请求格式拓展和优化、请求二进制类型、浏览器错误搜集以及npm打包发布
距离上一次博客大概好多好多时间了,感觉再不搞点东西出来,感觉就废了的感觉.这段时间回老家学习驾照,修养,然后7月底来上海求职(面了4家,拿了3家office),然后入职同程旅游,项目赶进度等等一系列的 ...
随机推荐
- Hadoop单击模式运行wordcount例子
1.进入Hadoop安装目录 cd /zwy/soft/hadoop-2.7.1 2.创建文件夹input mkdir input 3.写一段文字到文件file.txt echo "hell ...
- App性能指标(安装、冷启动、卸载、平均内存/cpu/fps/net)测试记录
[需求背景] 需要针对产品以及竞品做出横向对比,输出对应的比对测试报告,供产研进行产品性能优化依据 [测试方案] 对于主流的厂商和系统版本进行多维度的横向对比 厂商:华为系.小米系.蓝绿系.三星系.苹 ...
- ssh-keygen无回车生成公钥私钥对
ssh-keygen无回车生成公钥私钥对 ssh-keygen -t rsa -N '' -f /root/.ssh/id_rsa -q -t: -N:是指密码为空: -f:id_rsa是指保存文件为 ...
- k8s 自动扩缩容HPA原理及adapter配置详解👑
大家好,我是蓝胖子,都知道,k8s拥有自动扩缩容机制HPA,我们能够通过配置针对不同的扩缩容场景进行自动扩缩容,往往初学者在面对其中繁多配置的时候会学了又忘记,今天我将会以一种不同的视角,结合api ...
- 【遥遥领先】Eolink IDEA 插件:零代码入侵,自动生成接口
省流版: Eolink 有 IDEA 插件吗? 有,而且遥遥领先!我们在一年半之前就发布了,而且功能更丰富! IDEA 插件市场搜索"Eolink Apikit"即可安装使用. 使 ...
- 低功耗引擎 Cliptrix 有什么价值
在万物互联的时代,现代人已普遍接受电视.音箱等电器设备具备智能化能力,也是在这个趋势下,我们身边越来越多的iOT设备联网和交互成为刚需.但iot设备也面临到一些非常显著的痛点,例如iot设备的内存.处 ...
- oracle优化-分页查询的错误认识
对于分页查询,上一篇文章总结了实现分页查询的办法.同时给出等价写法,另外在执行计划角度验证SQL的等价性https://www.cnblogs.com/handhead/p/13856505.html ...
- 2023-10-07:用go语言,给定n个二维坐标,表示在二维平面的n个点, 坐标为double类型,精度最多小数点后两位, 希望在二维平面上画一个圆,圈住其中的k个点,其他的n-k个点都要在圆外。
2023-10-07:用go语言,给定n个二维坐标,表示在二维平面的n个点, 坐标为double类型,精度最多小数点后两位, 希望在二维平面上画一个圆,圈住其中的k个点,其他的n-k个点都要在圆外. ...
- Python面试——基础面试题
文章目录 1.Python 和 Java.PHP.C.C#.C++等其他语言的对比? C语言既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C ...
- RK3588平台产测之ArmSoM产品高温环境测试
1. 简介专栏总目录 ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试,以此来保证产品的质量以及稳定性 优秀的产品都要进行严苛的多次全方位的功能测试以及性能压力测试才能够 ...