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

如何调试react-contenteditable报错:期望字符串却得到复合对象

React + Craft.js 使用 react-contenteditable 报错:Element type is invalid

问题描述

跟着craft.js基础教程创建带可编辑内容的Text元素,教程采用react-contenteditable npm包实现该功能,但项目中使用时持续抛出无法调试的错误。

代码示例

import React from "react";
import {Editor, Frame, Element, useNode } from "@craftjs/core";
import { Button } from "@/components/ui/button";
import { Slider } from "@/components/ui/slider";
import { Switch } from "@/components/ui/switch";
import ContentEditable from 'react-contenteditable'
import { cn } from "@/lib/utils";

export const Text = ({ text, fontSize, textAlign }: any) => {
    const {
        connectors: { connect, drag },
        actions: { setProp },
    } = useNode();
    return (
        <div ref={(ref: any) => connect(drag(ref))}>
            <ContentEditable
                html={text}
                onChange={(e) =>
                    setProp(
                        (props: any) =>
                            (props.text = e.target.value.replace(
                                /<\/?[^>]+(>|$)/g,
                                "",
                            )),
                    )
                }
                tagName="p"
                className={`text-[${fontSize}px]`}
            />
        </div>
    );
};


export const Container = ({ background, padding = 0, children }: any) => {
    const {
        connectors: { connect, drag },
    } = useNode();
    return (
        <div
            style={{ margin: "5px 0", background, padding: `${padding}px` }}
            ref={(ref: any) => connect(drag(ref))}
        >
            {children}
        </div>
    );
};

export default function Craft() {
    return (
        <div className="h-screen w-screen">
            <div className="grid h-full w-full grid-flow-col grid-cols-5 grid-rows-[10rem_1fr] items-start justify-start">
                <Editor resolver={{ Text, Container }}>
                    <div className="col-span-4 row-start-2 h-full w-full bg-secondary">
                        <Frame>
                            <Element
                                is={Container}
                                padding={5}
                                background="#eee"
                                canvas
                            >
                                <Text size="small" text="Hi world!" />
                            </Element>
                        </Frame>
                    </div>
                </Editor>
            </div>
        </div>
    );
}

错误信息

警告及错误均指向Text组件div内首次使用<ContentEditable>组件的行:

警告:React.jsx: 类型无效——预期是字符串(对应内置组件)或类/函数(对应复合组件),但实际得到:object。
错误:元素类型无效:预期是字符串(对应内置组件)或类/函数(对应复合组件),但实际得到:object。

解决方案

  • 修正导入方式:react-contenteditable v3及以上版本采用命名导出而非默认导出,将导入语句改为:
    import { ContentEditable } from 'react-contenteditable'
    
  • 确认依赖安装:确保已正确安装包,执行命令:
    npm install react-contenteditable
    # 或
    yarn add react-contenteditable
    
  • 检查版本兼容性:确认craft.js和react-contenteditable的React版本要求一致,避免版本冲突导致的导出异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:40:22