你好你好吗?我试图react-player
在我的 Next.js 应用程序中使用,但没有任何运气。
这段代码
import ReactPlayer from "react-player";
const Home = () => {
return (
<div>
<p>Here is my video!!</p>
<div className={s.wrapper}>
<ReactPlayer src='https://www.youtube.com/watch?v=zohpogt56Bg' width="100%"
height="100%" className={s.player} />
</div>
</div>
)}
Run Code Online (Sandbox Code Playgroud)
不断抛出此错误:错误:水合失败,因为初始 UI 与服务器上呈现的内容不匹配。
有人知道发生了什么事吗?谢谢!
我认为预渲染过程意味着像 useEffect 这样的钩子已经在服务器上执行了。
我读过一些关于水合作用的内容,不知道它是否解释了这种现象,但无法从解释该术语的博客中清楚地理解它。
是否可以在 Next.js 中强制使用SSR-only模式并且仅部分地对页面进行水合?假设我有这个应用程序:
组件/dynamic.jsx
export default () => (
<button onClick={() => console.log("I have been clicked")}>Click me</button>
)
Run Code Online (Sandbox Code Playgroud)
页面/index.jsx
import DynamicComponent from "../components/dynamic.jsx";
export default () => (
<div>
<h1>Hello World</h1>
<p>Lorem ipsum</p>
<Hydrate>
<DynamicComponent />
</Hydrate>
</div>
);
Run Code Online (Sandbox Code Playgroud)
现在假设我们正在渲染pages/index.jsx
,Next.js
因此它将在服务器上渲染并在客户端上完全水合。出于性能原因(缩小包大小,减少执行时间)并让应用程序更好地播放广告 () 我只想DynamicComponent
在客户端上水合,最多只为客户端加载 JavaScript DynamicComponent
。
这可能与
谢谢
MRE: https: //github.com/Morpheu5/nuxt3-Hydration-mre(原为https://box.morpheu5.net/s/H6WXBfCebrRyTa8)
根据文档,useState
NuxtJS 3 应该是 SSR 友好的轻量级创建状态的方式。我需要使用它,以便任何人都page/[somepage].vue
可以设置一些数据供layout/default.vue
. 这是一个页面:
<template>
<div>Some page content.</div>
</template>
<script setup>
useState('page_title', () => 'Some page title');
</script>
Run Code Online (Sandbox Code Playgroud)
这是默认布局:
<template>
<div>
<h1>{{ page_title }}</h1>
<slot />
</div>
</template>
<script setup>
const page_title = useState('page_title');
</script>
Run Code Online (Sandbox Code Playgroud)
当我在开发模式下运行它时,我在浏览器的控制台中收到此警告:
runtime-core.esm-bundler.js:38 [Vue warn]: Hydration text content mismatch in <h1>:
- Client:
- Server: Some page title
at <Default >
at <AsyncComponentWrapper >
at <BaseTransition mode="out-in" appear=false persisted=false ... >
at …
Run Code Online (Sandbox Code Playgroud) 我是新手Vue
,我们面临着DOM
页面总大小增加的问题,因为我们在DOM
Vue 客户端水化的配置中存储了大量数据。出于 SEO 的目的,我们不能跳过服务器端渲染。
我希望是否有任何方法可以阻止水化作用在少数Vue
组件上?
所以基本上,我们可以强制 SSR 跳过附加“数据服务器渲染”属性。
我想在React + TS前端和node + TS后端之间共享TS类或接口。问题是TS类型在编译时被剥夺了,因此当我要将类实例转换为JSON时无法使用它们。
我想知道是否有任何解决方案可以在静态文件中描述对象,生成TS类以及将该文件用于数据水合和脱水。一些属性是moment.js
对象和Decimal.js
对象。我正在寻找一种可以基于静态描述符进行转换的解决方案,而无需为每个属性手动编写转换。
脱水格式用于HTTP请求中,另外还存储在DB(Firebase Firestore)中,并且可由前端直接访问以进行读取。
我的预感是存在一些水合不匹配,其中FontAwesomeIcon
未在服务器上渲染(仅span
),然后在客户端上NuxtLink
渲染 的两个子节点(svg
和span
),提示 Nuxt 渲染span
两次。
但控制台不会返回错误。
关于如何调试这个有什么想法吗?
这是 Vue 组件:
<template>
<ul v-if="routes.length > 0" class="col-span-2 flex flex-col">
<li v-for="(item, i) in routes" :key="item.name">
<NuxtLink :to="item.path" target="_blank">
<FontAwesomeIcon :icon="item.icon" class="mr-3" fixed-width />
<span>{{ item.title }}</span>
</NuxtLink>
</li>
</ul>
</template>
<script lang="ts">
export default defineComponent({
props: {
links: {
type: Array,
default: () => ["instagram", "facebook", "email"],
},
},
computed: {
routes() {
return [
{
name: "instagram",
path: "https://www.instagram.com/insta.name/", …
Run Code Online (Sandbox Code Playgroud) 我想扩展 ObjectHydrator 以受益于我的 ManyToOne 关系的水合并向实体添加额外的字段。
这是我的水合器:StatisticsDataHydrator.php
namespace AppBundle\Hydrator\ProjectAssignment;
use AppBundle\Entity\ProjectAssignment;
use Doctrine\ORM\Internal\Hydration\ObjectHydrator;
class StatisticsDataHydrator extends ObjectHydrator
{
/**
* {@inheritdoc}
*/
protected function hydrateRowData(array $data, array &$result)
{
$hydrated_result = array();
parent::hydrateRowData($data, $hydrated_result);
/** @var ProjectAssignment $project_assignment */
$project_assignment = $hydrated_result[0][0];
$result[] = $project_assignment;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的配置:config.yml
doctrine:
orm:
hydrators:
project_assignment_statisticsdata_hydrator: AppBundle\Hydrator\ProjectAssignment\StatisticsDataHydrator
Run Code Online (Sandbox Code Playgroud)
在我不使用保湿器的情况下,我没有问题:
/**
* @param ProjectStage $stage
* @return array
*/
public function findByStageWithStatisticsData(ProjectStage $stage){
$qb = $this->createQueryBuilder('pa');
$qb
//->addSelect('44')
->where($qb->expr()->eq('pa.project_stage', ':stage'))
->setParameter('stage', $stage);
return $qb->getQuery()->getResult();
}
Run Code Online (Sandbox Code Playgroud)
但当我使用保湿器时:
/** …
Run Code Online (Sandbox Code Playgroud) 不知道是什么原因导致这个错误?
如果我删除以下代码,则不会显示该错误。
为什么这部分代码会导致此错误以及如何解决它?
<div className="relative flex flex-col items-center pt-[85.25%] sm:pt-[56.25%] md:pt-[56.26%]">
<ReactPlayer
className="absolute top-0 left-0"
url={`https://www.youtube.com/watch?v=u5-CF_k0KK0&list=RDu5-CF_k0KK0&start_radio=1&ab_channel=TumpyGFX`}
width="100%"
height="100%"
/>
</div>
Run Code Online (Sandbox Code Playgroud) 目前,我正在学习反应并了解术语“水合作用”,我不确定它是如何工作的,任何人都可以帮忙。提前致谢。
我创建了react-app,它有时会给出水合错误来解决这个错误,我不太确定水合是如何工作的,所以我想清楚水合是如何工作的。
hydration ×11
next.js ×5
reactjs ×5
doctrine ×2
javascript ×2
vue.js ×2
doctrine-orm ×1
many-to-one ×1
mismatch ×1
node.js ×1
nuxt.js ×1
nuxtjs3 ×1
php ×1
react-player ×1
symfony ×1
typescript ×1
use-effect ×1
web ×1