withFetch >=1.1.6

withFetch 是组件的装饰器(HoC,高阶组件),可以给业务组件的实例注入 fetch 方法使组件能够发送请求,并且可以 abort 请求,用法与 redux 的 connect 相同,如:

  1. const App = () => <div>hello</div>
  2. // 普通装饰方式
  3. export default withFetch(App)
  4. // 类装饰方式
  5. @withFetch
  6. class App extends Component {}

直接使用组件实例 this 调用 fetch 方法,会返回一个 Promise 对象(暂命名 request),并且 request 带有 abort 方法,可以直接调用, abort 掉当前请求。abort 掉后, 如果request有被catch,则catch里的回调函数会被执行。

注意:组件销毁时,该组件已发出且未完成的请求会自动 abort 掉(spa, hy 下回退页面才存在组件销毁,因为新开页面是覆盖在旧页面之上的)

基本示例:

  1. @withFetch
  2. class Index extends Component {
  3. ...
  4. addRequest() {
  5. const request = this.fetch('/testfetch', { timeout: 2000, ... })
  6. // 获取 text 数据
  7. request.then(res => res.text()).then(text => console.log(text))
  8. // 获取 json 数据
  9. request.then(res => res.json()).then(
  10. json => console.log('parsed json', json)
  11. ).catch(
  12. ex => console.log('parsing failed', ex)
  13. )
  14. // request.abort() 可以abort掉请求
  15. }
  16. }

Response metadata:

  1. fetch.('users.json').then(res => {
  2. console.log(res.headers['Content-Type'])
  3. console.log(res.headers['Date'])
  4. console.log(res.status)
  5. console.log(res.statusText)
  6. })

Post:

  1. fetch('users', {
  2. method: 'POST',
  3. headers: {
  4. 'Content-Type': 'application/json'
  5. },
  6. body: {
  7. name: 'ZWJ',
  8. login: 'zwj'
  9. }
  10. })

GET(注意:GET 请求参数可以设为 body,但不要同时在 url 上带查询参数,还设置了 body,因为在解析 body 时,会自动在 url 后面加上 ?,会导致请求参数错误):

  1. fetch('users', {
  2. body: {
  3. name: 'ZWJ',
  4. login: 'zwj'
  5. }
  6. })
  7. // HTTP 请求 url 最终会解析成:'users?name=ZWJ&login=zwj'

fetch 不同于 jQuery.ajax(),当 HTTP 请求返回错误状态,例:HTTP 404HTTP 500…,请求是被认为请求成功的,会执行 Promisesuccess 回调。那么如何处理 HTTP 请求返回错误状态:

  1. const checkStatus(response) {
  2. if (response.status >= 200 && response.status < 300) {
  3. return response
  4. } else {
  5. var error = new Error(response.statusText)
  6. error.response = response
  7. throw error
  8. }
  9. }

方法

fetch

方法参数:

参数名类型描述必选支持版本
urlString请求接口地址
optionObject可配置对象
option.methodString请求方法,默认值:GET
option.headersObject请求头
option.bodyObject请求体
option.timeoutNumber设置请求超时
option.withCredentialsBoolean设置跨域请求能否带 cookies 等,默认值:true

withFetch

方法参数:

参数名类型描述必选支持版本
ComponentComponent被装饰的组件