Skip to content

Commit 2c91e67

Browse files
committedSep 21, 2023
feat(merge): add destroyRerender props. (#566)
1 parent e16ede0 commit 2c91e67

File tree

6 files changed

+36
-33
lines changed

6 files changed

+36
-33
lines changed
 

‎core/README.md

+5-10
Original file line numberDiff line numberDiff line change
@@ -103,17 +103,12 @@ import CodeMirror from '@uiw/react-codemirror';
103103
import { javascript } from '@codemirror/lang-javascript';
104104

105105
function App() {
106-
const onChange = React.useCallback((value, viewUpdate) => {
107-
console.log('value:', value);
106+
const [value, setValue] = React.useState("console.log('hello world!');");
107+
const onChange = React.useCallback((val, viewUpdate) => {
108+
console.log('val:', val);
109+
setValue(val);
108110
}, []);
109-
return (
110-
<CodeMirror
111-
value="console.log('hello world!');"
112-
height="200px"
113-
extensions={[javascript({ jsx: true })]}
114-
onChange={onChange}
115-
/>
116-
);
111+
return <CodeMirror value={value} height="200px" extensions={[javascript({ jsx: true })]} onChange={onChange} />;
117112
}
118113
export default App;
119114
```

‎merge/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
},
3535
"dependencies": {
3636
"@babel/runtime": "^7.18.6",
37-
"@codemirror/merge": "^6.1.0",
37+
"@codemirror/merge": "^6.1.2",
3838
"@uiw/react-codemirror": "4.21.15"
3939
},
4040
"keywords": [

‎merge/src/Internal.tsx

+23-20
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export const Internal = React.forwardRef<InternalRef, CodeMirrorMergeProps>((pro
2222
highlightChanges,
2323
gutter,
2424
collapseUnchanged,
25+
destroyRerender,
2526
renderRevertControl,
2627
...elmProps
2728
} = props;
@@ -95,26 +96,28 @@ export const Internal = React.forwardRef<InternalRef, CodeMirrorMergeProps>((pro
9596
});
9697
}
9798
}
98-
view.current?.destroy();
99-
view.current = new MergeView({
100-
a: {
101-
...original,
102-
extensions: [
103-
...(originalExtension?.extension || []),
104-
...getDefaultExtensions({ ...originalExtension?.option, theme }),
105-
],
106-
},
107-
b: {
108-
...modified,
109-
extensions: [
110-
...(modifiedExtension?.extension || []),
111-
...getDefaultExtensions({ ...modifiedExtension?.option, theme }),
112-
],
113-
},
114-
parent: editor.current!,
115-
...opts,
116-
});
117-
}, [view, theme, editor.current, original, modified, originalExtension, modifiedExtension]);
99+
if (destroyRerender) {
100+
view.current?.destroy();
101+
view.current = new MergeView({
102+
a: {
103+
...original,
104+
extensions: [
105+
...(originalExtension?.extension || []),
106+
...getDefaultExtensions({ ...originalExtension?.option, theme }),
107+
],
108+
},
109+
b: {
110+
...modified,
111+
extensions: [
112+
...(modifiedExtension?.extension || []),
113+
...getDefaultExtensions({ ...modifiedExtension?.option, theme }),
114+
],
115+
},
116+
parent: editor.current!,
117+
...opts,
118+
});
119+
}
120+
}, [view, theme, editor.current, original, modified, originalExtension, modifiedExtension, destroyRerender]);
118121

119122
useEffect(() => () => view.current && view.current.destroy(), []);
120123

‎merge/src/index.tsx

+4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import { Provider, InitialState } from './store';
88
export interface CodeMirrorMergeRef extends InternalRef {}
99
export interface CodeMirrorMergeProps extends React.HTMLAttributes<HTMLDivElement>, MergeConfig {
1010
theme?: InitialState['theme'];
11+
/**
12+
* Default is `false`. If true, the editor will be destroyed and re-rendered every time the editor is updated.
13+
*/
14+
destroyRerender?: boolean;
1115
}
1216

1317
const InternalCodeMirror = React.forwardRef<CodeMirrorMergeRef, CodeMirrorMergeProps>(({ theme, ...props }, ref) => {

‎www/src/pages/merge/examples/Example.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export default function App() {
3131
value={doc.replace(/t/g, 'T') + 'Six'}
3232
/>
3333
</CodeMirrorMerge>
34-
<div style={{ display: 'flex' }}>
34+
<div style={{ display: 'flex', marginTop: 10 }}>
3535
<pre style={{ flex: 1 }}>{value} </pre>
3636
<pre style={{ backgroundColor: '#fff', flex: 1 }}>{valueModified} </pre>
3737
</div>

‎www/src/pages/theme/Preview.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const ButtonGroup = styled.div`
5858
`;
5959

6060
export const Preview: FC<PropsWithChildren<PreviewProps>> = (props) => {
61-
const { themePkg, mode } = props;
61+
const { themePkg, mode, children } = props;
6262
const { mdData } = useMdData(props.path);
6363
const [previewDoc, setPreviewDoc] = useState<PreviewProps['preview']>(props.preview || 'example');
6464
const themePkgNmae = !!mode ? themePkg?.replace(/-(light|dark)$/, '') : themePkg;
@@ -90,6 +90,7 @@ export const Preview: FC<PropsWithChildren<PreviewProps>> = (props) => {
9090
<PreCode value={`npm install ${themePkg} --save`} />
9191
</Header>
9292
)}
93+
{children}
9394
{mdData && (previewDoc === 'document' || !themePkg) && <Markdown source={mdData.source} mdData={mdData} />}
9495
{previewDoc === 'example' && themePkg && themeExtensionName && <Sample theme={extension} />}
9596
</Content>

0 commit comments

Comments
 (0)
Please sign in to comment.