-
Notifications
You must be signed in to change notification settings - Fork 3
json‐editor for react
redgoose.eth edited this page Aug 28, 2023
·
2 revisions
JSON Editor
에디터를 react 컴포넌트로 만들어서 사용할 수 있습니다.
에디터를 react 컴포넌트로 감싸서 사용하여 기능을 이용합니다.
json-editor.jsx
import { useEffect, useRef } from 'react'
import JsonEditor from '@redgoose/json-editor'
import '@redgoose/json-editor/css'
let jsonEditor
function JsonEditorComponent(props)
{
const { src, theme, live, onInit, onUpdate, onContext } = props
const $jsonEditor = useRef(null)
function onUpdateEditor({ detail })
{
onUpdate(detail)
}
function onContextEditor({ detail })
{
onContext(detail)
}
// mounted
useEffect(() => {
jsonEditor = new JsonEditor($jsonEditor.current, {
theme,
live,
})
$jsonEditor.current.addEventListener('update', onUpdateEditor)
$jsonEditor.current.addEventListener('context', onContextEditor)
jsonEditor.replace(src, false)
onInit(jsonEditor)
return () => {
$jsonEditor.current.removeEventListener('update', onUpdateEditor)
$jsonEditor.current.removeEventListener('context', onContextEditor)
jsonEditor.destroy()
$jsonEditor.current.innerHTML = ''
}
}, []);
// change props
useEffect(() => {
jsonEditor.options.theme = theme
jsonEditor.options.live = live
}, [ theme, live ])
return (
<div ref={$jsonEditor}></div>
)
}
export default JsonEditorComponent
먼저 이렇게 jsx 파일을 작성하여 보관해 둡니다. 이 컴포넌트 파일을 사용하여 에디터로 쓰게 될것입니다.
먼저 패키지를 설치합니다.
npm install @redgoose/json-editor
패키지를 설치한 후에 만들어뒀던 래퍼 react 컴포넌트를 불러와서 사용합니다.
import JsonEditor from './JsonEditor.jsx'
function Demo() {
return (<JsonEditor/>)
}
-
src
: 데이터 값 (마운트 하는 시점에만 에디터에 적용됩니다!) -
theme
: 다크모드에 대한 값 -
live
: 데이터가 업데이트 될때마다 update이벤트를 실행할지에 대한 여부
컴포넌트 소스코드에서 메서드를 추가하여 기능을 확장시키거나 jsonEditor 인스턴스 값으로 에디터를 직접 조작할 수 있습니다.
에디터 컴포넌트를 시작할때 호출되는 이벤트. 에디터 인스턴스를 가져올 수 있습니다.
function Demo()
{
function onInitJsonEditor()
{
const jsonEditor = instance
}
return (<JsonEditor onInit={onInitJsonEditor}/>)
}
import { useState } from 'react'
function Demo()
{
const [ data, setData ] = useState({})
function onUpdateJsonEditor(src)
{
setData(data)
}
return (<JsonEditor onUpdate={onUpdateJsonEditor}/>)
}
function Demo()
{
function onContextJsonEditor(e)
{
const { body, node, type, isRoot, $ } = e
}
return (<JsonEditor onContext={onContextJsonEditor}/>)
}
마지막으로 테스트로 작성한 컴포넌트를 불러오는 데모와 프로젝트를 남겨둡니다.
import { useState } from 'react'
import JsonEditor from './JsonEditor.jsx'
let jsonEditor
function App()
{
const [ theme, setTheme ] = useState('light')
const [ src, setSrc ] = useState({ foo: 'bar' })
function onInitJsonEditor(instance)
{
jsonEditor = instance
}
function onUpdateJsonEditor(src)
{
setSrc(src)
}
function onContextJsonEditor(e)
{
const { body, node, type, isRoot, $ } = e
// console.log('onContextJsonEditor', type)
}
function onClickExport()
{
const data = jsonEditor.export()
console.warn('EXPORT =>', data)
}
function onClickChangeTheme()
{
setTheme(theme === 'dark' ? 'light' : 'dark')
}
return (
<article className="app">
<header className="header">
<h1>json-editor for react</h1>
<p>demo page</p>
</header>
<div className="demo">
<div className={[
'editor',
theme === 'dark' && 'editor--dark',
].filter(Boolean).join(' ')}>
<JsonEditor
src={src}
theme={theme}
live={true}
onInit={onInitJsonEditor}
onUpdate={onUpdateJsonEditor}
onContext={onContextJsonEditor}/>
</div>
<div className="preview">
<pre>{JSON.stringify(src, null, 2)}</pre>
</div>
</div>
<nav className="controller">
<button type="button" onClick={onClickChangeTheme}>
Change Theme
</button>
<button type="button" onClick={onClickExport}>
Export
</button>
</nav>
</article>
)
}
export default App