Gutenberg块编辑器-自定义块的表单组件列表

时间:2019-01-29 作者:Jon

我正在尝试学习如何为块编辑器创建块。我似乎找不到要添加的表单元素列表。例如,我需要一个切换开关、下拉列表等。

我发现THIS toggle, 但我不知道如何使用它,也找不到任何例子。

这是我的代码,到目前为止,我已经能够添加明文、RichText和MediaUpload。有这些东西的清单吗?更多示例?

const { RichText, MediaUpload, PlainText } = wp.editor;
const { registerBlockType } = wp.blocks;
const { Button } = wp.components;

import \'./style.scss\';
import \'./editor.scss\';

registerBlockType(\'card-block/main\', {
    title: \'Slider\',
    icon: \'images-alt2\',
    category: \'common\',
    attributes: {
        title: {
            source: \'text\',
            selector: \'.slider__title\'
        },
        body: {
            type: \'array\',
            source: \'children\',
            selector: \'.slider__body\'
        },
        imageAlt: {
            attribute: \'alt\',
            selector: \'.slider__image\'
        },
        imageUrl: {
            attribute: \'src\',
            selector: \'.slider__image\'
        }
    },

    edit({ attributes, className, setAttributes }) {
        const getImageButton = (openEvent) => {
            if (attributes.imageUrl) {
                return (
                    <img
                        src={attributes.imageUrl}
                        onClick={openEvent}
                        className="image"
                    />
                );
            }
            else {
                return (
                    <div className="button-container">
                        <Button
                            onClick={openEvent}
                            className="button button-large"
                        >
                            Pick an Image
                        </Button>
                    </div>
                );
            }
        };

        return(
            <div className="container">
                <MediaUpload
                    onSelect={media => { setAttributes({ imageAlt: media.alt, imageUrl: media.url }); }}
                    type="image"
                    value={attributes.imageID}
                    render={({ open }) => getImageButton(open)}
                />
                <PlainText
                    onChange={content => setAttributes({ title: content })}
                    value={attributes.title}
                    placeholder="Your card title"
                    className="heading"
                />
                <RichText
                    onChange={content => setAttributes({ body: content })}
                    value={attributes.body}
                    multiline="p"
                    placeholder="Your card text"
                />
            </div>
        );
    },

    save({ attributes }) {
        const cardImage = (src, alt) => {
            if (!src) return null;

            if (alt) {
                return (
                    <img
                        className="slider__image"
                        src={src}
                        alt={alt}
                    />
                );
            }

            return (
                <img
                    className="slider__image"
                    src={src}
                    alt=""
                    aria-hidden="true"
                />
            );
        };

        return (
            <div className="card">
                {cardImage(attributes.imageUrl, attributes.imageAlt)}
                <div className="slider__content">
                    <h3 className="slider__title">{attributes.title}</h3>
                    <div className="slider__body">
                        {attributes.body}
                    </div>
                </div>
            </div>
        );
    }
});
任何帮助都将不胜感激!我正在学习ES6&;JSX也是如此,所以这是一种痛苦!

2 个回复
SO网友:Alvaro

有两个主要包提供可在中使用的组件blocks API 或者plugins API (创建您自己的块或插件)。

中找到的组件wp.components package 可用于操作数据。这些数据可以是块中的属性,也可以是自定义存储中的数据,或者是default stores. 它们实际上可以在块编辑器之外使用。

中找到的组件wp.editor package 是用来在编辑器中对其进行操作的。它们由块编辑器本身或核心块内部使用,也可以在您自己的块中使用。这些组件使用块编辑器数据存储,因此必须在其中使用。目前,块编辑器只能在后期编辑器中加载,但这可能会change soon.

SO网友:Ashiquzzaman Kiron

您可以使用此Gutenberg手册查看组件列表-Component List 如果您不想跟踪从何处导入哪些组件,您可以使用此VSC Extension (我构建)它将导入所有组件,这样您就不必浪费时间导入。

Here\'s dropdown code -

import { Button, Dropdown } from \'@wordpress/components\';

const MyDropdown = () => (
    <Dropdown
        className="my-container-class-name"
        contentClassName="my-popover-content-classname"
        position="bottom right"
        renderToggle={ ( { isOpen, onToggle } ) => (
            <Button isPrimary onClick={ onToggle } aria-expanded={ isOpen }>
                Toggle Popover!
            </Button>
        ) }
        renderContent={ () => (
            <div>
                This is the content of the popover.
            </div>
        ) }
    />
);

and ToggleControl code -

import { ToggleControl } from \'@wordpress/components\';
import { withState } from \'@wordpress/compose\';

const MyToggleControl = withState( {
    hasFixedBackground: false,
} )( ( { hasFixedBackground, setState } ) => ( 
    <ToggleControl
        label="Fixed Background"
        help={ hasFixedBackground ? \'Has fixed background.\' : \'No fixed background.\' } 
        checked={ hasFixedBackground }
        onChange={ () => setState( ( state ) => ( { hasFixedBackground: ! state.hasFixedBackground } ) ) }
    />
) );