You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Draft Wysiwyg 如何实现点击图片全屏展开功能?

实现方案

你不需要修改现有通过createEntity+AtomicBlockUtils插入图片的逻辑,只需要在自定义原子块渲染的环节添加点击事件即可,具体分为两种实现路径:

路径1:自定义图片块渲染组件(推荐,可控性最高)

步骤1:编写自定义图片块组件

给渲染的img标签直接绑定onClick事件,写入你的全屏展示逻辑:

const CustomImageBlock = (props) => {
  const { contentState, block } = props;
  // 读取你插入图片时存在entity里的图片信息
  const entity = contentState.getEntity(block.getEntityAt(0));
  const { src, alt } = entity.getData();

  const handleImgClick = () => {
    // 此处替换为你的全屏显示逻辑,比如唤起全屏弹窗、传入当前图片地址
    console.log("点击的图片地址:", src);
  };

  return (
    <img
      src={src}
      alt={alt || "图片"}
      onClick={handleImgClick}
      style={{ maxWidth: "100%", cursor: "pointer" }}
    />
  );
};

步骤2:给编辑器配置块渲染规则

在Editor组件的blockRendererFn属性中,匹配你插入的图片类型原子块,用上面的自定义组件渲染:

import { Editor } from "react-draft-wysiwyg";

<Editor
  editorState={editorState}
  onEditorStateChange={setEditorState}
  blockRendererFn={(block) => {
    if (block.getType() === "atomic") {
      const contentState = editorState.getCurrentContent();
      const entityKey = block.getEntityAt(0);
      if (entityKey) {
        const entity = contentState.getEntity(entityKey);
        // 此处的类型要和你创建图片entity时传入的type完全一致,示例为'IMAGE'
        if (entity.getType() === "IMAGE") {
          return {
            component: CustomImageBlock,
            editable: false
          };
        }
      }
    }
    return null;
  }}
/>

你原有插入图片的逻辑不需要修改,只要保证创建entity时的类型和上面的判断匹配即可,比如原有插入逻辑示例:

// 原有插入逻辑无需改动
const contentState = editorState.getCurrentContent();
const contentWithImgEntity = contentState.createEntity(
  "IMAGE", // 对应上面的类型判断
  "IMMUTABLE",
  { src: 你的图片地址, alt: 图片描述 }
);
const entityKey = contentWithImgEntity.getLastCreatedEntityKey();
const newEditorState = AtomicBlockUtils.insertAtomicBlock(editorState, entityKey, " ");
setEditorState(newEditorState);

路径2:事件委托实现(更简单,适合轻量场景)

不需要修改编辑器内部配置,直接给编辑器的外层容器绑定点击事件,判断点击目标是否为图片即可:

const handleContainerClick = (e) => {
  if (e.target.tagName.toLowerCase() === "img") {
    const imgSrc = e.target.src;
    // 写入你的全屏显示逻辑
  }
};

// 外层容器绑定事件
<div onClick={handleContainerClick}>
  <Editor
    editorState={editorState}
    onEditorStateChange={setEditorState}
  />
</div>

注意该方案会捕获编辑器内所有图片的点击事件,如果编辑器内有其他非内容图片可能会误触发。

内容的提问来源于stack exchange,提问作者user13990170

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:36:03