CKEditor 5 如何在 Next.JS 工作?
How CKEditor 5 works at Next.JS?
我有以下问题:
Unhandled Runtime Error
Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
Check the render method of Resumos
.
这些不同的解决方案都不起作用:
解决方案 1:
import dynamic from "next/dynamic";
const { CKEditor } = dynamic(
() => {
return import('@ckeditor/ckeditor5-react');
},
{ ssr: false }
);
const {ClassicEditor} = dynamic(
() => {
return import('@ckeditor/ckeditor5-build-classic');
},
{ ssr: false }
);
const Resumos = ({id}) => {
<CKEditor
editor={ ClassicEditor }
data={textoResumoAluno}
onChange={handleChangeTextoResumoAluno}
/>
}
解决方案 2:
const Resumos = ({id}) => {
const editorRef = useRef()
const [ editorLoaded, setEditorLoaded ] = useState( false )
const { CKEditor, ClassicEditor } = editorRef.current || {}
useEffect( () => {
editorRef.current = {
CKEditor: require( '@ckeditor/ckeditor5-react' ),
ClassicEditor: require( '@ckeditor/ckeditor5-build-classic' )
}
setEditorLoaded( true )
}, [] );
{editorLoaded ? (
<CKEditor
editor={ ClassicEditor }
data={textoResumoAluno}
onInit={ editor => { /*You can store the "editor" and use when it is needed.
console.log('Editor is ready to use!', editor)*/
}}
onChange={handleChangeTextoResumoAluno}
/>
) : (
<div>Editor loading</div>
)}
}
感谢@EstusFlask,它帮助我找到了解决方案!
const Resumos = () => {
const editorRef = useRef()
const [ editorLoaded, setEditorLoaded ] = useState( false )
const { CKEditor, ClassicEditor} = editorRef.current || {}
useEffect( () => {
editorRef.current = {
CKEditor: require( '@ckeditor/ckeditor5-react' ).CKEditor, //Added .CKEditor
ClassicEditor: require( '@ckeditor/ckeditor5-build-classic' ),
}
setEditorLoaded( true )
}, [] );
const [data, setData] = useState('');
return(
<>
{editorLoaded ? <CKEditor
editor={ ClassicEditor }
data={data}
onReady={ editor => {
// You can store the "editor" and use when it is needed.
console.log('Editor is ready to use!', editor);
} }
onChange={ (event, editor ) => {
const data = editor.getData()
setData(data);
} }
/> : <p>Carregando...</p>}
</>
)
}
我有以下问题:
Unhandled Runtime Error Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports. Check the render method of
Resumos
.
这些不同的解决方案都不起作用:
解决方案 1:
import dynamic from "next/dynamic";
const { CKEditor } = dynamic(
() => {
return import('@ckeditor/ckeditor5-react');
},
{ ssr: false }
);
const {ClassicEditor} = dynamic(
() => {
return import('@ckeditor/ckeditor5-build-classic');
},
{ ssr: false }
);
const Resumos = ({id}) => {
<CKEditor
editor={ ClassicEditor }
data={textoResumoAluno}
onChange={handleChangeTextoResumoAluno}
/>
}
解决方案 2:
const Resumos = ({id}) => {
const editorRef = useRef()
const [ editorLoaded, setEditorLoaded ] = useState( false )
const { CKEditor, ClassicEditor } = editorRef.current || {}
useEffect( () => {
editorRef.current = {
CKEditor: require( '@ckeditor/ckeditor5-react' ),
ClassicEditor: require( '@ckeditor/ckeditor5-build-classic' )
}
setEditorLoaded( true )
}, [] );
{editorLoaded ? (
<CKEditor
editor={ ClassicEditor }
data={textoResumoAluno}
onInit={ editor => { /*You can store the "editor" and use when it is needed.
console.log('Editor is ready to use!', editor)*/
}}
onChange={handleChangeTextoResumoAluno}
/>
) : (
<div>Editor loading</div>
)}
}
感谢@EstusFlask,它帮助我找到了解决方案!
const Resumos = () => {
const editorRef = useRef()
const [ editorLoaded, setEditorLoaded ] = useState( false )
const { CKEditor, ClassicEditor} = editorRef.current || {}
useEffect( () => {
editorRef.current = {
CKEditor: require( '@ckeditor/ckeditor5-react' ).CKEditor, //Added .CKEditor
ClassicEditor: require( '@ckeditor/ckeditor5-build-classic' ),
}
setEditorLoaded( true )
}, [] );
const [data, setData] = useState('');
return(
<>
{editorLoaded ? <CKEditor
editor={ ClassicEditor }
data={data}
onReady={ editor => {
// You can store the "editor" and use when it is needed.
console.log('Editor is ready to use!', editor);
} }
onChange={ (event, editor ) => {
const data = editor.getData()
setData(data);
} }
/> : <p>Carregando...</p>}
</>
)
}