仅显示带有多个文本字段的Gutenberg Block的焦点工具栏

时间:2018-05-17 作者:Nathan Johnson

我正在尝试创建一个包含多个文本字段的块。这很容易,但当我选择要编辑的块时,两个工具栏都会显示出来。我搜索了文档,什么也找不到。

这里是最有效的JSX代码。它向块中添加标题、段落和图像。但当一个RichText元素处于焦点时,两个工具栏都会显示,这很烦人。

const { registerBlockType, RichText, AlignmentToolbar, BlockControls, InspectorControls, MediaUpload } = wp.blocks;
const { Button, TextControl } = wp.components;

registerBlockType( \'skulogic/header\', {
    title: \'SKULogic Header\',
    icon: \'universal-access-alt\',
    category: \'layout\',

    attributes: {
        title: {
            type: \'array\',
            source: \'children\',
            selector: \'h2\',
        },
        content: {
            type: \'array\',
            source: \'children\',
            selector: \'p\',
        },
        mediaID: {
            type: \'number\',
        },
        mediaURL: {
            type: \'string\',
            source: \'attribute\',
            selector: \'div\',
            attribute: \'data-src\',
        },
    },

    edit( { attributes, className, setAttributes } ) {
        const { mediaID, mediaURL, title, content } = attributes;

        const onChangeTitle = value => {
            setAttributes( { title: value } );
        };

        const onSelectImage = media => {
            setAttributes( {
                mediaURL: media.url,
                mediaID: media.id,
            } );
        };

        const onChangeContent = newContent => {
            setAttributes( { content: newContent } );
        };

        return (
            <div className={ className }>
                <RichText
                    tagName="h2"
                    placeholder={ \'Page Header\' }
                    value={ title }
                    onChange={ onChangeTitle }
                />
                <RichText
                    tagName="p"
                    placeholder={ \'Page Content\' }
                    value={ content }
                    onChange={ onChangeContent }
                />
                <MediaUpload
                    onSelect={ onSelectImage }
                    type="image"
                    value={ mediaID }
                    render={ ( { open } ) => (
                        <Button className={ mediaID ? \'image-button\' : \'button button-large\' } onClick={ open }>
                            { ! mediaID ? \'Upload Image\' : <img src={ mediaURL } /> }
                        </Button>
                    )}
                />
            </div>
        );
    },
    save( { attributes, className } ) {
        const { mediaID, mediaURL, title, content } = attributes;

        const divStyle = {};
        if( mediaURL ) {
            divStyle.backgroundImage = \'URL(\'+mediaURL+\')\';
        }

        return (
            <div className={ className } data-src={ mediaURL } style={ divStyle }>
            <h2>{ title }</h2>
            <p>{ content }</p>
            </div>
        );
    },
} );
请参阅随附的显示工具栏的屏幕截图,其中显示了<h2><p> 元素。我只想显示焦点所在的那个。

Two toolbars

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

<RichText> 拥有财产,isSelected. 什么时候isSelected 控件显示为true。默认情况下isSelected 代表当前选定的块。

从…起the docs

isSelected:布尔值

可选择的选择是否显示输入以显示格式化控件。默认情况下,当选择块时,它会渲染控件

isSelected 也是一个道具(我想?)可以传递到edit({ isSelected }). isSelected 默认情况下,在选定的当前块之外工作。

因此默认值为<RichText .. isSelected={ isSelected }>.

我曾经有过一个解决方案,在2.2中focus 使用了,但情况发生了变化。无论如何,您可以通过编写自己的JS来覆盖它,以查看当前<RichText> 组件是否聚焦&;这将切换工具栏。

更新:

直接从古腾堡的一位开发者那里:

@youknowriad

在当前版本中,您可以使用状态和onFocus 在RichText上跟踪当前关注的RichText,但在下一个版本中,它应该自动完成

更新2:

有人遇到了您的确切问题,显示了代码提供的解决方案:https://github.com/WordPress/gutenberg/issues/6740#issuecomment-388829359

结束

相关推荐