新建富文本编辑器,并编写save方法如下:
edit方法:
js
export default function Edit({ attributes, setAttributes }) {
return (
<>
<div { ...useBlockProps() }>
<RichText
tagName='p'
onChange={ (value) => setAttributes({ noteContent: value })}
value={attributes.noteContent}
placeholder='输入你的内容...'
>
</RichText>
<div>自定义的按钮</div>
</div>
</>
);
}
save方法:
js
import { useBlockProps } from '@wordpress/block-editor';
export default function save({ attributes }) {
const { noteContent } = attributes;
return (
<div { ...useBlockProps.save() }>
{ noteContent }
</div>
);
}
看上去很好理解,将RichText标签解析成div,将内容保存在div内部。
报错
此时保存刷新:

报错内容:
text
区块包含未预料的或无效的内容。
此时打开控制台能够看到报错的log:
text
Content generated by `save` function:
<div class="wp-block-ht-ht-note"><div class="wp-block-ht-ht-note">测试</div></div>
Content retrieved from post body:
<div class="wp-block-ht-ht-note">测试</div>
现象
出现这种报错通常原因是save方法和edit方法结果没有对上。本来是一个挺常见的bug。通常需要简单修改一下就能正常使用了。
但这次有些不太一样。仔细观察报错日志:
text
save()方法保存的内容:
<div class="wp-block-ht-ht-note">
<div class="wp-block-ht-ht-note">
测试
</div>
</div>
edit()方法保存的内容:
<div class="wp-block-ht-ht-note">
测试
</div>
也就是save()方法保存了两次{ ...useBlockProps() }
原因
保存了两次,我们要搞清楚是从哪里来的。
第一次的div
这个很好理解,毕竟save方法使用了<div { ...useBlockProps.save() }>
。使用这种方式就会解析成<div class="wp-block-ht-ht-note">
第二次的div
剩下的那也就能正常推断出来了:除了save方法使用的,就只可能是{noteContent}
中本身的内容了。通过<div class="wp-block-ht-ht-note"><div class="wp-block-ht-ht-note">测试</div></div>
的转义内容也能够推断出,{noteContent}
是包含着一个<div class="wp-block-ht-ht-note">
的
解决方案
知道原因就好解决了,既然保存时就带上了,那save()
方法就不需要再添加一次了。
修改save()
方法:
js
export default function save({ attributes }) {
const { noteContent } = attributes;
return (
<>
{ noteContent }
</>
);
}
保存刷新,解决。