当前位置:首页 > 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 native

如何评价react native

React Native 的优势 跨平台开发效率高:基于 JavaScript 和 React 语法,可同时开发 iOS 和 Android 应用,减少重复代码量。性能接近原生:通过原生组件渲染,性能…

react 如何执行

react 如何执行

安装 Node.js 和 npm React 开发需要 Node.js 环境,因为它提供了 npm(或 yarn)包管理工具。从 Node.js 官网 下载并安装最新 LTS 版本。安装完成后,在终端…

react 如何debug

react 如何debug

React 调试方法 使用 React Developer Tools React Developer Tools 是浏览器扩展,支持 Chrome 和 Firefox。安装后,可以在开发者工具中查看…

如何监控react性能

如何监控react性能

使用 React Profiler API React 16.5 及以上版本内置了 Profiler API,可直接测量组件渲染时间。通过 <React.Profiler> 包裹目标组件,…

react路由如何配置

react路由如何配置

React 路由配置方法 安装 React Router 使用 npm 或 yarn 安装 React Router 的 DOM 版本: npm install react-router-dom #…

react项目如何启动

react项目如何启动

启动React项目的步骤 确保已安装Node.js(建议版本12以上)和npm/yarn。可通过以下命令检查版本: node -v npm -v 全局安装create-react-app脚手架工具(…