Draft.js自定义块渲染时样式丢失怎么办?
在用Draft.js自定义块渲染器时,给代码块添加的CSS样式完全没生效,页面上还是默认的样式。已经按照文档写了blockRendererFn:
const blockRenderer = (block) => {
if (block.getType() === 'atomic') {
return {
component: MyComponent,
props: { className: 'code-block' }
};
}
};
对应的CSS类明明写在全局样式表里了:
.code-block {
background: #2d2d2d;
color: #fff;
padding: 1em;
}
控制台没有报错,但代码块还是普通文本样式。尝试过把className直接写到组件属性里也不行,是不是blockProps传递方式有问题?
试试这样改:
关键点:
1. 必须设置editable参数,否则props会被忽略
2. 记得返回null给其他类型的block
3. 你的MyComponent需要接收并应用这个className
然后在你的组件里这样写:
顺便吐槽下,Draft.js的API设计有时候真的不够直观,这个editable参数我第一次用也栽了跟头。
你现在写的是把 className 放在 props 里,但如果你的 MyComponent 没有把这个 props.className 应用到根元素上,样式当然不会生效。
解决办法很简单:优化一下你的自定义组件,确保它把接收到的 blockProps 渲染下去。
同时,确认你的 blockRendererFn 写对了:
最关键的一点:别指望 Draft.js 自动帮你挂 className,它只负责把 component 和 props 传进去,怎么用是你的事。我之前也踩过这坑,样式死活不生效,结果发现根本没渲染到 DOM 上。
另外检查一下你的 CSS 是否被后续样式覆盖,建议加上作用域或者用更具体的类名。如果用了 CSS-in-JS 或模块化,那就得用全局类名处理,比如 :global(.code-block)。