import { Component, createSignal, onMount, onCleanup, Show } from 'solid-js'; import { parseMarkdown } from '../markdown'; import { fetchData } from '../data-loader'; export interface ArticleProps { src: string; onLoaded?: () => void; onError?: (error: Error) => void; } /** * Article 组件 * 用于将特定 src 位置的 md 文件显示为 markdown 文章 */ export const Article: Component = (props) => { const [content, setContent] = createSignal(''); const [loading, setLoading] = createSignal(true); const [error, setError] = createSignal(null); let articleRef: HTMLArticleElement | undefined; onMount(async () => { setLoading(true); try { const text = await fetchData(props.src); setContent(text); setLoading(false); props.onLoaded?.(); } catch (err) { const errorObj = err instanceof Error ? err : new Error(String(err)); setError(errorObj); setLoading(false); props.onError?.(errorObj); } }); onCleanup(() => { // 清理时清空内容,触发内部组件的销毁 setContent(''); }); return (
加载中...
加载失败:{error()?.message}
); }; export default Article;