react经验13:使用非react封装的富文本组件

应用场景

已知开源社区已经有react封装的富文本组件,一般的文本编辑需求足够满足,但是当有特殊需求无法满足时,可能需要用到非react封装的富文本组件。
当使用非react封装的富文本编辑器时,react组件内的state与编辑器的内容交换有点小毛病,本经验给出解决思路。

实施过程

这里以代码编辑组件"ace"为例。

npm i ace-builds

定义编辑器的容器

<div ref={setDom_editor_main}/>
const [dom_editor_main, setDom_editor_main] = useState<HTMLElement | null>()

定义内容交换的state

const [content,setContent]=useState('')
const [codeEditor, setCodeEditor] = useState<ace.Ace.Editor>()
function handleEditorValueChange() {
    if (codeEditor) {
        const val = codeEditor.getValue()
        if (content!== val) {
            setContent(val)
        }
    }
}

初始化编辑器

const otherState = useRef({
    isInit: true//标识页面首次载入
})
useEffect(() => {//赋值给编辑器
    if (otherState.current.isInit && codeEditor) {
    	codeEditor?.off('change', handleEditorValueChange)
        codeEditor?.on('change', handleEditorValueChange)//绑定事件
        codeEditor.setValue(content)
        otherState.current.isInit = false
    }
}, [codeEditor, content])
//编辑器初始化
useEffect(() => {
    if (!dom_editor_main) {
        return
    }
    const editor = ace.edit(dom_editor_main)
    editor.session.setMode('ace/mode/sql')
    editor.setTheme('ace/theme/github')
    editor.setOptions({
        enableBasicAutocompletion: true,
        enableLiveAutocompletion: true,
        showPrintMargin: false,
        wrap: 120
    })
    setCodeEditor(editor)
}, [dom_editor_main])
useEffect(() => {
    return () => {//销毁编辑器
        codeEditor?.off('change', handleEditorValueChange)
        codeEditor?.destroy()
    }
}, [])

当页面有初始化加载数据时

async function loadData(id:string){
	//示范从API读取数据
	const data=await api_loadData(id)
	//赋值给编辑器
	setContent(data)
}
//假设你的组件接受id属性用来加载数据
useEffect(()=>{
	if(props.id){
		otherState.current.isInit = true
		loadData(props.id)
	}
},[props.id])

由于编辑器通过change事件传值给content,那么保存时可以直接取content或者调用编辑器的getValue

相关推荐

  1. react经验13使用react文本组件

    2024-04-24 13:34:02       15 阅读
  2. react经验15:拖拽排序组件dnd-kit使用经验

    2024-04-24 13:34:02       9 阅读
  3. Taro(React使用文本编辑器Editor

    2024-04-24 13:34:02       7 阅读
  4. React文本编辑器wangEditor

    2024-04-24 13:34:02       39 阅读
  5. react经验10:与jquery配合使用

    2024-04-24 13:34:02       29 阅读
  6. react-draft-wysiwyg文本编辑器使用常见问题解答

    2024-04-24 13:34:02       11 阅读
  7. react经验14:动态修改第三方组件样式

    2024-04-24 13:34:02       15 阅读
  8. charts使用 vue2

    2024-04-24 13:34:02       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-24 13:34:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-24 13:34:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-24 13:34:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-24 13:34:02       20 阅读

热门阅读

  1. 让php开发更优雅-ThinkPHP篇

    2024-04-24 13:34:02       15 阅读
  2. 传感器在机械自动化中的应用有哪些?

    2024-04-24 13:34:02       11 阅读
  3. SQL查询

    SQL查询

    2024-04-24 13:34:02      14 阅读
  4. 第三方 app 登录微信

    2024-04-24 13:34:02       18 阅读
  5. 第12天 static final

    2024-04-24 13:34:02       13 阅读
  6. vue3 -- 基于maptalks和threejs实现3D地图板块效果

    2024-04-24 13:34:02       11 阅读
  7. HTML 基础知识及面试题

    2024-04-24 13:34:02       15 阅读
  8. (一)Mysql创建一个博客相关的数据库

    2024-04-24 13:34:02       15 阅读
  9. springboot项目打war包,并且部署外部tomcat中

    2024-04-24 13:34:02       19 阅读