You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么不能直接给SunEditor组件传Props?总是显示上一次渲染的旧数据

问题原因

  • 第一段代码同时使用了两种赋值方式,触发时机不一致导致数据冲突:你既给<SunEditor>组件传递了setContents={postContent}属性,又在useEffect中调用编辑器实例的core.setContents方法赋值,两种赋值逻辑的执行时机不同步,就会出现新旧内容覆盖异常,残留陈旧数据。
  • 编辑器实例初始化时机滞后:getSunEditorInstance拿到编辑器核心实例的时间晚于组件首次渲染,首次触发postContent对应的useEffect时,editor.current大概率还是未赋值的状态,这次赋值操作会直接失效,编辑器就会保留初始的旧内容。

为什么中间加一层state就能正常运行

  • 新增本地state相当于做了一层更新缓冲:postContent更新后先同步到本地content state,等state更新触发第二次渲染和对应的useEffect时,编辑器实例大概率已经初始化完成,调用setContents就不会失效。
  • 两种赋值路径的数据源统一为本地state:组件prop传的setContents和实例方法赋值都用同一个content值,更新时机对齐,不会出现新旧值冲突的问题。

更简洁的优化方案

其实不需要额外新增本地state,只要避免同时使用两种赋值逻辑即可:

const SunEditorForRendering: React.FC<Props> = ({postContent }) => {
  const [content, setContent] = useState("hello world");

  const handleOnChange = (value) => {
    setContent(value)
  }

  return <SunEditor
    setContents={postContent ?? content}
    onChange={handleOnChange}
  />
}

只通过组件setContents属性传值即可,不需要额外获取实例调用方法,也不需要多一层state中转,就能避免陈旧数据问题。


内容的提问来源于stack exchange,提问作者user82554

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:36:04