import { Component, createSignal, createEffect, onCleanup, Show, createResource } from 'solid-js'; import { parseMarkdown } from '../markdown'; import { fetchData, extractSection } from '../data-loader'; export interface ArticleProps { src: string; section?: string; // 指定要显示的标题(不含 #) onLoaded?: () => void; onError?: (error: Error) => void; } async function fetchArticleContent(params: { src: string; section?: string }): Promise { const text = await fetchData(params.src); // 如果指定了 section,提取对应内容 return params.section ? extractSection(text, params.section) : text; } /** * Article 组件 * 用于将特定 src 位置的 md 文件显示为 markdown 文章 */ export const Article: Component = (props) => { const [content, { refetch }] = createResource( () => ({ src: props.src, section: props.section }), fetchArticleContent ); let articleRef: HTMLArticleElement | undefined; createEffect(() => { const data = content(); if (data) { props.onLoaded?.(); } }); onCleanup(() => { // 清理时清空内容,触发内部组件的销毁 }); return (
加载中...
加载失败:{content.error?.message}
); }; export default Article;