美文网首页
路由的生命周期和Fetch请求的时机

路由的生命周期和Fetch请求的时机

作者: 追风的云月 | 来源:发表于2018-04-10 16:53 被阅读0次

路由组件的生命周期和 React 组件相比并没有什么不同。 所以让我们先忽略路由部分,只考虑在不同 URL 下,这些组件是如何被渲染的。

路由配置如下:

<Route path="/" component={App}>
  <IndexRoute component={Home}/>
  <Route path="invoices/:invoiceId" component={Invoice}/>
  <Route path="accounts/:accountId" component={Account}/>
</Route>

路由切换时,组件生命周期的变化情况

1. 当用户打开应用的 '/' 页面
image.png
2. 当用户从 '/' 跳转到 '/invoice/123'
image.png
  • App 从 router 中接收到新的 props(例如 children、params、location 等数据), 所以 App 触发了 componentWillReceiveProps 和 componentDidUpdate 两个生命周期方法
  • Home 不再被渲染,所以它将被移除
  • Invoice 首次被挂载
3. 当用户从 /invoice/123 跳转到 /invoice/789
image.png

所有的组件之前都已经被挂载, 所以只是从 router 更新了 props.

4. 当从 /invoice/789 跳转到 /accounts/123
image.png
获取数据

虽然还有其他通过 router 获取数据的方法, 但是最简单的方法是通过组件生命周期 Hook 来实现。 在 Invoice 组件里实现一个简单的数据获取功能。

一个单页系统在切换组件时进行fetch请求,我认为最重要的是搞清楚URL变化时,组件的生命周期发生了什么变化,然后在每个组件中通过不同的生命周期函数来进行数据请求。
let Invoice = React.createClass({

  getInitialState () {
    return {
      invoice: null
    }
  },

  componentDidMount () {
    // 上面的步骤2,在此初始化数据
    this.fetchInvoice()
  },

  componentDidUpdate (prevProps) {
    // 上面步骤3,通过参数更新数据
    let oldId = prevProps.params.invoiceId
    let newId = this.props.params.invoiceId
    if (newId !== oldId)
      this.fetchInvoice()
  },

  componentWillUnmount () {
    // 上面步骤四,在组件移除前忽略正在进行中的请求
    this.ignoreLastFetch = true
  },

  fetchInvoice () {
    let url = `/api/invoices/${this.props.params.invoiceId}`
    this.request = fetch(url, (err, data) => {
      if (!this.ignoreLastFetch)
        this.setState({ invoice: data.invoice })
    })
  },

  render () {
    return <InvoiceView invoice={this.state.invoice}/>
  }

})

相关文章

  • 路由的生命周期和Fetch请求的时机

    路由组件的生命周期和 React 组件相比并没有什么不同。 所以让我们先忽略路由部分,只考虑在不同 URL 下,这...

  • ThinkPHP 5.0 (五) 生命周期 - 3

    8、分发请求 在完成了URL检测和路由检测之后,路由器会分发请求到对应的路由地址,这也是应用请求的生命周期中最重要...

  • 关于嵌套路由,子路由生命周期先执行的问题

    嵌套路由生命周期中子级请求先执行,父级请求后执行 1.检查父级路由生命周期中是否用了同步请求,子级路由是否用的异步...

  • fetch记录一下子

    1.原生http请求 2.fetch请求 3.上面是封装多得fetch,直接使用的fetch fetch请求对某些...

  • ReactNative网络请求

    json字符串形式的fetch请求 form 形式的fetch请求

  • django的中间件的理解

    django的生命周期是:前端请求--->nginx--->uwsgi.--->中间件--->url路由---->...

  • 初学Fetch

    什么是 Fetch API? Fetch 提供了 Request 和 Response对象(以及与网络请求有关的其...

  • Vue-路由

    路由可以分为前端路由和后端路由 后端路由: 概念:根据不同的用户url请求,返回不同的内容 本质:URL请求地址和...

  • Axios&fetch

    axios 安装 请求 参数 fetch 安装 请求 参数

  • 小程序封装网络请求

    对小程序原生的请求代码进行封装 Promise封装fetch模块 utils/fetch.js 调用fetch模块

网友评论

      本文标题:路由的生命周期和Fetch请求的时机

      本文链接:https://www.haomeiwen.com/subject/yssnhftx.html