未正确保存或检索古腾堡属性?

Gutenberg attributes not being saved or retrieved properly?

在一个可怕的跳入深端的演示中,我正在通过构建一个不仅仅是简单的古腾堡块来体验我的 React 开发的第一部分。愚蠢!

无论如何,我正在制作的块是从自定义 post 类型中提取内容,select 通过 InspectorControls 中 SelectControlbox 的 post ID 编辑。

<SelectControl 
   onChange={ onSelectPost } 
   value={ attributes.selectedpost } 
   label={ __( 'Select a Post' ) } 
   options={ options } 
/>

这工作正常,渲染正常!

selected post ID 在更改值时保存为属性:

const onSelectPost = ( post ) => {
    setAttributes( {
        selectedpost: post,
    } );
};

稍后,我会检查是否已设置,如果已设置,则检索内容并用一些内容填充 innerblocks 模板。

这在第一个编辑屏幕和最终结果中显示一切正常,但是当您返回编辑内容时,它丢失了 selectedpost 属性!

这里是属性 def:

attributes: {
    selectedpost: {
        type: 'number',
        default: 0, 
    },

这是存档:

save: function( props ) {       
    const blockProps = useBlockProps.save();
    const { attributes } = props;
    
    return (
        <div { ...blockProps } key="sandcexercise">
            <InnerBlocks.Content /> 
        </div>
    );  
},

由于我没有指定属性的来源,我希望它被保存为评论并从那里重新加载。

如果我将要输出的属性转换为 p 标签,一切正常!

转换后的属性:

attributes: {
        selectedpost: {
            type: 'text',
            source: 'text',
            selector: 'p.selectedpost',     
        },

并将此行添加到编辑和保存功能中:

<p className="selectedpost">{ attributes.selectedpost }</p>

奇怪的是,我从评论中正确地提取了一些其他属性,只是不是我的 selectpost 号码!

知道我可能做错了什么吗?我对 React 几乎一无所知,上一次我真正愤怒地对 Javascript 做任何事情是在 2002 年,让东西在屏幕上移动,所以我真的被调试塞满了!

总的来说,您提供的代码示例和您的解释表明您在使用 ReactJS 创建 Gutenberg 块和处理属性方面走在正确的道路上,好吧 done/don 不要放弃!

由于您的 selectedpost 属性是一个数字,确保 setAttributes() 保存的值也是使用 parseInt() 的数字,例如:

const onSelectPost = ( post ) => {
    setAttributes( {
        selectedpost: parseInt(post)
    });
};

重新加载时,通过保持值的正确类型(数字),保存的值将与您的 <SelectControl> 中的 'options'(post id)之一相匹配。这也解释了为什么它在您使用 <p> 时有效,因为该值作为字符串存储在 <p>..</p>.

提示:使用浏览器控制台调试可以帮助您快速定位问题;控制台中的 React 错误消息在 finding/resolving 问题中很有用,并可能减少挫败感...