在古腾堡自定义横幅块中使用页面标题

Jim*_*dev 7 javascript wordpress wordpress-gutenberg

我为古腾堡创建了一个自定义横幅图像块,效果很好,但是我想知道在编辑之前是否可以将页面标题用作当前横幅文本占位符?

在此处输入图片说明

我的编辑功能是

 return [
            el('div', {className:'header-banner'},
                el(
                    element.Fragment,
                    null,
                    controls,
                    el( "div",{
                        className: 'banner-image',
                        style: { backgroundImage: 'url('+attributes.mediaURL+')' }
                    },
                    attributes.title || isSelected ?  el(RichText, {
                            key: 'editable',
                            tagName: "h1",
                            className: "banner-title",
                            //Can i add the page title in here if it is avaiable??
                            //placeholder: i18n.__('Write title…'),
                            value: attributes.title,
                            onChange: function onChange(value) {
                                return props.setAttributes({ title: value });
                            },
                            inlineToolbar: true
                        }) : null 

                    )
                )
            )//header-banner
        ];    
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

joe*_*ler 7

Gutenberg使用wp.​​data存储当前的编辑器状态,这是Redux的抽象。要获取标题(或100多个其他值),我们需要查询core/editor数据存储。Gutenberg使使用getEditedPostAttribute检索帖子属性变得简单。

一旦我们知道要看的地方,就很容易获得标题:

const { select } = wp.data;
const title = select("core/editor").getEditedPostAttribute( 'title' );
Run Code Online (Sandbox Code Playgroud)

可以,但是没有反应。帖子标题更改时,title将不会反映新的值。真令人失望。

为了反映对编辑器标题的更改,我们需要侦听对core/editor数据存储的更改。有几种方法可以做到这一点。

一种解决方案是定义一个简单的变更处理程序功能,并将其订阅数据存储更新:

const { select } = wp.data;

function logTitle() {
  const title = select("core/editor").getEditedPostAttribute( 'title' );
  console.log("Editor Title:", title);
}
subscribe(logTitle);
Run Code Online (Sandbox Code Playgroud)

任何 wp.data商店的价值被更新时,这将会触发-这经常发生。

似乎是古腾堡(Gutenberg)批准的包含数据存储值的方法是使用高阶组件直接包含值:

const GetTitle = props => <div>{props.title}</div>;

const selectTitle = withSelect(select => ({
  title: select("core/editor").getEditedPostAttribute( 'title' )
}));
const PostTitle = selectTitle(GetTitle);
Run Code Online (Sandbox Code Playgroud)

然后在该块的输出中,包含一个<PostTitle />jsx标记。这比嵌套的回调或其他更改处理程序要干净得多。

高阶组件可能很难遵循。简短的解释是,它们包装了一个现有组件,生成了一些数据,然后返回该组件的副本,并带有作为道具传递的新数据。这将逻辑与表示分离开来,并有助于维护。

GetTitle很简单,它只是一个很小的组件,它props带有一个带有标题键的对象并吐出一些html。

withSelect是一个函数构造器或装饰器。它接受一个函数参数,并返回一个需要组件的新函数。通常,返回的函数会立即被调用(类似于IIFE),但是selectTitle为了清楚起见,我将其存储在变量中。新函数将生成一个包含标题的对象,该对象将作为props传递给任何传递给的组件withSelect。通过某种魔术,每当数据存储更新时,就会调用它。

最后,PostTitle包含函数结果,selectTitle该函数结果是使用生成的props预填充的组件。然后可以使用<PostTitle />标签将此组件放入我们的标记中。每当编辑器数据存储被更新时,更高级别的组件将反映新数据。