withFetch >=1.1.6
withFetch
是组件的装饰器(HoC,高阶组件),可以给业务组件的实例注入 fetch
方法使组件能够发送请求,并且可以 abort
请求,用法与 redux 的 connect
相同,如:
const App = () => <div>hello</div>
// 普通装饰方式
export default withFetch(App)
// 类装饰方式
@withFetch
class App extends Component {}
直接使用组件实例 this
调用 fetch
方法,会返回一个 Promise
对象(暂命名 request
),并且 request
带有 abort
方法,可以直接调用, abort
掉当前请求。abort
掉后, 如果request
有被catch
,则catch
里的回调函数会被执行。
注意:组件销毁时,该组件已发出且未完成的请求会自动 abort
掉(spa, hy 下回退页面才存在组件销毁,因为新开页面是覆盖在旧页面之上的)
基本示例:
@withFetch
class Index extends Component {
...
addRequest() {
const request = this.fetch('/testfetch', { timeout: 2000, ... })
// 获取 text 数据
request.then(res => res.text()).then(text => console.log(text))
// 获取 json 数据
request.then(res => res.json()).then(
json => console.log('parsed json', json)
).catch(
ex => console.log('parsing failed', ex)
)
// request.abort() 可以abort掉请求
}
}
Response metadata:
fetch.('users.json').then(res => {
console.log(res.headers['Content-Type'])
console.log(res.headers['Date'])
console.log(res.status)
console.log(res.statusText)
})
Post:
fetch('users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: {
name: 'ZWJ',
login: 'zwj'
}
})
GET(注意:GET 请求参数可以设为 body
,但不要同时在 url
上带查询参数,还设置了 body
,因为在解析 body
时,会自动在 url
后面加上 ?
,会导致请求参数错误):
fetch('users', {
body: {
name: 'ZWJ',
login: 'zwj'
}
})
// HTTP 请求 url 最终会解析成:'users?name=ZWJ&login=zwj'
fetch
不同于 jQuery.ajax()
,当 HTTP 请求返回错误状态,例:HTTP 404
、HTTP 500
…,请求是被认为请求成功的,会执行 Promise
的 success
回调。那么如何处理 HTTP 请求返回错误状态:
const checkStatus(response) {
if (response.status >= 200 && response.status < 300) {
return response
} else {
var error = new Error(response.statusText)
error.response = response
throw error
}
}
方法
fetch
方法参数:
参数名 | 类型 | 描述 | 必选 | 支持版本 |
---|---|---|---|---|
url | String | 请求接口地址 | ||
option | Object | 可配置对象 | ||
option.method | String | 请求方法,默认值:GET | ||
option.headers | Object | 请求头 | ||
option.body | Object | 请求体 | ||
option.timeout | Number | 设置请求超时 | ||
option.withCredentials | Boolean | 设置跨域请求能否带 cookies 等,默认值:true |
withFetch
方法参数:
参数名 | 类型 | 描述 | 必选 | 支持版本 |
---|---|---|---|---|
Component | Component | 被装饰的组件 |