index.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import * as React from 'react';
  2. import BaseComponent from '../_base/baseComponent';
  3. import MarkdownRenderFoundation, {
  4. MarkdownRenderAdapter,
  5. MarkdownRenderBaseProps,
  6. MarkdownRenderBaseState,
  7. } from '@douyinfe/semi-foundation/markdownRender/foundation';
  8. import "@douyinfe/semi-foundation/markdownRender/markdownRender.scss";
  9. import { CSSProperties } from 'react';
  10. import * as runtime from 'react/jsx-runtime';
  11. import { cssClasses } from '@douyinfe/semi-foundation/markdownRender/constants';
  12. export interface MarkdownRenderProps extends MarkdownRenderBaseProps{
  13. style?: CSSProperties;
  14. className?: string
  15. }
  16. export interface MarkdownRenderState extends MarkdownRenderBaseState{
  17. }
  18. class MarkdownRender extends BaseComponent<MarkdownRenderProps, MarkdownRenderState> {
  19. foundation = new MarkdownRenderFoundation(this.adapter)
  20. constructor(props: MarkdownRenderProps) {
  21. super(props);
  22. this.state = {
  23. MDXContentComponent: this.foundation.evaluateSync(this.props.mdxRaw)
  24. };
  25. }
  26. componentDidUpdate(prevProps: Readonly<MarkdownRenderProps>, prevState: Readonly<MarkdownRenderState>, snapshot?: any) {
  27. if (prevProps.mdxRaw!==this.props.mdxRaw) {
  28. this.setState({ MDXContentComponent: this.foundation.evaluateSync(this.props.mdxRaw) });
  29. }
  30. }
  31. get adapter(): MarkdownRenderAdapter<MarkdownRenderProps, MarkdownRenderState> {
  32. return {
  33. ...super.adapter,
  34. getRuntime: ()=>runtime
  35. };
  36. }
  37. render() {
  38. const ComponentConstructor = this.state.MDXContentComponent;
  39. return <div className={`${cssClasses.PREFIX}`}>
  40. <ComponentConstructor components={this.props.components} />
  41. </div>;
  42. }
  43. }
  44. export default MarkdownRender;