如何将属性传递给 InnerBlocks 模板中的子 Gutenberg 块?
How to pass attributes to child Gutenberg blocks in InnerBlocks template?
我正在尝试使用 InnerBlocks 构建一组自定义的列块,但在将属性传递给块模板时遇到了问题。首先,我使用 Create-Guten-Block 构建了一个新插件。然后我创建了两个块,一个用作行容器,另一个用于单独的列。
这是我创建主容器的简化版本(有两列硬编码用于测试):
registerBlockType( 'wabe/multi-column-block', {
title: __( 'Multi-Column' ),
icon: 'columns',
category: 'common',
keywords: [
__( 'columns' ),
__( 'grid' ),
],
attributes: {
layout: {
type: 'string',
},
},
edit: () => {
return (
<div>
{ /* inspector controls for choosing a layout will go here */ }
<InnerBlocks
template={ [
[ 'wabe/multi-column-column', { columnwidth: '6' }, [
[ 'core/paragraph', { content: 'Insert column content here.' } ],
],
],
[ 'wabe/multi-column-column', { columnwidth: '6' }, [
[ 'core/paragraph', { content: 'Insert column content here.' } ],
],
],
] }
/>
</div>
);
},
save: () => {
// This is a dynamic block
return (
<InnerBlocks.Content />
);
},
} );
...以及我如何创建单独的列块:
registerBlockType( 'wabe/multi-column-column', {
title: __( 'Multi-Column Column' ),
icon: 'columns',
category: 'common',
keywords: [
__( 'columns' ),
__( 'grid' ),
],
attributes: {
columnwidth: {
type: 'string',
default: '',
},
},
edit: ( props ) => {
return (
<div>
<p>Width: { props.attributes.columnwidth }</p>
<InnerBlocks />
</div>
);
},
save: () => {
return (
<InnerBlocks.Content />
);
},
} );
我将有一个自定义 select 供用户选择列布局,并使用它来确定要包含多少列,并将“columnwidth”属性传递给每个列块。这将告诉每一列要使用什么 CSS class。
问题是无论我尝试什么,“columnwidth”属性都不会传递给列块。事实上,我无法让它传递任何东西,甚至是“className”。
我查看了核心 columns/column 块的代码,但看不出我做错了什么。在这个巨大的障碍之前,一切都很顺利。如有任何提示,我们将不胜感激。
您提供的块代码示例显示您正在正确设置 InnerBlocks。这个问题可能是一个简单的疏忽,您错过了导入 <InnerBlocks>
.
所需的依赖项
一旦我添加了所需的导入,我就能够成功构建您的块代码:
import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';
import { InnerBlocks} from '@wordpress/block-editor';
结果如下:
代码编辑器显示您的属性正在传递和保存。
如果您仍然遇到问题,请在重新测试之前仔细检查您是否清除了浏览器缓存,并检查浏览器控制台以查看是否存在任何错误。
正如您提到的,您已经查看了 Columns/Column 的 Gutenberg 代码,一个提示是查看它们如何 variations 在您的 Inspector 控件中创建选项。希望这能让您回到创建区块的正轨。
我正在尝试使用 InnerBlocks 构建一组自定义的列块,但在将属性传递给块模板时遇到了问题。首先,我使用 Create-Guten-Block 构建了一个新插件。然后我创建了两个块,一个用作行容器,另一个用于单独的列。
这是我创建主容器的简化版本(有两列硬编码用于测试):
registerBlockType( 'wabe/multi-column-block', {
title: __( 'Multi-Column' ),
icon: 'columns',
category: 'common',
keywords: [
__( 'columns' ),
__( 'grid' ),
],
attributes: {
layout: {
type: 'string',
},
},
edit: () => {
return (
<div>
{ /* inspector controls for choosing a layout will go here */ }
<InnerBlocks
template={ [
[ 'wabe/multi-column-column', { columnwidth: '6' }, [
[ 'core/paragraph', { content: 'Insert column content here.' } ],
],
],
[ 'wabe/multi-column-column', { columnwidth: '6' }, [
[ 'core/paragraph', { content: 'Insert column content here.' } ],
],
],
] }
/>
</div>
);
},
save: () => {
// This is a dynamic block
return (
<InnerBlocks.Content />
);
},
} );
...以及我如何创建单独的列块:
registerBlockType( 'wabe/multi-column-column', {
title: __( 'Multi-Column Column' ),
icon: 'columns',
category: 'common',
keywords: [
__( 'columns' ),
__( 'grid' ),
],
attributes: {
columnwidth: {
type: 'string',
default: '',
},
},
edit: ( props ) => {
return (
<div>
<p>Width: { props.attributes.columnwidth }</p>
<InnerBlocks />
</div>
);
},
save: () => {
return (
<InnerBlocks.Content />
);
},
} );
我将有一个自定义 select 供用户选择列布局,并使用它来确定要包含多少列,并将“columnwidth”属性传递给每个列块。这将告诉每一列要使用什么 CSS class。
问题是无论我尝试什么,“columnwidth”属性都不会传递给列块。事实上,我无法让它传递任何东西,甚至是“className”。
我查看了核心 columns/column 块的代码,但看不出我做错了什么。在这个巨大的障碍之前,一切都很顺利。如有任何提示,我们将不胜感激。
您提供的块代码示例显示您正在正确设置 InnerBlocks。这个问题可能是一个简单的疏忽,您错过了导入 <InnerBlocks>
.
一旦我添加了所需的导入,我就能够成功构建您的块代码:
import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';
import { InnerBlocks} from '@wordpress/block-editor';
结果如下:
如果您仍然遇到问题,请在重新测试之前仔细检查您是否清除了浏览器缓存,并检查浏览器控制台以查看是否存在任何错误。
正如您提到的,您已经查看了 Columns/Column 的 Gutenberg 代码,一个提示是查看它们如何 variations 在您的 Inspector 控件中创建选项。希望这能让您回到创建区块的正轨。