警告:文本内容不匹配。服务器:“我出去了” 客户端:“我进来了” div

2024-02-03

我在用着universal-cookie在 Next.js 项目中,这是在控制台中返回警告的简单代码:

import React, { useState } from "react";
import Cookies from "universal-cookie";
import styles from "../styles/Home.module.css";

export default function Home() {
  const cook = new Cookies();
  const [session, setSession] = useState(cook.get("key"));
  const setCookie = () => {
    cook.set("key", "hola", { secure: true });
    setSession(cook.get("key"));
  };
  const deleteCookie = () => {
    cook.remove("key", { secure: true });
    setSession(undefined);
  };

  return (
    <div className={styles.container}>
      <button onClick={() => setCookie()}>Save Cookie</button>
      <button onClick={() => deleteCookie()}>Delete Cookie</button>
      {session ? <>I'm in</> : <>I'm out</>}
    </div>
  );
}

当“我在”然后刷新页面时,控制台中会出现以下警告:

我已经到处寻找解决方案。


Next.js 预渲染服务器上的每个页面。

默认情况下,Next.js预渲染每一页。这意味着Next.js提前为每个页面生成HTML, 而不是全部由客户端 JavaScript 完成。 预渲染可以带来更好的性能和 SEO。

(...) 当一个 页面由浏览器加载,其 JavaScript 代码运行并使得 页面完全交互(这个过程称为水合作用 https://react.dev/reference/react-dom/client/hydrateRoot在反应中)。

Next.js,构建您的应用程序,渲染 https://nextjs.org/docs/pages/building-your-application/rendering

出现水合作用问题的原因是浏览器上呈现的 HTML 与服务器上生成的 HTML 不匹配。在你的情况下,这是因为cook.get("key")两者返回不同的东西。

有几个选项可以解决这个问题。


#1 将设置状态移至useEffect

第一个解决方案是将状态设置移动到useEffect。这会强制仅在客户端设置状态,因此不会发生不匹配。

export default function Home() {
    const cook = new Cookies();
    const [session, setSession] = useState();
    
    // `setCookie` and `deleteCookie` code here

    useEffect(() => {
        setSession(cook.get("key"));
    }, []);

    return (
        <div className={styles.container}>
            <button onClick={() => setCookie()}>Save Cookie</button>
            <button onClick={() => deleteCookie()}>Delete Cookie</button>
            {session ? <>I'm in</> : <>I'm out</>}
        </div>
    );
}

#2 使用next/dynamic with { ssr: false }

作为替代解决方案,还可以通过动态导入 React 组件来规避该问题next/dynamic https://nextjs.org/docs/advanced-features/dynamic-import#with-no-ssr using { ssr: false },无论在哪里使用该组件。这可以防止组件包含在服务器上,并且仅在客户端动态加载它。

const Home = dynamic(
    () => import('../components/Home'),
    { ssr: false }
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

警告:文本内容不匹配。服务器:“我出去了” 客户端:“我进来了” div 的相关文章

  • 在react-big-calendar中单击事件时添加弹出窗口?

    当单击事件时 我无法将弹出窗口添加到事件中 弹出窗口似乎只显示在事件槽中 而不是显示在事件槽的顶部 此外 由于我为事件创建了一个自定义组件并尝试在自定义组件中实现弹出窗口 因此只有当我单击事件名称时才会显示弹出窗口 这是代码 class C
  • 如何将 Relay 查询从 TypeScript 转换为 ES5?

    我正在用 TypeScript 编写一个网络应用程序 该应用程序使用 Facebook 的 React 和 Relay 我的 TypeScript 源代码使用 TypeScript 编译器 TSC 编译为 ES6 代码 然后 使用 Babe
  • ReactCSSTransitionGroup 组件WillLeave 未调用

    我尝试使用 ReactCssTransition 但不知何故该事件没有被调用 componentWillLeave 这是我的组件 import React Component from react import TransitionGrou
  • 如何使用Create React App安装React

    嗨 我对反应真的很陌生 我不知道如何实际安装它 也不知道我需要做什么才能在其中编写代码 我下载了node js并且安装了v12 18 3以及NPM 6 14 6 但是每次我尝试在许多网站上提到的create react app安装方法中输入
  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • 如何在React中的Material-UI选择框中设置默认值?

    我在用选择框 https material ui com demos selects 来自材料用户界面 我想显示默认选择的 选择值 选项 但之后用户无法选择此选项
  • 使用 Flask/WTForms 和 React 进行 CSRF 保护

    有没有人成功地为使用 React 作为受控组件 提交到 Flask 后端 最好使用 WTForms 的表单实现了 CSRF 保护 我看过很多部分答案 其中一个是关于 Django 的 但找不到任何关于 Flask 的明确答案 我的大问题似乎
  • 在 React Native 中将 Props 传递到屏幕

    我已经开始学习 React Native 并且一如既往地从创建可重用组件开始 我了解了如何在创建自定义组件时传递和访问 props 我想在 React Native 中创建一个基本屏幕 它具有通用属性 并且我的应用程序中的所有屏幕都可以设置
  • 将 firestore 中的数据分配给变量

    我尝试使用 get doc 函数将 firestore 数据库中的变量分配给它们所尊重的值 我注意到它不会分配或更新这些值 我尝试使用异步和等待 但似乎无法使其工作 getFromDatabase nameOfCollection name
  • React - 检查元素在 DOM 中是否可见

    我正在构建一个表单 用户需要回答一系列问题 单选按钮 然后才能进入下一个屏幕 对于字段验证 我使用 yup npm 包 和 redux 作为状态管理 对于一种特定场景 组合 会显示一个新屏幕 div 要求用户进行确认 复选框 然后用户才能继
  • Redux 状态在 mapStateToProps 中未定义

    我目前正在关注this http teropa info blog 2015 09 10 full stack redux tutorial html教程 我遇到了一些障碍mapStateToProps在下面的代码中 import Reac
  • React-redux useDispatch() 未捕获类型错误

    我正在尝试创建一个简单的组件来使用 React Redux 钩子分派操作useDispatch 我收到一个错误 我已将组件修剪到发生错误的位置 当调用 useDispatch 函数时会发生这种情况 import useDispatch fr
  • 在vscode中使用reactjs报错

    在 Visual Studio 代码中使用 jsx 语法 Visual Studio代码报错 请帮我 谢谢 符号 例如 而不是这样做 return lt button className square gt TODO lt button g
  • Express URIError:无法解码参数

    当请求的参数包含时 我将 next js 与自定义 Express 服务器一起使用 它会导致此错误 URIError Failed to decode param faker at decodeURIComponent
  • Flux + React.js - 操作中的回调是好还是坏?

    让我解释一下我最近遇到的问题 我有 React js Flux 驱动的应用程序 有一个列表显示文章数量 注意 应用程序中有多个不同的列表 和文章详情查看在里面 但每个列表只有一个 API 端点 它返回文章数组 为了显示我需要的详细信息fin
  • Google 将自动完成功能放置在 React 组件中

    我正在尝试构建一个谷歌地图组件 谷歌地图 API v3 一切正常 但自动完成功能不行 这是我正在使用的代码 Google 地图组件 import React Component from react import ReactDOM from
  • 如何在 TypeScript React 项目中使用 eslint import 插件启用绝对路径别名?

    我已经安装了eslint plugin import到我的项目 我的目标是使用 import no relative parent imports error 设置禁止在我的项目中进行相对导入以增强可读性 但是 此设置会在我的项目中产生错误
  • × TypeError:无法读取未定义的属性(读取“map”)

    当我尝试运行此代码时 它给出了此错误 TypeError 无法读取未定义的属性 读取 map 为什么会发生这种情况 我怎样才能让它发挥作用 import React from react import Grid from material
  • 我可以更改 FormsAuthentication cookie 名称吗?

    我可以更改 FormsAuthentication cookie 名称吗 如果是 如何 我遇到的问题是 当我在同一个域中部署两个 Web 应用程序时 当任何人登录时 第二个应用程序将自动注销 因为它们使用相同的身份验证 cookie 名称
  • React-Router v5 History.push 不触发组件

    很抱歉朋友们又问这个问题了 我找到了解决这个问题的几个方法 但他们让我很困惑 我只是想问一个优雅的方法来做到这一点 正如你通过标题所理解的 我有一个关于反应路由的问题 让我解释 我有一个按钮 其名称是Login 单击按钮后 我执行了一些逻辑

随机推荐

  • Spark:如何在每个执行器中创建本地数据帧

    在spark scala中有一种方法可以创建执行器中的本地数据帧 例如 pyspark 中的 pandas 在mappartitions方法中 我想将迭代器转换为本地数据帧 如python中的pandas数据帧 以便可以使用数据帧功能 而不
  • 用插值颜色填充阿基米德螺线之间的区域 - Matplotlib

    我想绘制如图所示的各种螺旋 一个螺旋在其他螺旋内部 假设我有三个螺旋 S1 S2 和 S3 我想填充连续螺旋之间的区域 即 S1 和 S2 S2 和 S3 之间的区域 最后是 S3 和 S1 之间的区域 我尝试了多种方法来解决以下两个问题
  • 取消列出数据框中已列出的列

    我有一个包含多个级别的列表 我希望将数据级别转换为数据帧 其中变量 chr 折叠为单个字符串 myList lt list total reach list 4 data list list reach 2 chr list A B C n
  • HTML 5 音频 .play() 在移动设备上的延迟

    我刚刚使用 socket io 构建了一个实时应用程序 其中 主 用户可以在接收设备 桌面浏览器 移动浏览器 上触发声音 该主用户会看到声音文件列表 并且可以在声音文件上单击 播放 音频播放在浏览器上是即时的 然而 在移动设备上 会出现 0
  • 无法在ExtJs中发送参数Ajax

    我在 View Extjs 中有代码 这是代码 var storeTree Ext create Ext data TreeStore proxy type ajax method POST url data newoss get pake
  • 使用或不使用“new”关键字创建 Mongoose 模式?

    我在网上看到的大多数例子都是这样做的 var UserSchema new mongoose Schema name String age String 然而 最近我发现一本书做了上述 但没有 new 关键字 var UserSchema
  • WCF Rest ERR_CONNECTION_RESET 响应不大

    错误代码绝对是可怕的 ERR CONNECTION RESET 有很多原因 我在其他问题上发现的原因与大型 Web 服务调用的 MaxRequestLength 太小有关 不过 我返回的数据只有几 kB 所以这不是问题 这是我的界面代码 W
  • 如何将 prettier 配置添加到 eslint 配置中?

    请注意 我不希望在我的 JS 项目中使用分号 Youtube 视频 https www youtube com watch v KfVPVmORnL4 我尝试在 eslintrc cjs 文件中禁用它 但奇怪的是semi 0无法禁用丢失警告
  • 如何在新进程中运行函数?

    现在我处于进程的线程之一A 我需要创建新流程B在当前线程中 并在进程中运行B功能MyFunc 我该怎么做 我找到了如何从当前进程创建子进程 click http msdn microsoft com en us library window
  • jqgrid - 添加新行并禁用restoreRow功能

    如果我要添加新行并且启用自动编辑新添加的行 那么我想执行验证并通过 ENTER 按钮保存行 但我不想通过 ESC 按钮恢复行 因为我设置了required true按所有字段 如果新添加的行将至少有一个字段为空 则按 ESC 按钮 rest
  • 如何将动态组件放入容器中

    我想创建动态组件并将这些组件的视图插入到容器中 我认为这可以通过以下方式实现视图容器引用 https angular io docs ts latest api core index ViewContainerRef class html
  • TypeError C 是未定义的数据表

    我试图将使用 ajax 获得的一些数据渲染到数据表中 但似乎我丢失了一些东西 因为它显示错误 TypeError c is undefined 我读过这篇文章 数据表类型错误 c 未定义 https stackoverflow com qu
  • 无论如何要将 Owin HTTPS 限制为 TLS 1.2?

    我想将我的 Webapi 锁定为 TLSv1 2 因此不允许使用 TLSv1 1 等 我看到了以下帖子 但它似乎只与 ASP NET Core 相关 有什么方法可以将 ASP NET Core 2 0 HTTPS 限制为 TLS 1 2 h
  • 无法使用 no_std/lang_items 编译 Rust

    我正在尝试建立一个非常类似于的项目dueboot https github com jensnockert dueboot 即嵌入式 ARM 上的 Rust 现在 我只完成了 Rust 代码的编译 但无法编译它 我基本上完全从该项目中复制了
  • IOS企业应用无法安装请稍后再试

    I know this question has been asked a lot on SO however I can ensure that my case is different I am unable to install an
  • 两点碰撞法线

    我正在尝试计算两点的碰撞法线 我需要这个碰撞响应方程来计算新的角速度和线速度 例如 当两个 2d 或 3d 盒子的角相互碰撞时 就会发生这种情况 他们的碰撞正常情况是怎样的 现在 在顶点和面碰撞的情况下 碰撞法线将只是面的法线 它是未定义的
  • 用于文件引用的c# xml代码注释

    xml代码注释中有文件引用的标签吗 该文件是一个sql脚本文件 只是想知道是否有比这样更好的方法
  • 通过 $resource angularjs 获取条件数据

    我正在使用 resource 服务进行增删改查操作 现在我想获取诸如开始日期为今天的约会之类的条件的数据 我正在通过以下方式获取所有数据 vm appointments AppointmentsService query 我的服务代码是 f
  • 过滤包含特定字符串的行

    我必须使用包含字符串的行作为标准来过滤数据框RTB 我在用着dplyr d del lt df gt group by TrackingPixel gt summarise MonthDelivery as integer sum Reve
  • 警告:文本内容不匹配。服务器:“我出去了” 客户端:“我进来了” div

    我在用着universal cookie在 Next js 项目中 这是在控制台中返回警告的简单代码 import React useState from react import Cookies from universal cookie