【问题标题】:getInitialProps is never executedgetInitialProps 永远不会执行
【发布时间】:2020-02-01 01:43:21
【问题描述】:

我正在尝试制作一个 Twitter 组件,该组件从 twitter API 加载推文并显示其 HTML,这将是一个 <blockquote> 和一个 <script> 标记。

这样做的好处是,如果在服务器端渲染,即使用户有阻止调用 twitter 脚本的隐私设置,它也可以工作:用户仍然会得到 blockquote,这比当前的行为 (什么都不显示)。

所以,我的想法是做这样的事情:

import fetch from 'node-fetch'

function Tweet(props) {
  return <>
    <div dangerouslySetInnerHTML={{
      __html: props.__html
    }} />
    <p>here I am</p>
  </>
}

Tweet.getInitialProps = async ctx => {
  console.log("here I am on the road again")
  const res = await fetch(`https://api.twitter.com/1/statuses/oembed.json?id=${ctx.tweetId}`)
  const json = await res.json()
  return { __html: json.html }
}

export default Tweet

然后在页面上像&lt;Tweet tweetId="blah" /&gt;一样使用它。

我发现我的想法有两个问题:

  1. 根据文档,我无法访问 getInitialProps 上的 tweetId 属性
  2. getInitialProps 永远不会被调用。 &lt;p&gt;here I am&lt;/p&gt; 出现在 HTML 中,并且日志永远不会打印在任何地方。

所以,我的问题是:我做错了什么?这甚至可以做到吗?

谢谢!

【问题讨论】:

    标签: reactjs next.js


    【解决方案1】:

    根据 Next.js documentationgetInitialProps 只能用于页面,不能用于组件:

    getInitialProps只能添加到页面导出的默认组件中,添加到其他任何组件都不起作用。

    【讨论】:

    • 还有什么我可以做的想法吗?
    • Tweet 不是导出到那里的默认组件吗?
    • 我建议您将数据获取移动到所需的页面上,并在您的页面渲染中使用 API 返回的数据为您的组件提供数据
    • @JuanMarco 在上面的段落中引用default export 的原因是因为一个页面(例如mypage.js)可以有多个导出,它们只是强调只有@该文件 (mypage.js) 的 987654326@ 将能够使用 getInitialiProps
    • 我在页面组件上做了它并且它有效,必须做一些变通方法但它确实有效,谢谢!
    猜你喜欢
    • 2019-12-07
    • 1970-01-01
    • 2020-01-23
    • 2021-08-19
    • 2012-05-30
    • 2016-06-30
    • 1970-01-01
    • 2019-12-15
    相关资源
    最近更新 更多