Skip to content

Commit 8ea66c4

Browse files
committed
feat: Support ref.
1 parent 0287b51 commit 8ea66c4

File tree

2 files changed

+19
-15
lines changed

2 files changed

+19
-15
lines changed

src/index.tsx

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useEffect } from 'react';
1+
import React, { useEffect, useImperativeHandle } from 'react';
22
import ReactMarkdown, { ReactMarkdownProps } from 'react-markdown';
33
import gfm from 'remark-gfm';
44
import Prism from 'prismjs';
@@ -15,8 +15,13 @@ export type MarkdownPreviewProps = {
1515
onMouseOver?: (e: React.MouseEvent<HTMLDivElement>) => void;
1616
} & ReactMarkdownProps;
1717

18-
const MarkdownPreview: React.FC<MarkdownPreviewProps> = (props = {} as ReactMarkdownProps) => {
19-
const { className, source, style, onScroll, onMouseOver, ...other } = props;
18+
export type MarkdownPreviewRef = {
19+
mdp: React.RefObject<HTMLDivElement>;
20+
lang: string[],
21+
} & MarkdownPreviewProps;
22+
23+
export default React.forwardRef<MarkdownPreviewRef, MarkdownPreviewProps>((props, ref) => {
24+
const { className, source, style, onScroll, onMouseOver, ...other } = props || {};
2025
const mdp = React.createRef<HTMLDivElement>();
2126
const loadedLang = React.useRef<string[]>(['markup']);
2227
useEffect(() => {
@@ -42,28 +47,27 @@ const MarkdownPreview: React.FC<MarkdownPreviewProps> = (props = {} as ReactMark
4247
}
4348
}
4449

50+
useImperativeHandle(ref, () => ({ ...props, lang: loadedLang.current, mdp }), [mdp, props]);
51+
4552
const cls = `wmde-markdown wmde-markdown-color ${className || ''}`;
4653
const reactMarkdownProps = {
4754
allowDangerousHtml: true,
48-
...other,
49-
plugins: [gfm, ...(other.plugins || [])],
5055
allowNode: (node, index, parent) => {
51-
const nodeany = node;
52-
if (nodeany.type === 'html' && reactMarkdownProps.allowDangerousHtml) {
56+
if (node.type === 'html' && reactMarkdownProps.allowDangerousHtml) {
5357
// filter style
5458
node.value = (node.value as string).replace(/<((style|script|link|input|form)|\/(style|script|link|input|form))(\s?[^>]*>)/gi, (a: string) => {
5559
return a.replace(/[<>]/g, (e: string) => (({ '<': '&lt;', '>': '&gt;' } as { [key: string]: string })[e]))
5660
});
5761
}
5862
return true;
5963
},
64+
...other,
65+
plugins: [gfm, ...(other.plugins || [])],
6066
source: source || '',
6167
} as ReactMarkdownProps;
6268
return (
6369
<div ref={mdp} onScroll={onScroll} onMouseOver={onMouseOver} className={cls} style={style}>
6470
<ReactMarkdown {...reactMarkdownProps} />
6571
</div>
6672
);
67-
}
68-
69-
export default MarkdownPreview;
73+
});

website/App.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import Github from '@uiw/react-shields/lib/esm/github';
44
import Npm from '@uiw/react-shields/lib/esm/npm';
55
import logo from './logo.svg';
66
import './App.css';
7-
import MarkdownPreview from '../';
7+
import MarkdownPreview, { MarkdownPreviewRef } from '../';
88
import MDStr from '../README.md';
99

1010
let val = 1;
1111

1212
export default () => {
1313
const [value, setValue] = useState('');
14+
const ref = React.createRef<MarkdownPreviewRef>();
1415
return (
1516
<div className="App">
1617
<GitHubCorners zIndex={9999} fixed target="__blank" href="https://github.com/uiwjs/react-markdown-preview" />
@@ -24,15 +25,14 @@ export default () => {
2425
</p>
2526
</header>
2627
<div className="App-editor">
27-
<button onClick={() => {
28-
setValue('# 333' + val++)
29-
}}>set value</button>
28+
<button onClick={() => setValue('# Markdown ' + val++)}>set value</button>
29+
3030
<textarea
3131
placeholder="Please enter the Markdown code!"
3232
value={value}
3333
onChange={(e) => setValue(e.target.value)}
3434
/>
35-
{value && <MarkdownPreview className="App-editor-preview" source={value} />}
35+
<MarkdownPreview ref={ref} className="App-editor-preview" source={value} />
3636
</div>
3737
<MarkdownPreview className="App-markdown" source={MDStr.replace(/([\s\S]*)<!--dividing-->/, '')} />
3838
<div className="App-footer">

0 commit comments

Comments
 (0)