Dace

Dace

  • 文档
  • API
  • 帮助
  • 博客

›API

API

  • <Link>
  • <Head>
  • getInitialProps 方法
  • document.js

getInitialProps 方法

当加载页面获取数据的时候,Dace 通过页面组件的 getInitialProps 静态方法来获取数据。此静态方法能够获取所有的数据,并将其解析成一个 JavaScript 对象,然后将其作为属性附加到 props 对象上。

当初始化页面的时候,getInitialProps 只会在服务器端执行,而当通过 Link 组件来将页面导航到另外一个路由的时候,此方法就只会在客户端执行。

注意:getInitialProps 不能 在子组件上使用,只能应用于当前页面的顶层组件。

如果你在 getInitialProps 中引入了一些只能在服务器端使用的模块(例如一些 node.js 的核心模块),请确保通过正确的方式来导入它们,否则的话,那很可能会拖慢应用的速度,或者是在浏览器端执行时找不到这些模块而报错。

参数

getInitialProps 接收的上下文对象包含以下属性:

  • match:react-router 对 URL 配置的结果对象,详情请查阅 react-router 官方文档。
  • query:URL的 query string 部分,并且其已经被解析成了一个对象,可以获取到 URL 问号后的数据。解析规则请查阅 qs 官方文档
  • req:http request 对象,仅服务器端渲染时可用,浏览器端渲染时,值为 null。
  • res:http response 对象,仅服务器端渲染时可用,浏览器端渲染时,值为 null。

注意:使用 req 和 res 参数时一定要做环境判断,保证只在服务器端渲染时执行相关代码,如

static async getInitialProps(ctx) {
  let cookies;
  const { req } = ctx;
  if (req) {
    { cookies } = req;
  } else {
    cookies = document.cookie;
  }

  //...
}

上面的代码根据环境不同使用不同的方法获取 cookie 值:

  • 服务器端渲染时,从 req 对象获取 cookie。
  • 浏览器端渲染时,从 document 对象中获取 cookie。

在无状态组件中使用

也可以为无状态(stateless)组件自定义 getInitialProps 生命周期方法:

import React from 'react';
import axios from 'axios';

const Page = ({ stars }) => (
  <div>
    stars: {stars}
  </div>
);

Page.getInitialProps = () => {
  const res = await axios.get('https://api.github.com/repos/dacejs/dace');
  return { stars: res.data.stargazers_count };
};

export default Page;
Last updated on 2018-12-14
← <Head>document.js →
  • 参数
  • 在无状态组件中使用
Dace
文档
教程常见问题API
社区
Stack Overflow反馈
更多
博客GitHubStar
Dace
Copyright © 2018 dace