packages/plugin-docs/src2/DemoContainer/codesandbox/index.tsx (65 lines of code) (raw):

import React, { useEffect, useState } from "react"; import { IDemoOpts, ICodeSandboxFiles, } from "@alicloud/console-toolkit-docs-shared"; import { createCodesandbox } from "./createCodesandbox"; // @ts-ignore import buildTimeDemoOpts from "/@demoOpts"; interface IProps { code: string; imports: string[]; meta: any; modifyCodeSandbox?: IDemoOpts["modifyCodeSandbox"]; } const CodeSandbox: React.FC<IProps> = ({ code, imports, meta, modifyCodeSandbox, }) => { const [codesandboxUrl, setUrl] = useState(""); useEffect(() => { // 切换demo的时候,重置 codesandboxUrl setUrl(""); }, [code]); useEffect(() => { if (!codesandboxUrl) { createCodesandbox({ code, imports, modifyCode: (files) => { let res: ICodeSandboxFiles = files; // 构建者提供的 codesandboxModifier if (buildTimeDemoOpts.modifyCodeSandbox) { res = buildTimeDemoOpts.modifyCodeSandbox({ code, meta, imports, files, }); } // 加载者提供的 codesandboxModifier if (modifyCodeSandbox) { res = modifyCodeSandbox({ code, meta, imports, files: res }); } return res; }, }).then(({ url }) => { setUrl(url); }); } }, [codesandboxUrl]); if (codesandboxUrl) { return ( <iframe sandbox="allow-modals allow-forms allow-popups allow-scripts allow-same-origin" style={iframeStyle} src={codesandboxUrl} /> ); } return <div style={{ ...iframeStyle, padding: 24 }}>Loading...</div>; }; const iframeStyle: React.CSSProperties = { border: 0, width: "100%", minHeight: 520, }; export default CodeSandbox;