当前位置:首页 > React

react文本标注实现

2026-01-26 11:03:22React

React 文本标注实现方法

使用 contentEditable 实现基础标注 通过设置 contentEditable 属性使元素可编辑,结合 window.getSelection() 获取选中文本范围。利用 Range API 动态包裹选中文本:

const HighlightableText = () => {
  const handleMouseUp = () => {
    const selection = window.getSelection();
    if (selection.toString().length > 0) {
      const range = selection.getRangeAt(0);
      const span = document.createElement('span');
      span.className = 'highlight';
      range.surroundContents(span);
    }
  };

  return (
    <div 
      contentEditable 
      onMouseUp={handleMouseUp}
      dangerouslySetInnerHTML={{ __html: '可编辑的文本内容' }}
    />
  );
};

使用第三方库(如 Draft.js) Draft.js 提供更完整的文本编辑与标注解决方案,支持复杂样式和实体管理:

react文本标注实现

import { Editor, EditorState, RichUtils } from 'draft-js';

const TextEditor = () => {
  const [editorState, setEditorState] = useState(EditorState.createEmpty());

  const handleKeyCommand = (command) => {
    const newState = RichUtils.handleKeyCommand(editorState, command);
    if (newState) {
      setEditorState(newState);
      return 'handled';
    }
    return 'not-handled';
  };

  const toggleHighlight = () => {
    setEditorState(RichUtils.toggleInlineStyle(editorState, 'HIGHLIGHT'));
  };

  return (
    <div>
      <button onClick={toggleHighlight}>高亮文本</button>
      <Editor
        editorState={editorState}
        handleKeyCommand={handleKeyCommand}
        onChange={setEditorState}
      />
    </div>
  );
};

实现持久化标注 结合状态管理保存标注位置信息,使用字符偏移量记录标注范围:

react文本标注实现

const persistHighlight = (text, start, end) => {
  const before = text.substring(0, start);
  const highlighted = text.substring(start, end);
  const after = text.substring(end);
  return `${before}<span class="highlight">${highlighted}</span>${after}`;
};

标注样式与交互增强 通过 CSS 自定义标注样式并添加交互事件:

.highlight {
  background-color: yellow;
  cursor: pointer;
  transition: background-color 0.3s;
}

.highlight:hover {
  background-color: orange;
}

注意事项

  • 跨浏览器兼容性需测试 SelectionRange API
  • 长文本性能优化建议使用虚拟滚动
  • 富文本场景推荐使用专业库如 Slate.js 或 TipTap
  • 服务端渲染需处理 document 未定义的情况

标签: 文本react
分享给朋友:

相关文章

react native如何启动

react native如何启动

如何启动 React Native 项目 安装 Node.js 和 npm 确保已安装 Node.js(建议版本 16 或更高)和 npm(Node.js 自带)。可通过以下命令检查版本: node…

如何生成react代码

如何生成react代码

使用 Create React App 生成项目 安装 Node.js 后,通过命令行工具运行以下命令创建新项目: npx create-react-app my-app cd my-app np…

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 运行以下命令查看项目中安装的 React 当前版本: npm list react 或 yarn list react 修…

react如何开发组件

react如何开发组件

React 组件开发基础 React 组件分为函数组件和类组件两种形式。函数组件是现代 React 开发的主流方式,结合 Hooks 可以实现完整功能。 函数组件示例: function Gr…

react如何销毁

react如何销毁

React 组件销毁的机制 在 React 中,组件的销毁通常由 React 的生命周期管理。当组件从 DOM 中移除时,React 会自动触发销毁相关的生命周期方法。以下是关键点: 组件的销毁通常…

react如何部署

react如何部署

部署 React 应用的常见方法 使用静态服务器部署 React 应用在构建后会生成静态文件,可以直接通过静态服务器部署。常用的静态服务器包括 Nginx、Apache 等。 运行构建命令生成静态…