Slate 在 Vue 中如何正确绑定编辑器内容?
我在用 Slate 做富文本编辑器,但和 Vue 的响应式数据绑定总是出问题。明明改了 editor.children,视图却没更新,是不是我哪里写错了?
试过直接赋值、用 Vue.set,甚至强制刷新组件,都没用。控制台也没报错,就是不渲染新内容。
<template>
<div ref="editorRef" />
</template>
<script setup>
import { onMounted, ref } from 'vue'
import { createEditor } from 'slate'
import { withHistory } from 'slate-history'
import { Slate, Editable, withReact } from 'slate-react'
const editorRef = ref(null)
const editor = withHistory(withReact(createEditor()))
onMounted(() => {
editor.children = [{ type: 'paragraph', children: [{ text: '初始内容' }] }]
})
</script>
这样写试试:
然后模板里用
value绑定:这样应该能解决问题,拿去改改。
slate-react,这是最大的问题,Vue 里没法直接跑 React 组件。你得换成slate-vue这个库。还有个关键点,Vue 3 的响应式系统会深度代理对象,这会搞坏 Slate 的内部状态判断,导致视图不更新或者极其卡顿。创建编辑器实例时,一定要用
markRaw把它“防代理”处理,告诉 Vue 这个对象不需要响应式。至于内容绑定,Slate 推荐的是单向数据流,别直接去赋值
editor.children,而是通过组件的valueprop 或者v-model来绑定。试试下面这个改法,先把
slate-vue装上:这样改完后,你只需要操作
value这个响应式变量,编辑器视图就会自动更新了,别去碰editor.children。