块验证失败:保存函数转义的HTML内容中的‘<’

时间:2020-06-21 作者:rsborn

我有一些定制积木。每个都有一个保存函数,用于从块的属性中获取内容:

( { className, attributes } ) => (
    <div className = { className }>{ attributes.content }</div>
)
以下是content属性的配置:

attributes: {
    content: {
        source: "html",
        type: "string",
        selector: "div"
    }
}
内容是一个对象,即React组件。内容在块编辑器中按预期呈现。当我预览文章时,它会在前端按预期呈现,发布后查看时也是如此。

但当我去编辑保存的帖子时,块验证失败。错误消息显示;“保存”功能生成的内容;逃脱< 在属性的HTML内容中,而;从帖子正文检索的内容“;没有。

假设检索到的内容如下:

<div class="wp-block-example-class"><p>Example paragraph</p></div>
那么保存的内容是:

<div class="wp-block-example-class">&lt;p>Example paragraph&lt;/p></div>
我找到了这个support post 关于使用RawHTML. 因此,我尝试更改保存功能:

( { className, attributes } ) => (
    <div className = { className }>
        <RawHTML>{ renderToString( attributes.content) }</RawHTML>
    </div>
)
我得到了上述相同的结果。注意,我第一次尝试使用RawHTML 没有renderToString—也就是说,<RawHTML>{ attributes.content }</RawHTML>. 在编辑器中按预期呈现的内容,但不在前端,其中块div 包装器包含文本;“未定义”;和;空(&Q);从React组件派生的元素应该在哪里。

如果有必要,可以通过编程方式创建和插入块。简化后,流程如下:

const myContent = ( <MyComponent>{"Some content"}</MyComponent> );
const myBlock   = createBlock( "example/my-block", {  
    content: myContent 
} );

dispatch( "core/block-editor" ).insertBlock( myBlock );

我可以尝试阻止什么< 不被块的save函数转义?

1 个回复
最合适的回答,由SO网友:rsborn 整理而成

我通过将块的内容(组件)呈现为字符串并使该字符串成为RichText 我的块的保存功能中的组件。

为了使组件成为字符串,我使用renderToString:

// Create the content and the block
const myContent = ( <MyComponent>{"Some content"}</MyComponent> );
const myBlock   = createBlock( "example/my-block", {  
    content: renderToString( myContent )
} );
下面是我的块的保存功能:

( { className, attributes } ) => (
    <RichText.Content 
        tagName   = \'div\'
        className = { className }
        value     = { attributes.content }
    />
)
我尝试了这个解决方案,因为我有其他使用RichText的自定义块,这些块没有不必要的转义问题。但我不知道为什么我需要对有问题的块使用RichText。受影响块的内容是自动生成的,不包含formats, 核心或自定义。

最后一个音符。“The”;“未定义”;和;空(&Q);在使用<RawHTML>{ attributes.content }</RawHTML> 在我的块中,保存函数是由前端脚本生成的,与块编辑器无关。我的块的save函数实际上在块包装器中没有生成任何内容。

相关推荐