javascript React服务器端组件-“response.readRoot()”函数的替代方法

pftdvrlh  于 2023-02-21  发布在  Java
关注(0)|答案(1)|浏览(123)

在React服务器组件official GitHub example repo中,就在这一行中,它们使用response.readRoot()
我想创建一个类似的应用程序测试与RSC的东西,它似乎不包含.readRoot()函数了(因为他们已经更新了npm上的react包中的API,我找不到任何关于它!).但它返回的value属性树如下:

这意味着,无论我在根服务器组件中呈现什么,如果我呈现那个变量(JSON.parse(value)),都不会出现在浏览器中||未解析)在我的应用上下文提供程序中。
我该怎么渲染这个?
基本上,如果你在客户端得到一些响应(在react服务器组件中),你必须在浏览器中呈现这个响应,浏览器具有来自服务器的新状态,但是由于我不再能够从response访问readRoot(),那么它可以使用什么替代方法呢?

flvtvl50

flvtvl501#

我使用了一个技巧来解决这个问题,但有一点要记住,它们仍然是不稳定的API,React使用,它仍然建议不要在生产级别使用React服务器组件,使用它来学习和测试它,并让自己熟悉它,所以回到解决方案:
我的经验是,他们在depo应用程序中使用的缓存层出现了很多问题。我刚刚删除了它。我的建议是,在这些函数和API稳定之前,暂时不要使用它。因此,我在useServerResponse(...)函数中删除了它,在这里,我将其重命名为getServerResponse(...),因为我后来创建了一个钩子,以便将承诺转换为实际的可渲染响应。所以我做的是:

export async function getServerResponse(location) {
  const key = JSON.stringify(location);
  // const cache = unstable_getCacheForType(createResponseCache);
  // let response = cache.get(key);

  // if (response) return response;

  let response = await createFromFetch(
    fetch("/react?location=" + encodeURIComponent(key))
  );

  // cache.set(key, response);

  return response;
}

然后创建一个钩子,它将从上面的函数中获得承诺,并为我返回一个实际的可渲染结果:

export function _useServerResponse(appState) {
  const [tree, setTree] = useState(null);

  useEffect(() => {
    getServerResponse(appState).then((res) => {
      setTree(res);
    });
  }, [appState]);

  return { tree };
}

最后,在我的AppContextProvider中,我使用该钩子获取react服务器组件树,并使用该渲染树作为客户端全局上下文提供程序的子级,如下所示:

import { _useServerResponse } from ".../location/of/your/hook";

export default function AppContextProvider() {
  const [appState, setAppState] = useState({
       ...someAppStateHere
  });
  const { tree } = _useServerResponse(appState);

  return (
    <AppContext.Provider value={{ appState, setAppState }}>
      {tree}
    </AppContext.Provider>
  );
}

我知道这就像一个变通的黑客解决方案,但它在我的情况下工作得很好,似乎直到我们得到稳定的API与适当的官方文档关于RSC,这是一个工作的解决方案,至少对我来说!

相关问题