You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

拆分Preact组件后页面渲染结果被覆盖的原因咨询

问题原因及解决方案

核心问题拆解

你遇到的“先显示Uvalue后变成U”的现象,结合Fresh架构特性和代码错误,原因有两个:

  1. 变量名笔误
    在islands/User.tsx里,你导入的是Form1Context,但routes/index.tsx中导出的Context变量名是Username,两者完全不匹配——这是直接的语法错误。
  2. Fresh的模块边界限制
    Fresh的routes/目录下的组件属于服务器端组件,默认不会被打包发送到浏览器;而islands/下的组件是客户端组件,会在浏览器中进行hydrate(客户端渲染补全)。当你从routes/index.tsx导入Context到客户端组件时,浏览器环境中根本不存在这个模块,导致客户端hydrate时useContext拿到的是undefined,最终显示U。而初始的Uvalue是服务器端渲染的结果,所以会先出现再被客户端替换。

修复方案

把Context单独抽离到一个独立的共享文件,让服务器端和客户端组件都能正确导入同一个Context实例:

  1. 创建src/lib/contexts.ts文件:
import { createContext } from 'preact';

export const Username = createContext<string | undefined>(undefined);
  1. 修改routes/index.tsx:
import { User } from "../islands/User.tsx";
import { Username } from "../lib/contexts.ts";

export function ContextProvider({ children }) {
  return (
    <Username.Provider value="value">
      {children}
    </Username.Provider>
  );
}

export default function App() {
  return (
    <ContextProvider>
      <User />
    </ContextProvider>
  );
}
  1. 修改islands/User.tsx:
import { useContext } from 'preact/hooks';
import { Username } from '../lib/contexts.ts';

export function User() {
  const username = useContext(Username); 
  return <>U{username}</>;
}

这样无论服务器端还是客户端,都能引用同一个Context实例,就不会出现前后显示不一致的问题了。

内容的提问来源于stack exchange,提问作者Ooker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:02:50