来自 JSON 的古腾堡块渲染

Gutenberg Block Rendering from JSON

我正在尝试通过插件制作自定义古腾堡块。一切都很顺利,唯一的问题是当我从块菜单中 select 我的块时,它只是将 JSON 粘贴在前面。我更想要的是渲染这个 JSON 来制作方块。

我正在从 API 中获取块的内容。我也附上了我的代码。

function makeBlock(block, category){
    var jsonBlock = {
        "__file": "wp_export",
        "version": 2,
        "content": ""}
        ;
    $.ajax({
        type: "POST",
        url: document.location.origin+"/blocknets/wp-admin/admin-ajax.php",
        data: { 
            'action': 'makeBlocks',
            'id': block.id
        },
        dataType: "json",
        encode: true,
    }).done(function (resp) {
        // console.log(resp);
        jsonBlock.content = resp.data.content;
    });




    ( function ( blocks, element, data, blockEditor ) {
        var el = element.createElement,
            registerBlockType = blocks.registerBlockType,
            useSelect = data.useSelect,
            useBlockProps = blockEditor.useBlockProps;
    //  debugger;
        registerBlockType( 'custom-blocks/'+category+'-'+block.id, {
            apiVersion: 2,
            title: block.name,
            icon: 'megaphone',
            category: category,
            edit: ()=>{return jsonBlock.content},
            save: () => null
        } );
    } )(
        window.wp.blocks,
        window.wp.element,
        window.wp.data,
        window.wp.blockEditor
    );
}

紫色突出显示的是我的插件,黄色是它打印出来的内容。

我更想渲染这个 JSON。如果我只是将此 JSON 粘贴到代码编辑器中,它将如下所示。

谁能帮帮我?

编辑器视图中显示的jsonBlock.content是序列化的块内容。第一步是使用 React 中常见的 parse() to transform the content into valid blocks. Next, to render the blocks I found RawHTML can be used to render innerHTML from the block content. The <RawHTML/> component uses dangerouslySetInnerHTML 来渲染内部 HTML 内容。例如:

编辑()

const { parse } = wp.blockSerializationDefaultParser;
const { RawHTML } = wp.element;

export default function Edit({ attributes, setAttributes }) {

    // Example of serialized block content to mimic resp.data.content data
    var content = "<!-- wp:paragraph --><p>paragraph one</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>then two</p><!-- /wp:paragraph -->";

    // Parse the serialized content into valid blocks using parse from @wordpress/block-serialization-default-parser
    var blocks = parse(content);

    // Iterate over each block to render innerHTML within RawHTML that sets up dangerouslySetInnerHTML for you..
    return blocks.map((block, index) => <RawHTML key={index}>{block.innerHTML}</RawHTML>);
}

铌。该示例包括在编辑器中解析和显示块内容,它不包括保存内容,因为您现有的 save() 函数设置为 null。

我能够使用以下编辑功能渲染所有块:

    edit: ()=>{
      window.wp.data.dispatch( 'core/block-editor' ).insertBlocks( window.wp.blocks.parse( jsonBlock.content));
      return null;
    }