tinymce变化后onchange光标变化问题(React)

关于tinymce富文内容变化后,光标会自动跳到最前面的问题。比如回车、复制粘贴,都会跳到最前面。

由于我是ant design pro包了一层,它给分配的value和onchange,不用的话,确实也不会有这问题,但那样form提交表单时,虽然编辑器里已经变化,但获取不到变化值。

于是我开始搜这问题的解决方式,很多人都是直接定位到最尾部,用:

editor.selection.select(editor.getBody(),true);
editor.selection.collapse(false);

但这样的体验很不好,于是我又找到一个方法,让它定位到最后编辑的位置:

 {
        const target = e.target;
        // 获取光标最后的位置
        const p = target.selection.getBookmark(2);
        onChange(target.getContent());
        setTimeout(() => {
          // 定位最后的位置
          target.selection.moveToBookmark(p);
        }, 1);
      }}
      init={{
        base_url: "/tinymce/",//告知tinymce,所有插件、主题走我这个入口
        language: "zh-Hans",//设置中文语言
        language_url: "/tinymce/langs/zh-Hans.js",//中文语言引入地址
        height: 500,
        menubar: false,
        statusbar: false,
        plugins: ['code', 'image'],
        toolbar: ['formatselect fontfamily fontsize | bold italic backcolor | undo redo',
          'alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | image | removeformat code'],
        font_family_formats: '微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;',
        content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:14px }',
        images_upload_handler: example_image_upload_handler,
      }}
    />

但这样又会出现新问题……就是编辑几个字之后,再点击一下才会触发onchange,也就是说点到别的地方光标会先跳回来一次,再点击一次才正常……

最后想了想它为什么会这么跳的原理,是因为onchange之后,改变了value值,导致组件又重新渲染了内容,所以只要value值不变,其实就不会有这问题。

于是只要简单加一个钩子:const [init] = useState(value);

把init替代value传到initialValue={value},就完美解决问题了!

你可能感兴趣的:(react.js,前端,前端框架)