如何使用 contenteditable 元素存储状态变化?

How to store changes in state using contenteditable element?

如何使用 contenteditable 元素存储状态变化?

此代码很好地存储了它,但光标更改为元素的开头。

我必须对光标位置进行编码还是有简单的解决方案?

不,我不会使用表单元素。

import React, { useState } from 'react';

const About = () => {
    const [text, setText] = useState('Hallo');

    return (
        <div className="about">
            <h2>About</h2>
            <div className="title column m-0"
                contentEditable={true}
                suppressContentEditableWarning={true}
                onInput={(e) => { setText(e.target.innerHTML) }}
                onBlur={(e) => { setText(e.target.innerHTML) }}
                dangerouslySetInnerHTML={{ __html: text }}
            ></div>
        </div >
    )
}

export default About;

如果您只想存储更改而不想要 受控 组件,您可以使用 onInput 道具。它会将更改后的文本存储到您的状态中。

 <div
    contentEditable={true}
    suppressContentEditableWarning={true}
    onInput={e => setText(e.currentTarget.textContent)}
 ></div>

P.S:光标失去焦点的原因是,当您 dangerouslySetInnerHTML 时,您基本上是在重新装载 div 中的所有数据,包括光标位置。这就是不推荐以这种方式设置HTML的原因之一。