本身是针对MVC的编程,不符合现在前端MVVM的浪潮
Ajax 是一种思想,XMLHttpRequest 只是实现 Ajax 的一种方式。其中 XMLHttpRequest 模块就是实现 Ajax 的一种很好的方式。
特点:局部刷新页面,无需重载整个页面。
const SERVER_URL = "/server";
let xhr = new XMLHttpRequest();
// 创建 Http 请求
xhr.open("GET", SERVER_URL, true);
// 设置状态监听函数
xhr.onreadystatechange = function() {
if (xhr.readyState !== 4) return;
// 当请求成功时
if (xhr.status === 200 || xhr.status === 304) {
console.log(xhr.responseText);
} else {
console.error(xhr.statusText);
}
};
// 发送 Http 请求
xhr.send();
fetch是原生js,没有使用XMLHttpRequest对象
- fetch只对网络请求报错,对400、500都当成成功的请求,需要封装去处理
- fetch默认不会带cookie,需要添加配置项
- fetch不支持 abort(中止) 、不支持超时控制,使用setTimeout及Promise.reject实现的超时控制并不能阻止请求过程继续在后台运行,造成了量的浪费
- fetch不能原生检测请求的进度,而XHR可以
function ajaxFetch(url) {
fetch(url).then(res => res.json()).then(data => {
console.info(data)
})
}
// 你想请求的地址
ajaxFetch('http://000.000.000.000:9527/api')
axios利用xhr进行了二次封装的请求库,xhr只是axios中的其中一个请求适配器,axios在nodejs端还有个http的请求适配器;axios = xhr + http;
axios应该是一个顶层的封装库,底层可以选择xhr或者fetch进行请求
特点:
三者对比:
// axios
axios.get('http://localhost:3000')
.then(response => {
console.log(response.data);
}, error => {
console.log(error);
});
// 模块化
import axios from 'axios'
let serve = new axios.create({
baseURL:"http://192.168.210.168:9527/api",
timeout:3000
})
serve.interceptors.request.use(config=>{
console.log('请求拦截器.....');
return config
})
serve.interceptors.response.use(result=>{
console.log('响应拦截器.....');
let data = result.data;
return data;
})
export default serve
比如用户离开屏幕或者组件时会需要取消请求
then(res=>res.json())