古腾堡区块:如何确定当前内部区块的索引?

时间:2021-12-31 作者:user3058763

我正在尝试将bootstrap5 carousel组件实现为Gutenberg块。它似乎都在按预期工作,除了添加;“活动”;类设置为第一个元素。

我试图通过使用getBlockParentsgetBlocksByClientId以下是JS代码:

    const select = window.wp.data.select(\'core/block-editor\');

    blocks.registerBlockType(\'natural/bootstrap5-carousel-item\', {
        apiVersion: 2,
        title: __(\'Carousel Item\'),
        icon: \'format-gallery\',
        category: \'design\',
        parent: [\'natural/bootstrap5-carousel\'],
        example: {},
        edit: function () {
            return el(
                \'div\',
                useBlockProps({
                    style: {
                        padding: \'20px\',
                        border: \'2px solid #000\'
                    }
                }),
                el( InnerBlocks )
            )
        },
        save: function (props) {
            const parentBlocks = select.getBlockParents(props.clientId); // empty in save method, works in console
            const directParent = select.getBlocksByClientId(parentBlocks[parentBlocks.length - 1])[0];
            const siblings = directParent.innerBlocks;

            let classNameSuffix = \'\';
            if (siblings[0].attributes.clientId === props.clientId) {
                classNameSuffix = \' active\';
            }

            return el(
                \'div\',
                useBlockProps.save({
                    className: \'carousel-item\' + classNameSuffix
                }),
                el( InnerBlocks.Content )
            )
        },
    });
不幸的是,我尝试的方法返回了一个错误,因为parentBlocks为空。知道为什么吗?该代码在web控制台中工作,但在save方法中似乎正在中断。

1 个回复
SO网友:Tom J Nowell

save组件用于保存静态HTML,可以依赖于only在“块”(blocks)属性上。没有交互性,没有本地状态,没有AJAX请求,等等,只有块属性。

如果您实现了您想要做的事情,您将立即遇到块验证失败的新问题。您不能使用保存组件来了解此信息。在其他地方找到它并将其作为属性存储,最好是在编辑组件中。

相关推荐

如何从JavaScript生成COOKIEHASH

首要问题是如何获取PHP变量的内容:COOKIEHASH 在柏树测试中。我正在为WordPress编写一些Cypress测试,为了设置cookiesto log in a user in WordPress using Cypress, 那么我需要COOKIEHASH-变量对于那些不熟悉COOKIEHASH, 转到WordPress安装并将此代码放入任何位置:echo \'<pre>\'; print_r(COOKIEHASH); echo \'</pre>\';&