我正在尝试创建一个自定义旋转木马块,我想拥有与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>
)
}
})
()
我还尝试这样扩展库:
但是,除非用户单击该块,否则他不会知道图库也可以是旋转木马。
有没有办法“克隆”核心块?(情况1)或者我可以更改它的名称?(情况2)
提前感谢!
丹尼
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等效