当前位置:首页 > 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 提供更完整的文本编辑与标注解决方案,支持复杂样式和实体管理:

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>
  );
};

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

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;
}

注意事项

react文本标注实现

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

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

相关文章

如何学习react

如何学习react

学习 React 的步骤 理解基础概念 React 是一个用于构建用户界面的 JavaScript 库。学习 React 之前,建议掌握 JavaScript 的基础知识,包括 ES6+ 语法(如箭头…

elementui文本

elementui文本

ElementUI 文本组件 ElementUI 提供了多种文本相关的组件,用于展示和处理文本内容。以下是一些常用的文本组件及其用法: 文本展示组件 el-text 用于展示普通文本,支持自定义样式…

react如何减少setState

react如何减少setState

减少 React 中 setState 调用的方法 合并多次状态更新 使用函数式更新方式合并多次 setState 调用。React 会将多次状态更新批量处理,避免不必要的重新渲染。 // 非函…

react elementUI

react elementUI

React 和 Element UI 是两个不同的技术栈,但可以通过整合实现类似功能。以下是相关解决方案和替代方案: React 与 Element UI 的替代方案 Element UI 是为 V…

如何封装表单react

如何封装表单react

封装 React 表单的方法 封装 React 表单可以通过创建可复用的表单组件或自定义 Hook 来实现。以下是几种常见的方法: 使用受控组件封装表单 通过状态管理表单数据,将表单字段的值与 Re…

react如何设置input

react如何设置input

设置 React 中的 Input 元素 在 React 中设置 input 元素可以通过多种方式实现,包括受控组件、非受控组件以及使用第三方库。以下是几种常见的方法: 受控组件方式 受控组件通过…