从加载器传递组件?

问题描述 投票:0回答:1

我想在我的项目中使用 MDX,但是当我通过 API 获取数据(以 markdown 形式)时,我不能只导入它,我必须在我的应用程序中解析它。

为此,我创建了一个函数,根据他们的文档,它将采用原始 markdown 并使用

@mdx-js/mdx
进行编译:

      return {
        data: result,
        body: String(
              await compile(item, {
                outputFormat: "function-body",
              })
            ),
      };

然后,我想将其加载到我的

loader
函数中:

export async function loader({ params }: Route.LoaderArgs) {
  const post = await getBlogPost(params.slug);

  if (post?.body) {
    const content = await run(post.body, {
      ...runtime,
      baseUrl: import.meta.url,
    });

    return {
      ...post.data,
      body: post.body,
      Content: content.default,
    };
  }

  // eslint-disable-next-line @typescript-eslint/only-throw-error
  throw redirect("/404");
}

一切都很好,但是

Content
不起作用,它作为对象传递,而不是作为函数传递。我必须进行客户端解析,这在使用 SSR 框架时毫无意义:

export default function Entry({ loaderData }: Route.ComponentProps) {
  const [Cnt, setCnt] = useState<ComponentType>(Fragment);

  useEffect(() => {
    (async () => {
      try {
        const content = await run(loaderData.body, {
          ...runtime,
          baseUrl: import.meta.url,
        });

        setCnt(() => content.default);
      } catch (error) {
        console.error("Error loading content:", error);
      }
    })();
  }, [loaderData.body]);

  return <div>{<Cnt />}</div>;
}

有什么想法可以如何从加载器传递组件,或者以任何其他方式执行此操作?

react-router remix.run
1个回答
0
投票

不是您问题的答案,但您可以通过将其添加到您的 eslint 配置中来删除您的

// eslint-disable-next-line
评论之一:

      '@typescript-eslint/only-throw-error': [
        'error',
        {
          allow: ['Redirect'],
          allowThrowingAny: false,
          allowThrowingUnknown: false,
        },
      ],
© www.soinside.com 2019 - 2024. All rights reserved.