无法在 Next 中传递 props

2024-01-02

我正在使用 Next Js (React SSR) 制作服务器端渲染应用程序。

Index.js(只需在index中调用另一个组件Layout即可)

import Layout from "./layout";
import React from "react";

class Home extends React.Component {
  render() {
    return (
      <div>
        <Layout />
      </div>
    );
  }
}

export default Home;

布局.js

import React from "react";
import Product from "./product";

class Layout extends React.Component {
  static async getInitialProps() {
    const res = await fetch("https://api.github.com/repos/developit/preact");
    console.log(res);
    const json = await res.json();
    return { stars: json.stargazers_count };
  }

  componentDidMount() {
    if (localStorage.getItem("userLoggedIn")) {
      //Get products details for logged in user api
      //For now let us consider the same api
      // const res = fetch("https://api.github.com/repos/developit/preact");
      // const json = res.json(); // better use it inside try .. catch
      // return { stars: json.stargazers_count };
    } else {
      // Get product details for guest user api
      //For now let us consider the same api
      // const res = fetch("https://api.github.com/repos/developit/preact");
      // const json = res.json(); 
      // return { stars: json.stargazers_count };
    }
  }

  render() {
    return (
      <div>
        This is layout page
        <Product stars={this.props.stars} />
      </div>
    );
  }
}

export default Layout;

完整的简单应用示例在这里: https://codesandbox.io/s/nextjs-getinitialprops-748d5 https://codesandbox.io/s/nextjs-getinitialprops-748d5

我的问题是,我试图将道具传递给product页面来自layout页面和道具来自getInitialProps(SSR)..但是您可以在提供的示例中看到,道具不起作用,但它仍然给出不明确的 for this.props.stars .

如果我将这段代码移入componentDidMount并使用setState并将状态作为 props 传递可以工作,但不会在视图页面源中显示从 api 获取的数据。

Note:请不要将此逻辑移动到它起作用的 index.js 文件中,但在我的实际应用程序中,它是动态路由页面,我将根据在该页面上获取的查询参数来获取 api。

如果您进入此链接https://748d5.sse.codesandbox.io/ https://748d5.sse.codesandbox.io/然后单击ctrl + u然后你会看到我还需要从 api 获取动态内容的源。

为了实现这个动态内容(在这个例子中星星计数)仅在视图源中显示,我正在做所有这些都是为了 SEO 目的。


简而言之,你不能打电话getInitialProps来自子组件:getInitialProps 注意事项 https://nextjs.org/docs/api-reference/data-fetching/getInitialProps#caveats.

获取初始道具不能在子组件中使用,仅在每个页面的默认导出中

Your Layout页面是一个子组件Home.

如果你想打电话getInitialProps,那么你需要定义getInitialProps从内部Home页面或创建一个调用自己的包装组件getInitialProps这将包裹页面的default export PageComponet使用这个包装组件:export default withStarsData(PageComponent);结果,这个包装器组件将通过PageComponent some props.

如果你想让这个函数灵活/动态,那么使用ctx https://nextjs.org/docs/api-reference/data-fetching/getInitialProps#context-object's query参数与一个动态路线 https://nextjs.org/docs/routing/dynamic-routes.

这是一个理解起来相当复杂的解决方案,但简而言之,它允许家庭(/)和布局(/layout)页面来获取相同的数据。如果您不想多次获取数据,而是获取一次然后在页面之间共享,那么您将需要使用高阶状态提供程序,例如redux https://github.com/zeit/next.js/tree/canary/examples/with-redux.

工作示例:


组件/withStars/index.js

import React from "react";
import fetch from "isomorphic-unfetch";

// 1.) this function accepts a page Component and...
const withStars = WrappedComponent => {

  // 7.) if stars data is present, returns <WrappedComponent {...props} /> with props
  // else if there's an error, returns the error
  // else returns a "Loading..." indicator
  const FetchStarsData = props =>
    props.stars ? (
      <WrappedComponent {...props} />
    ) : props.error ? (
      <div>Fetch error: {props.error} </div>
    ) : (
      <div>Loading...</div>
    );

  // 3.) this first calls the above function's getInitialProps
  FetchStarsData.getInitialProps = async ctx => {

    // 4.) here's where we fetch "stars" data
    let stars;
    let error;
    try {
      const res = await fetch("https://api.github.com/repos/developit/preact");
      const json = await res.json();
      stars = json.stargazers_count;
    } catch (e) {
      error = e.toString();
    }

    // 5.) optionally this will call the <WrappedComponent/> 
    // getInitialProps if it has been defined
    if (WrappedComponent.getInitialProps)
      await WrappedComponent.getInitialProps(ctx);

    // 6.) this returns stars/error data to the FetchStarsData function above
    return { stars, error };
  };

  // 2.) ...returns the result of the "FetchStarsData" function
  return FetchStarsData;
};

export default withStars;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 Next 中传递 props 的相关文章

  • 在 Javascript 中获取第一个数字出现后的子字符串

    我正在尝试提取第一个数字之后 并包括 的字符 ABC 123SD gt 123SD 123 gt 123 123SD gt 123SD ABC gt 我当前的解决方案如下 var string1 ABC 123SD var firstDig
  • Javascript DOM setAttribute 在函数调用中不起作用

    我有一个带有输入元素的 HTML 文件 我希望向其中添加一个名为 valid fieldset011 的新属性 该属性用作 AngularJS 验证器的链接 输入元素具有属性 id fieldset011 如果我使用以下脚本 包含在脚本标签
  • 仅单击 div 内部

    我正在为一个小网站制作教程 我只想让教程气泡可点击 因此 当我们尝试单击气泡之外的某些内容时 什么也不会发生 换句话说 我希望我的 html 不可点击 而 tutorial bubble 可点击 尝试这个 jQuery function h
  • 如何防止 gulp-notify 破坏 Windows 中的 gulp-watch?

    我正在使用吞咽通知 https www npmjs org package gulp notify插入 这是我如何在 gulpfile js 中实现它的示例 您可以看到我也在使用 gutil 和 livereload 我不知道它们是否发挥任
  • html 表格单元格的条件格式

    是否有现成的解决方案可以对 HTML 表格进行条件格式设置 通过条件格式 我更感兴趣的是根据该列或其他列 在同一个表中 的值 数字 将不同的颜色作为单元格背景 类似于我们在 Excel 条件格式 gt 色阶 gt 红黄绿中的内容 我想在通过
  • 了解 sort() 比较函数

    我正在使用一个电子商务平台 该平台无法重新排序产品属性字段的选项 这真的很糟糕 因为要插入新选项 您几乎必须删除所有现有选项并重新开始 我正在尝试在客户端进行操作 这是我正在处理的内容 这是针对鞋码的 9 EE 9 1 2 EE 10 EE
  • 以一定时间间隔连续重复运行 JavaScript 函数

    这是我的第一个问题 希望您尽快回答 我想要代码连续重复一个函数 我尝试了一些代码 但没有成功 我尝试了这段代码 我想在一段时间后重复这个功能 我努力了setInterval and setTimeout 但是 我还没有收到结果 这将重复该任
  • javascript jquery 使用脚本更改脚本的src

    我有一个 JavaScript 脚本 它有一个 src 元素 这个 src 是一个 url 我想使用 javascript 更改它 一次更改为其他内容 或者动态创建它 使用 javascript jquery 动态创建脚本元素的最佳方法是什
  • 如何在 HTML / Javascript 页面中插入 PHP 下拉列表

    好吧 这是我的第二篇文章 请接受我是一个完全的新手 愿意学习 花了很多时间在各个网站上寻找答案 而且我几乎已经到达了我需要到达的地方 至少在这一点上 我有一个网页 其中有许多 javascript 函数 这些函数一起使用 google 地图
  • 使用文件 API 将资源加载到 Three.js 中

    我想创建导入 3D 模型以在浏览器中查看的功能 方法是使用File API http www html5rocks com en tutorials file dndfiles Three js 加载器在我托管的文件上运行良好 我的理解是加
  • 判断一个数字是否能被 3 或 5 整除 (FizzBu​​zz)

    如何根据输出是否能被 3 或 5 整除来更改输出 如果它能被 3 整除 我想显示 rock 如果它能被 5 整除 我想显示 star 类似于 FizzBu zz 如果两者都有 他们都会看到 这是我的代码 if var n Math floo
  • 如何在react-三纤维中提取并播放动画

    嗯 我有 gltf 动画模型 我成功加载模型 但无法播放嵌入的动画 我想知道是否可以以任何方式解决它 顺便说一句 我正在反应中工作 先感谢您 在这里您可以找到型号https drive google com file d 1ZVyklaQu
  • 循环遍历元素并逐步为每个元素应用 CSS 规则

    我有一个网格布局 每个网格布局中都有不同数量的元素 我想动态添加内联grid column通过循环遍历 div 中存在的每个元素的 CSS 规则 ul 与一类 list 所以 HTML 代码的输出需要是 ul class list ul u
  • 在 jQuery 可排序中对多个选定项目进行排序?

    我试图在 jQuery 可排序集中选择多个项目 然后将选定的项目一起移动 这是我的弱点开始尝试使其发挥作用 http jsfiddle net benstenson CgD8Y 这是代码 HTML div class container d
  • 了解 JavaScript - 资源

    使用 StackOverflow 的微型 Digit Blog 功能进行描述here https stackoverflow com about 我想发布以下我刚刚看到的 我觉得很有趣的谷歌技术谈话视频 我一直在理解 javascript
  • console.log() 显示同一对象属性的矛盾值

    我想我可能要疯了 我使用 console log 来查看对象的状态 然后在下一行对同一对象的特定属性执行 console log 并为每个属性获取不同的值 我正在使用的代码是 console log this pictures Items
  • 如何更改自动完成中的结果过滤器?

    我不想进行字面匹配 而是想通过正则表达式选择结果 我可以覆盖自动完成的默认行为来完成此任务还是需要替代结构 有一个内置的方法可以做到这一点 只需提供一个函数source http jqueryui com demos autocomplet
  • 为什么将 x 和 y 设置为 0 时 svg 文本会消失?

    我刚刚开始阅读有关svg我提出了以下问题 我正在创建一个简单的svg with a text里面如下图所示 从我的阅读中我了解到x and y of the text标签声明文本在标签内的位置svg space 为什么当我同时设置x and
  • 如何检测元素内容何时发生变化

    我正在寻找一种方法来监视元素内动态填充 无页面重新加载 内容 以便我可以将类添加到另一个元素 到目前为止我有这个 HTML div class message container div class messages error span
  • IE 中的每个 JavaScript 支持?

    我有这个代码

随机推荐

  • 如何确定使用 Spring Security 访问 URL 需要哪些角色?

    我正在使用 Spring Security 来保护网络应用程序 URL 的安全性如下
  • Java中如何将Integer[]数组转换为int[]数组?

    有没有一种奇特的方法将 Integer 数组转换为 int 数组 我不想迭代每个元素 我正在寻找一种优雅而快速的方式来编写它 相反 我正在使用 scaleTests add Arrays stream data boxed toArray
  • 有效地选择随机数

    我有一个方法 它使用随机样本来近似计算 该方法被调用数百万次 因此选择随机数的过程是否高效非常重要 我不确定java有多快Random nextInt确实如此 但我的程序似乎并没有像我希望的那样受益 选择随机数时 我执行以下操作 以半伪代码
  • 锁定多个 std::mutex 的最佳方法是什么?

    注意 这个问题涉及C 11 C 17 或更高版本 中同一问题的答案可能已更改 详情 std lock guard 还是 std scoped lock https stackoverflow com questions 43019598 s
  • 如何根据 Django 管理中另一个选择标签的选项更改选择标签选项?

    我在 admin py 中有这个 class BrandAdmin admin ModelAdmin list display name category date form BrandAdminForm class Media js ow
  • 实体框架和表值参数

    我正在尝试调用存储过程实体框架它使用表值范围 但是当我尝试执行函数导入时 我不断收到一条警告消息 函数 InsertPerson 有一个参数 InsertPerson TVP 参数索引 0 具有当前的数据类型 表类型 目标 NET Fram
  • 两个数组之间的差异

    我有以下两个数组 我想要这两个数组之间的差异 也就是说 如何找到两个数组中都不存在的值 array1 Array 0 gt 64 1 gt 98 2 gt 112 3 gt 92 4 gt 92 5 gt 92 array2 Array 0
  • 可以在外部html中使用Extjs的脚本吗?

    我已使用以下方法将手动编写的脚本加载到 Extjs Ext Loader LoadScript http docs sencha com extjs 4 1 3 api Ext Loader method loadScript Ext Lo
  • Java PDF 查看器

    我正在使用 java 和 RCP 并且尝试在我的视图中使用 Acrobat 显示 pdf 文档 我不需要改变它们 我的这段代码有这个错误 知道如何解决这个问题吗 P s 同样的时间效果很好 PDFFile pdfFile pdfFile P
  • 如何释放不再使用的 UIImage 内存

    我正在尝试将一些较小的图像合并为一个较大的图像 该应用程序崩溃是因为内存不足 但我不知道如何在使用内存后释放内存 因此它会不断累积 直到应用程序崩溃 addImageToImage 和 resizeImage 例程似乎导致了崩溃 因为在不再
  • 如何为采用单个数组参数的构造函数调用 New-Object?

    在 PowerShell 中 我想使用New Object调用单参数 Net 构造函数new X509Certificate2 byte byteArray 问题是当我使用 powershell 中的字节数组执行此操作时 我得到 新对象 找
  • 确定字符串是否经过两次 Base64 编码

    有什么方法可以确定字符串是否经过两次 Base64 编码 例如 是否有我可以使用的正则表达式模式preg match去做这个 实际答案 不要使用正则表达式 使用解码你的字符串base64 decode http php net manual
  • 模拟已弃用的seaborn distplots

    Seaborn distplot https seaborn pydata org generated seaborn distplot html现已弃用 并将在未来版本中删除 建议使用histplot https seaborn pyda
  • 在 flash builder as3 项目中使用 c++ lib

    是否可以在as3项目中使用c lib 闪存生成器 4 7 我有一个用 C 编写的项目 我想用 flash 构建 gui 我正在寻找一种使用 flash 并使用我的 c 库的方法 我猜想一个Flash http en wikipedia or
  • NetBeans - 在哪里可以找到 IDE 日志?

    我向以下人员报告了一个错误http issues apache org http issues apache org我必须给他们一个 IDE 日志 但我不知道在哪里可以找到它 我搜索了C Users MyUser但没有 netbeans 的
  • 应用程序配置不允许给定 URL Facebook 应用程序错误

    应用程序配置不允许给定 URL 应用程序设置不允许一个或多个给定 URL 它必须与网站 URL 或画布 URL 匹配 或者该域必须是应用程序域之一的子域 我已经研究了关于 SO 的最流行的问题 问题1 https stackoverflow
  • Python - 仅运行一行代码,而不运行脚本中其余的多行代码

    在 Python 中 在 IDLE 内 在文件编辑器窗口中 如何仅运行脚本中选定的单行代码 而不运行程序的其余行 您必须从命令行运行代码行 使用 c 命令 参数 假设您的文件名为 foo py python c import foo pri
  • 根据单词是否粗体更改单词样式的速度很慢

    我想更改活动文档中几个单词的样式 每个单词可能出现多次 有些词是粗体 有些是非粗体 单词存储在数组中Arr 如果找到的单词 X 是非粗体 则将样式替换为StyleA如果它是粗体 则将其更改为StyleB 以下代码有两个问题 1 粗体和非粗体
  • 什么是总线错误?它与分段错误有什么不同吗?

    总线错误 消息是什么意思 它与总线错误有何不同分段故障 https en wikipedia org wiki Segmentation fault 如今 总线错误在 x86 上很少见 当您的处理器甚至无法尝试请求的内存访问时 就会发生总线
  • 无法在 Next 中传递 props

    我正在使用 Next Js React SSR 制作服务器端渲染应用程序 Index js 只需在index中调用另一个组件Layout即可 import Layout from layout import React from react