javascript - Como implementar um editor de texto rico como Quill ou Draft.js com Next.js?
Tenho uma grande aplicação que estou construindo com Next.js para fins de SEO e desempenho, e há uma parte super interativa dessa aplicação que precisa de um Editor de Texto (como Quill.js ou Draft.js) onde os dados nele são sincronizados entre dois usuários usando Socket.io.
O problema é que não consigo fazer um editor de texto funcionar com Next.js.
Quando eu importo o Quill, ele diz 'Document não definido' porque não há documento no servidor. Com o Draft.js, ele simplesmente não renderiza nada, mas não há erros.
Aqui está meu código para Draft.js:
import { EditorState, convertToRaw, convertFromRaw } from 'draft-js'
class TextEditor extends Component {
constructor(props) {
super(props);
this.state = {
editorState: EditorState.createWithContent(convertFromRaw(props.contentState))
}
}
static async getInitialProps ({ query, req }) {
return { contentState: convertToRaw(EditorState.createEmpty().getCurrentContent()) }
}
render() {
console.log('init',this.props.editorState);
return (
<div>
<h1>Test Editor</h1>
<Editor
editorState={ this.props.editorState }
/>
</div>
);
}
}
Alguma ajuda?
Resposta #1
Use o sun editor. Este é realmente flexível e compatível com nextjs. https://www.npmjs.com/package/suneditor-react npm i suneditor suneditor-react
import dynamic from "next/dynamic";
import 'suneditor/dist/css/suneditor.min.css'; // Import Sun Editor's CSS File to the _app.js
const SunEditor = dynamic(() => import("suneditor-react"), { //besure to import dynamically
ssr: false,
});
const MyComponent = props => {
return (
<div>
<p> My Other Contents </p>
<SunEditor />
</div>
);
};
export default MyComponent;<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>Resposta #2
Aqui está meu componente simples funcionando com NextJS e React Hook Form
import React, { useEffect } from "react";
import { Editor, EditorState, ContentState, convertFromRaw } from "draft-js";
import "draft-js/dist/Draft.css";
export { EditorState, ContentState };
interface PropTypes {
name?: string;
value?: string;
onChange?: Function;
}
// Trick to fix issue with NextJS https://github.com/facebook/draft-js/blob/master/examples/draft-0-10-0/universal/editor.js
const emptyContentState = convertFromRaw({
entityMap: {},
blocks: [
{
text: "",
key: "foo",
type: "unstyled",
entityRanges: [],
},
],
});
function RichTextEditor({ name, value, onChange }: PropTypes) {
const [editorState, setEditorState] = React.useState(
EditorState.createWithContent(emptyContentState)
);
useEffect(() => {
setEditorState(
EditorState.createWithContent(ContentState.createFromText(value))
);
}, []);
return (
<Editor
editorKey={name}
editorState={editorState}
onChange={(editorState) => {
setEditorState(editorState);
onChange(editorState.getCurrentContent().getPlainText());
}}
userSelect="none"
contentEditable={false}
/>
);
}
export default RichTextEditor;
<Controller
as={RichTextEditor}
name="description"
control={control}
defaultValue=""
/>
