【发布时间】:2022-01-15 13:30:42
【问题描述】:
import React, { useEffect, useState } from "react";
import "./styles.css";
const RichText = () => {
const [value, setValue] = useState("");
useEffect(() => {
const div = document.getElementById("textarea");
if (div) {
setTimeout(() => {
div.focus();
}, 0);
}
});
return (
<div
className="rich-text"
onInput={(e) => {
setValue(e.target.innerText);
}}
contentEditable
id="textarea"
dangerouslySetInnerHTML={{
__html: value
}}
/>
);
};
export default RichText;
我想实现富文本组件,想法是你可以在某个字段内输入文本,你可以设置文本的样式(使其变为粗体、斜体、下划线等)。我想在 value 状态变量上使用相同的文本值,然后以某种方式将其包装在 html 标签 <p>Hello <b> Andrew</b></p> 内,并在同一个字段中实时显示,样式化。为了在 div , contentEditable 字段内显示 html 标签,我需要使用 dangerouslySetInnerHTML ,这是主要问题。每次按下按钮时,我都会更新值,然后重新渲染组件,焦点位于字段的开头,但我希望它在您输入新文本时结束。我试图通过ref => ref.current.focus() 来实现它,它不起作用,在上面的代码中你可以看到我也尝试通过 vanilla js 使用 timeout 来实现它,它也不起作用, autoFocus - 只能在 input, textarea, etc 上使用,div 可以与此属性一起使用。我已将其保存到 ref ,但是我无法在 div 内显示包装好的 html。尝试了很多案例,但似乎都是。有什么制作方法吗?
【问题讨论】:
-
我知道您尝试使用 ref 但底部有一些示例:github.com/lovasoa/react-contenteditable
-
@AlonShmiel 我不想使用任何库,我想自己制作,这样我就可以使用github.com/zenoamaro/react-quill)
标签: javascript reactjs richtext