在定制块中使用核心块功能Gutenberg

时间:2020-02-26 作者:danihazler

我正在尝试创建一个自定义旋转木马块,我想拥有与gallery核心块相同的功能。

当我第一次选择图像时,一切都很好,但当我尝试添加额外的图像时,它实际上会擦除第一个图像并替换最新选择的图像。

export const carouselBlock = (
registerBlockType(\'gutenberg/custom-carousel\', {
    title: \'Carousel\',
    description: \'Block to generate a custom carousel\',
    icon: \'images-alt2\',
    category: \'layout\',

    attributes: {
        selectedImages: {
            type: \'string\',
            default: {},
        }
    },

    edit({ attributes, setAttributes}){
        const { selectedImages } = attributes;

        function onSelectImages(media) {
            const imagesUrl = values({...media}).map((item, i) => {
                return ({id: item.id, url:item.url});
            })
            setAttributes({ selectedImages: (values({...imagesUrl})) });
        }

        return (
            <div>
                {selectedImages.length > 0 &&
                    <figure className=\'wp-block-gallery columns-3\'>
                        <ul className="blocks-gallery-grid">
                            {selectedImages.map((image, i) => {
                                return (
                                    <li key={i} className=\'blocks-gallery-item\'>
                                        <figure>
                                            <img 
                                                src={image.url}
                                            />
                                        </figure>
                                    </li>
                                )
                            })}
                        </ul>
                    </figure>
                }
                <div className=\'carousel-block\'>
                    <MediaUploadCheck>
                        <MediaUpload
                            onSelect={(media) => onSelectImages(media)}
                            // value={media => selectedImages.push(media)}
                            multiple={\'add\'}
                            render={ ( { open } ) => (
                                <IconButton 
                                    onClick={open}
                                    icon="upload"
                                    className="editor-media-placeholder__button is-button is-default is-large"
                                >
                                    Open Media Library
                                </IconButton>
                            ) }
                        />
                    </MediaUploadCheck>
                </div>
            </div>
        );
    },
    save({attributes}){
        const { selectedImages } = attributes;

        return (
            <div>
                {selectedImages.map((image, i) => {
                    return (<p key={i}>{image}</p>)
                })}
            </div>
        )
    }

})
()

我还尝试这样扩展库:

enter image description here

但是,除非用户单击该块,否则他不会知道图库也可以是旋转木马。

有没有办法“克隆”核心块?(情况1)或者我可以更改它的名称?(情况2)

提前感谢!

丹尼

1 个回复
SO网友:Tom J Nowell

这里可能还存在其他几个相互影响的问题,但最重要的是:

        function onSelectImages(media) {
            const imagesUrl = values({...media}).map((item, i) => {
                return ({id: item.id, url:item.url});
            })
            setAttributes({ selectedImages: (values({...imagesUrl})) });
        }
拾取图像时,可以抓取图像并将其设置为选定图像。这与添加它们不同,您需要获取现有的选定图像并附加这两个图像。

假设是media 包含所有选定的图像,以及您添加的图像。这是不正确的。

相反,您选择了图像,而您选择的图像media, 你正在设置它。除非您重新选择以前的图像,否则它们不会出现在那里。

您当前所做的与PHP中的类似操作相当:

$images = [];

function on_new_images( $new_images ) {
     $new_urls_ids = foreach new images get URLs and IDs...
     $images = $new_urls_ids;
}
当你真正想要的是:

$images = [];

function on_new_images( $new_images ) {
     $new_urls = foreach new images get URLs...
     $images = array_merge( $images, $new_urls );
}
但是JS等效

相关推荐