请求将DraftJS类组件转换为React函数式组件
将DraftJS类组件转换为函数式组件
下面是转换后的完整函数式组件代码:
import React, { useState, useRef } from 'react'; import { convertFromRaw, EditorState } from 'draft-js'; import Editor, { composeDecorators } from '@draft-js-plugins/editor'; import createImagePlugin from '@draft-js-plugins/image'; import createFocusPlugin from '@draft-js-plugins/focus'; import createBlockDndPlugin from '@draft-js-plugins/drag-n-drop'; import editorStyles from './editorStyles.module.css'; const focusPlugin = createFocusPlugin(); const blockDndPlugin = createBlockDndPlugin(); const decorator = composeDecorators( focusPlugin.decorator, blockDndPlugin.decorator ); const imagePlugin = createImagePlugin({ decorator }); const plugins = [blockDndPlugin, focusPlugin, imagePlugin]; /* eslint-disable */ const initialState = { entityMap: { 0: { type: 'IMAGE', mutability: 'IMMUTABLE', data: { src: '/images/canada-landscape-small.jpg', }, }, }, blocks: [ { key: '9gm3s', text: 'You can have images in your text field which are draggable. Hover over the image press down your mouse button and drag it to another position inside the editor.', type: 'unstyled', depth: 0, inlineStyleRanges: [], entityRanges: [], data: {}, }, { key: 'ov7r', text: ' ', type: 'atomic', depth: 0, inlineStyleRanges: [], entityRanges: [ { offset: 0, length: 1, key: 0, }, ], data: {}, }, { key: 'e23a8', text: 'You can checkout the alignment tool plugin documentation to see how to build a compatible block plugin …', type: 'unstyled', depth: 0, inlineStyleRanges: [], entityRanges: [], data: {}, }, ], }; /* eslint-enable */ export default function CustomImageEditor() { const [editorState, setEditorState] = useState( EditorState.createWithContent(convertFromRaw(initialState)) ); const editorRef = useRef(null); const onChange = (newEditorState) => { setEditorState(newEditorState); }; const focus = () => { editorRef.current?.focus(); }; return ( <div> <div className={editorStyles.editor} onClick={focus}> <Editor editorState={editorState} onChange={onChange} plugins={plugins} ref={editorRef} /> </div> </div> ); }
关键转换说明
- 用
useState钩子初始化并管理editorState,替代类组件的this.state - 用
useRef钩子创建editorRef,获取编辑器DOM实例,替代类组件中通过this.editor存储实例的方式 - 将类组件的类方法
onChange和focus转换为函数组件内部的普通函数 - 编辑器的
ref直接绑定到editorRef,简化实例获取逻辑
内容的提问来源于stack exchange,提问作者Huzaifa Khalid
相关产品推荐
相关产品推荐

