首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Next.js:在静态导出过程中向页面传递额外的道具?

Next.js:在静态导出过程中向页面传递额外的道具?
EN

Stack Overflow用户
提问于 2019-07-02 23:29:51
回答 1查看 9.7K关注 0票数 3

我正在尝试静态导出next.js应用程序。docs表示页面对象只有两个值:pagequery。有没有办法把额外的道具传给页面?

为此,我尝试使用query,但next的路由器似乎不知道路由的query对象。因此,它不起作用。

换句话说,我在构建时有一个博客帖子列表,我如何将它们内联到页面(页面组件)?

我猜react-static有一个为每个路由预取的routeInfo.json。我想知道在next.js中是否有类似的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-04 17:30:01

更新4月4日20至少在next.js 9.3中有getStaticPropsgetStaticPaths

(complete example)

代码语言:javascript
复制
const IndexPage: NextPage<{ names: string[] }> = (props) => {
  return (
    <main>
      <section>
        {props.names.map((name) => (
          <div key={name}>
            <Link href={`/users/${name}`}>
              <a>{name}</a>
            </Link>
          </div>
        ))}
      </section>
    </main>
  );
};

export const getStaticProps: GetStaticProps = async () => {
  const data: User[] = readJsonSync("./data.json");

  return {
    props: {
      names: data.map((user) => user.name),
    },
  };
};

export default IndexPage;

更新12月4 19

有一个用于getStaticProps的RFC可以解决这个问题:https://github.com/zeit/next.js/issues/9524

这就是我最终得到的结果。

_app.js:

代码语言:javascript
复制
import React from "react";
import App, { Container } from "next/app";

import fs from "fs";
import { resolve, join } from "path";

export default class extends App {
  static async getInitialProps({ Component, ctx }) {
    const { req, asPath } = ctx;
    let pageProps = {};

    if (Component.getInitialProps) {
      pageProps = await Component.getInitialProps(ctx);
    }

    let p;
    if (req) {
      p = JSON.parse(
        fs.readFileSync(resolve(join("data", asPath, "route.json"))).toString()
      );
    } else {
      p = await (await fetch(`/data${asPath}/route.json`)).json();
    }

    return { pageProps: { ...pageProps, ...p } };
  }

  render() {
    const { Component, pageProps } = this.props;
    return (
      <Container>
        <Component {...pageProps} />
      </Container>
    );
  }
}

在next.config.js中:

代码语言:javascript
复制
const fetch = require("isomorphic-unfetch");
const fs = require("fs");
const path = require("path");
const fse = require("fs-extra");
const withBundleAnalyzer = require("@next/bundle-analyzer")({
  enabled: false
});

module.exports = withBundleAnalyzer({
  webpack(config) {
    config.node = { fs: "empty", path: "empty" };
    return config;
  },
  async exportPathMap() {
    const response = await fetch(
      "https://jsonplaceholder.typicode.com/posts?_page=1"
    );
    const postList = await response.json();
    fs.writeFileSync(
      path.resolve(`data/route.json`),
      JSON.stringify({ postList }, null, 2)
    );
    for (let i = 0; i < postList.length; ++i) {
      const id = postList[i].id;
      const response = await fetch(
        `https://jsonplaceholder.typicode.com/posts/${id}`
      );
      const post = await response.json();
      const fn = path.resolve(`data/post/${id}/route.json`);

      await fse.outputFile(fn, JSON.stringify(post, null, 2));
    }

    const pages = postList.reduce(
      (pages, post) =>
        Object.assign({}, pages, {
          [`/post/${post.id}`]: {
            page: "/post"
          }
        }),
      {}
    );

    return Object.assign({}, pages, {
      "/": { page: "/" }
    });
  }
});
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56855769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档