当我单击按钮添加新选项卡时,我希望<InnerBlock />
因此,我可以在选项卡中添加其他块。尝试这样做并不奏效,因为在所有动态创建的选项卡中似乎都是一样的。
import "./index.css";
import { registerBlockType } from "@wordpress/blocks";
import { useState } from "react";
import {
RichText,
InnerBlocks,
} from "@wordpress/block-editor";
import { Button } from "@wordpress/components";
const __ = wp.i18n.__;
registerBlockType("custom/tabs", {
title: __("Tabbed Blocks", "custom-blocks"),
description: __("Tabbed content blocks", "custom-blocks"),
icon: "smiley",
category: "custom-category",
keywords: [__("tabs", "custom-blocks"), __("repeat", "custom-blocks")],
attributes: {
tabs: {
type: "array",
default: [""],
},
},
edit: (props) => {
const {
attributes: { tabs },
setAttributes,
} = props;
const [currentTab, setCurrentTab] = useState(0);
const onTabClick = (index) => {
setCurrentTab(index);
};
return (
<>
<div className="simple-tabs">
<div className="tabs">
{tabs.map((tab, index) => (
<RichText
tagName="button"
value={tab}
className={currentTab == index ? `active` : ""}
onChange={(newValue) => {
const newTabs = tabs.concat([]);
newTabs[index] = newValue;
setAttributes({ tabs: newTabs });
}}
onClick={() => onTabClick(index)}
/>
))}
</div>
{tabs.map((tab, index) => {
if (index == currentTab) {
//return <div>Tab content {index}</div>;
return <InnerBlocks />;
}
})}
</div>
<Button
isPrimary
onClick={() => {
setAttributes({ tabs: tabs.concat([""]) });
}}
>
Add Tab
</Button>
</>
);
},
save: (props) => {
return <InnerBlocks.Content />;
},
});
所需输出
最合适的回答,由SO网友:Tom J Nowell 整理而成
You don\'t
这不是块的工作方式,也不是HTML的工作方式。如果要在多个区域中插入块,则需要多个块。
这等于说一个盒子有多个内部,或者有多个“内部”;在HTML标记内;,它作为一个概念没有意义。
相反,要做官方核心模块所做的事情。E、 g列。
列块一个列块只能包含单独的列块,而包含内容的是单独的列块。
选项卡的工作原理相同:
请注意,如果不意外地想出完全相同的解决方案,您所要求的内容也不可能用项目符号表示。
如果我想有一个<div>
有两个内部空间的容器我必须在其中放置两个标签作为单独的空间。为什么积木会有任何不同。
请注意,块appender UI只是默认UI,没有任何东西阻止您将自定义appender组件传递到内部块UI,甚至将其构建到块本身。
以下是直接取自InnerBlocks组件appender属性文档自述文件的示例:
// Utilise a predefined component
<InnerBlocks
renderAppender={ InnerBlocks.ButtonBlockAppender }
/>
// Don\'t display an appender
<InnerBlocks
renderAppender={ false }
/>
// Fully custom
<InnerBlocks
renderAppender={ MyAmazingAppender }
/>
以下是appender组件:
function render( { clientId } ) {
return (
<div>
<p>Some rendered content here</p>
<ButtonBlockAppender rootClientId={ clientId } />
</div>
);
}
https://github.com/WordPress/gutenberg/tree/trunk/packages/block-editor/src/components/button-block-appender
以下是选项卡如何阻止ultimate GB加载项:
const { insertBlock } = !wp.blockEditor ? dispatch( \'core/editor\' ) : dispatch( \'core/block-editor\' );
const tabItemBlock = createBlock(\'uagb/tabs-child\');
insertBlock(tabItemBlock, attributes.tabHeaders.length, clientId);
在这里,他们使用
uaggb/tabs
块以提供UI并包含选项卡,以及
uaggb/tabs-child
块以包含每个选项卡的内容并提供特定于选项卡的属性
有用的链接: