Next.js/React 在组件中生成随机值时发出警告

Posted

技术标签:

【中文标题】Next.js/React 在组件中生成随机值时发出警告【英文标题】:Next.js/React warning when generating random values in a component 【发布时间】:2018-05-12 09:40:10 【问题描述】:

我正在构建一个 next.js 应用程序,该应用程序会生成一些生成警告的随机数:

警告:文本内容不匹配。服务器:“1” 客户端:“2”

我想我明白为什么会收到此警告(虚拟 DOM 与从服务器发送的内容有点不同步)。我只是想知道是否有办法让 next.js/React 知道在这种情况下这是可以的。或者有没有办法只在服务器上生成随机数并让客户端将其用作文字?

还是我应该忽略警告?

【问题讨论】:

您在哪个上下文/方法中创建随机值? @F***Schultz 组件构造函数。 也有同样的问题 - 链接的“生成”值(这是预期的),但找不到任何解决方案来从我的控制台中删除该警告 对于 nextjs 的问题,我建议去spectrum.chat 并在那里询问,因为那里的很多开发人员都使用next.js @Koen 感谢您的回复。我找到了一种解决方法。不理想,但至少没有更多警告。 ***.com/a/59976790/1526406 【参考方案1】:

javascript 随机变量移动到 React 状态为我解决了这个问题。

这是我之前的问题(简化):

function RandomNumber() 
  const randomNumber = Math.floor(Math.random() * 100);
  return <p>randomNumber</p>;

之后

function RandomNumber() 
  const [randomNumber, setRandomNumber] = useState(undefined);

  useEffect(() => 
    setRandomNumber(Math.floor(Math.random() * 100));
  , []);

  return <p>randomNumber</p>;

我的代码使用了 React Hooks useStateuseEffect,但之前的 React 生命周期方法 setStatecomponentDidMount 也应该可以正常工作

【讨论】:

【参考方案2】:

我的建议是将包含一些随机生成的内容的内容包装在一个组件内。

components/NoSsr.js

import dynamic from 'next/dynamic';
import React from 'react';

const NoSsr = ( children ) => <>children</>;

export default dynamic(() => Promise.resolve(NoSsr), 
  s-s-r: false,
);

然后在你的文件中:

<NoSsr>
     Math.random() 
</NoSsr>

【讨论】:

以上是关于Next.js/React 在组件中生成随机值时发出警告的主要内容,如果未能解决你的问题,请参考以下文章

在 React 组件中生成输入

.NET Core 中生成验证码

在php中生成随机密码

在javascript中生成随机整数的最快方法是啥?

在 pyCuda 内核中生成单个随机数

如何在 Bash 中生成随机数?