大家好,距离完赛越来越近了,过完最後一天的双十连假,心情也开始忧郁了QQ,还好本系列复杂的文章差不多都介绍完了,终於不用再熬夜了。
今天要来聊聊的是Javascript原生请求资料的方式fetch。记得以前还没有fetch时,得透过XMLHttpRequest或是jQuery的AJAX,自从有了fetch就再也回不去了,首先我们去MDN看看fetch的说明:
Fetch API 提供了一种 JavaScript Interface 来操作 HTTP pipeline,比方 request 和 response。同时它也提供了 global 的 fetch() method,使得在网路上非同步地 fetch resources 这件事变得简单易懂
另外小弟认为fetch具有以下特点:
目前各个浏览器也几乎都有支援,除了你知道的IE (下图截自caniuse.com)
直接来看看怎麽操作:
fetch('/src/json/product.json', {})
.then((res) => res.json())
.then((data) => {
console.log(data)
})
})
查阅MDN说明,fetch第一个参数放入请求来源的URI,第二个参数是选用的,可以传送一个 init Object 来设定 request。
由於fetch本身是Promise物件,需要搭配then进行下一步的处理。由於在第一个then会拿到Promise结果,需要对Body的资料类型进行resolved 後才能取得资料,以下是resolve的方法(详细可查看MDN):
这边我们直接演示一个范例吧,用前天建立的商品页Product.js来做出商品列表(请求的范例JSON放在这里):
src/pages/Product.js:
import { App } from './App'
export const Product = {
mount: () => {
fetch('/src/json/product.json', {})
.then((res) => res.json())
.then((data) => {
const productList = document.querySelector('#productList')
data.result.forEach((item) => {
productList.innerHTML += `
<div class="col-md-4 mb-3">
<div class="card">
<div class="overflow-hidden" style="height:150px"><img src="${item.image}" class="img-fluid" alt="${item.name}" style="width:100%"></div>
<div class="card-body">
<h5 class="font-weight-bold">${item.name}</h5>
<h6>$ ${item.price}</h6>
<h6>${item.desc}</h6>
<a href="#/product/detail/${item.id}" class="btn btn-block btn-primary">
<i class="fas fa-shopping-cart"></i> 购买
</a>
</div>
</div>
</div>
`
})
})
},
render: (props) => {
const content = `
<div class="container">
<h3>${props.category}</h3>
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="#">Home</a></li>
<li class="breadcrumb-item active">${props.category}</li>
</ol>
</nav>
<div id="productList" class="row"></div>
</div>
`
return App.render(content)
},
}
这里在mount方法中使用fetch的GET方法来请求资料,且不带入第二个参数。解析Promise物件资料,并将资料内容转为JSON格式做处理,商品图片已转为base64字串,加上其余资料使用forEach依序塞入HTML,结果会像下面这样:
以上就是使用fetch来请求资料,这里暂时告个段落,明天再来进一步谈谈fetch的POST请求,我们明天见!
参考资料:
铁人赛:ES6 原生 Fetch 远端资料方法
<<: [Day29]今天想来分享一些网路上的学习资源~以及学习历程
今日题目:169. Majority Element(easy) Given an array nu...
由於想要完整将自己从小至今的学习历程完整叙述,容我从小一开始接触程序的故事说起: 从记忆中对实作的印...
其实每个时期程序流行的架构以及写法会略有不同,每个时期前端後端负责的范畴也不尽相同,我们无法知道我们...
Vuex 状态管理 前面提到了Event Bus可以做到全域的事件监听管理,但当系统逐渐扩张,这些状...
前言 cookie(); function cookie(){ console.log('I lov...