# React CodeMirror React CodeMirror is a comprehensive React component library for CodeMirror 6, providing a modern code editor with syntax highlighting, theming, and extensive customization options. Built with TypeScript and React hooks, it offers seamless integration with React applications while maintaining the full power of CodeMirror 6's extensibility. The library includes a rich ecosystem of pre-built themes, language support, and extensions for common editor features. This library simplifies CodeMirror 6 integration by providing React-friendly APIs, automatic state management, and a collection of ready-to-use extensions. It supports controlled and uncontrolled component patterns, custom themes, merge views for diff visualization, and a flexible extension system. The package is designed for modern React applications (16.8+) with full TypeScript support and includes utilities for editor state serialization, event handling, and DOM manipulation. ## Core Component ### Basic CodeMirror Editor ```jsx import React from 'react'; import CodeMirror from '@uiw/react-codemirror'; import { javascript } from '@codemirror/lang-javascript'; function App() { const [value, setValue] = React.useState("console.log('hello world!');"); const onChange = React.useCallback((val, viewUpdate) => { console.log('val:', val); setValue(val); }, []); return ( ); } ``` ### useCodeMirror Hook ```jsx import { useEffect, useMemo, useRef } from 'react'; import { useCodeMirror } from '@uiw/react-codemirror'; import { javascript } from '@codemirror/lang-javascript'; export default function App() { const editor = useRef(); const extensions = useMemo(() => [javascript()], []); const { setContainer, view, state } = useCodeMirror({ container: editor.current, extensions, value: "console.log('hello world!');\n\n\n", onChange: (value, viewUpdate) => { console.log('Updated:', value); }, }); useEffect(() => { if (editor.current) { setContainer(editor.current); } }, [editor.current]); return
; } ``` ## Theme System ### Using Pre-built Themes ```jsx import CodeMirror from '@uiw/react-codemirror'; import { javascript } from '@codemirror/lang-javascript'; import { okaidia } from '@uiw/codemirror-theme-okaidia'; import { dracula } from '@uiw/codemirror-theme-dracula'; import { vscodeDark } from '@uiw/codemirror-theme-vscode'; export default function App() { return ( ); } ``` ### Creating Custom Themes ```jsx import CodeMirror from '@uiw/react-codemirror'; import { createTheme } from '@uiw/codemirror-themes'; import { javascript } from '@codemirror/lang-javascript'; import { tags as t } from '@lezer/highlight'; const myTheme = createTheme({ theme: 'light', settings: { background: '#ffffff', backgroundImage: '', foreground: '#75baff', caret: '#5d00ff', selection: '#036dd626', selectionMatch: '#036dd626', lineHighlight: '#8a91991a', gutterBackground: '#fff', gutterForeground: '#8a919966', fontFamily: 'Menlo, Monaco, "Courier New", monospace', fontSize: '14px', }, styles: [ { tag: t.comment, color: '#787b8099' }, { tag: t.variableName, color: '#0080ff' }, { tag: [t.string, t.special(t.brace)], color: '#5c6166' }, { tag: t.number, color: '#5c6166' }, { tag: t.bool, color: '#5c6166' }, { tag: t.null, color: '#5c6166' }, { tag: t.keyword, color: '#5c6166' }, { tag: t.operator, color: '#5c6166' }, { tag: t.className, color: '#5c6166' }, { tag: t.definition(t.typeName), color: '#5c6166' }, { tag: t.typeName, color: '#5c6166' }, { tag: t.angleBracket, color: '#5c6166' }, { tag: t.tagName, color: '#5c6166' }, { tag: t.attributeName, color: '#5c6166' }, ], }); export default function App() { return ( ); } ``` ## Language Support ### JavaScript/TypeScript ```jsx import CodeMirror from '@uiw/react-codemirror'; import { javascript } from '@codemirror/lang-javascript'; export default function App() { const code = `function greet(name: string): string { return \`Hello, \${name}!\`; } console.log(greet('World'));`; return ( ); } ``` ### Markdown with Syntax Highlighting ```jsx import CodeMirror from '@uiw/react-codemirror'; import { markdown, markdownLanguage } from '@codemirror/lang-markdown'; import { languages } from '@codemirror/language-data'; const code = `## Title \`\`\`jsx function Demo() { return
demo
} \`\`\` \`\`\`bash npm install @uiw/react-codemirror --save \`\`\` [visit url](https://uiwjs.github.io/react-codemirror/) \`\`\`go package main import "fmt" func main() { fmt.Println("Hello, 世界") } \`\`\` `; export default function App() { return ( ); } ``` ### Legacy Language Support ```jsx import CodeMirror from '@uiw/react-codemirror'; import { StreamLanguage } from '@codemirror/language'; import { go } from '@codemirror/legacy-modes/mode/go'; const goLang = `package main import "fmt" func main() { fmt.Println("Hello, 世界") }`; export default function App() { return ( ); } ``` ## Merge View Component ### Side-by-Side Diff Viewer ```jsx import CodeMirrorMerge from 'react-codemirror-merge'; import { EditorView } from 'codemirror'; import { EditorState } from '@codemirror/state'; const Original = CodeMirrorMerge.Original; const Modified = CodeMirrorMerge.Modified; let doc = `one two three four five`; export const Example = () => { return ( ); }; ``` ## Extensions ### Basic Setup Configuration ```jsx import CodeMirror from '@uiw/react-codemirror'; import { javascript } from '@codemirror/lang-javascript'; export default function App() { return ( ); } ``` ### Color Picker Extension ```jsx import CodeMirror from '@uiw/react-codemirror'; import { color } from '@uiw/codemirror-extensions-color'; import { css } from '@codemirror/lang-css'; export default function App() { const code = `.container { background-color: #ff5733; color: rgb(255, 255, 255); border: 1px solid rgba(0, 0, 0, 0.5); box-shadow: 0 2px 4px hsl(0deg 100% 50% / 0.1); }`; return ( ); } ``` ### Hyperlink Extension ```jsx import CodeMirror from '@uiw/react-codemirror'; import { hyperLink } from '@uiw/codemirror-extensions-hyper-link'; import { markdown } from '@codemirror/lang-markdown'; export default function App() { const code = `# Links Check out https://github.com/uiwjs/react-codemirror Visit https://codemirror.net for documentation FTP example: ftp://example.com/file.txt`; return ( ); } ``` ### DOM Events Extension ```jsx import CodeMirror from '@uiw/react-codemirror'; import { javascript } from '@codemirror/lang-javascript'; import { scroll, content, dom } from '@uiw/codemirror-extensions-events'; export default function App() { return ( { console.log('Scrolled:', event); }, }), content({ focus: (event) => { console.log('Content focused'); }, blur: (event) => { console.log('Content blurred'); }, }), dom({ mouseenter: (event) => { console.log('Mouse entered editor'); }, mouseleave: (event) => { console.log('Mouse left editor'); }, }), ]} /> ); } ``` ### Mentions Extension ```jsx import CodeMirror from '@uiw/react-codemirror'; import { mentions } from '@uiw/codemirror-extensions-mentions'; export default function App() { const mentionsList = [ { label: '@alice', type: 'text' }, { label: '@bob', type: 'text' }, { label: '@charlie', type: 'text' }, { label: '@david', type: 'text' }, ]; return ( ); } ``` ### Zebra Stripes Extension ```jsx import CodeMirror from '@uiw/react-codemirror'; import { javascript } from '@codemirror/lang-javascript'; import { zebraStripes } from '@uiw/codemirror-extensions-zebra-stripes'; const code = `function example() { console.log('Line 1'); console.log('Line 2'); console.log('Line 3'); console.log('Line 4'); console.log('Line 5'); console.log('Line 6'); console.log('Line 7'); console.log('Line 8'); }`; export default function App() { return ( ); } ``` ## Advanced Features ### State Persistence with LocalStorage ```jsx import CodeMirror from '@uiw/react-codemirror'; import { historyField } from '@codemirror/commands'; import { javascript } from '@codemirror/lang-javascript'; const stateFields = { history: historyField }; export function EditorWithPersistence() { const serializedState = localStorage.getItem('myEditorState'); const value = localStorage.getItem('myValue') || ''; return ( { localStorage.setItem('myValue', value); const state = viewUpdate.state.toJSON(stateFields); localStorage.setItem('myEditorState', JSON.stringify(state)); }} /> ); } ``` ### Editor with Ref Access ```jsx import React, { useRef, useEffect } from 'react'; import CodeMirror, { ReactCodeMirrorRef } from '@uiw/react-codemirror'; import { javascript } from '@codemirror/lang-javascript'; export default function App() { const editorRef = useRef(null); const insertText = () => { if (editorRef.current && editorRef.current.view) { const view = editorRef.current.view; const transaction = view.state.update({ changes: { from: view.state.doc.length, insert: '\n// Added via ref' }, }); view.dispatch(transaction); } }; useEffect(() => { if (editorRef.current) { console.log('Editor element:', editorRef.current.editor); console.log('Editor state:', editorRef.current.state); console.log('Editor view:', editorRef.current.view); } }, []); return (
); } ``` ### Read-only and Editable States ```jsx import React, { useState } from 'react'; import CodeMirror from '@uiw/react-codemirror'; import { javascript } from '@codemirror/lang-javascript'; export default function App() { const [readOnly, setReadOnly] = useState(false); return (
); } ``` ### Editor Statistics and Callbacks ```jsx import React, { useState } from 'react'; import CodeMirror from '@uiw/react-codemirror'; import { javascript } from '@codemirror/lang-javascript'; export default function App() { const [stats, setStats] = useState(null); const onStatistics = (data) => { setStats(data); }; const onCreateEditor = (view, state) => { console.log('Editor created:', { view, state }); }; return (
{ console.log('Changed:', value); }} /> {stats && (

Lines: {stats.lineCount}

Length: {stats.length}

Selected: {stats.selectedText ? 'Yes' : 'No'}

Selection: {stats.selectionCode}

)}
); } ``` ## Summary React CodeMirror provides a production-ready code editor solution for React applications with minimal setup. The library excels in common scenarios like code playgrounds, documentation sites, configuration editors, and IDE-like interfaces. Its pre-built themes, language support for 50+ programming languages, and battle-tested extensions make it suitable for everything from simple syntax highlighting to complex multi-pane editing experiences. The component is highly performant with lazy loading, automatic state reconciliation, and optimized re-rendering. Integration patterns follow standard React conventions with controlled/uncontrolled components, refs for imperative access, and hooks for advanced customization. The merge view component enables git-style diff visualization, while the extension system allows deep integration with CodeMirror's plugin ecosystem. State serialization enables features like undo/redo persistence, draft saving, and collaborative editing foundations. The library works seamlessly with React frameworks (Next.js, Remix, Vite) and includes TypeScript definitions for type-safe development.