在加载编辑程序后检测DOM中何时有Gutenberg编辑程序标题

时间:2020-03-09 作者:BenB

我在PrePublishCheckList

const title =
        typeof coreEditorPostEditsTitle !== "undefined"
            ? coreEditorPostEditsTitle
            : select("core/editor").getCurrentPost().title;

    const [event, setEvent] = useState(2019);
    // todo:: Find a better way to hook after gutenberg loaded and .editor-post-title__input" is available in dom
    setTimeout(() => {
        const editorTitleElement = document.querySelector(
            ".editor-post-title__input"
        );

        if(
            typeof select("core/editor").loadedInit === "undefined" &&
            !title.length
        ) {
            pickDropdownNotice(title);
            // Open right sidebar
            dispatch("core/edit-post").openPublishSidebar();
            // Set default event loadFromApi(event, setEvent);

            select("core/editor").loadedInit = true;
        }

        if(title.length) {
            showEditorTitle(editorTitleElement);
        } else {
            hideEditorTitle(editorTitleElement);
        }
    }, 100);

const showEditorTitle = editorTitleElement => {
    editorTitleElement.style.display = "block";
    editorTitleElement.readOnly = true;
    editorTitleElement.style.background = "#eee";
    editorTitleElement.style.color = "#32373c";
};

const hideEditorTitle = editorTitleElement => {
    editorTitleElement.style.display = "none";
};
代码的目标是隐藏标题,直到从PrePublishCheckList 更新帖子标题并保存草稿。

代码运行得很好,唯一的问题是我可以找到一个内置钩子来确定".editor-post-title__input" 元素在dom中可用。我知道我可以设置一个超时来反复检查,直到元素在dom中可见为止,但setTimeout感觉像是一个黑客。

还有哪种方法可以替换setTimeout,使setTimeout中的代码仅在.editor-post-title__input" Dom中是否已就绪?

删除setTimeout时出现的错误在hideEditorTitle中TypeError: Cannot read property \'style\' of null 在…上editorTitleElement.style.display = "none"; 内部hideEditorTitle()

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

在具有的元素上添加内联CSSstyle=".." 人们说,在样式表中通过HTML类使用CSS规则是一种不好的做法。因此,像这样通过javascript手动开始设置样式没有多大意义。

相反,添加一个隐藏标题的样式表,然后在将CSS类添加到主编辑器标记时显示标题,这不是更有意义吗?然后在从下拉列表中选择事件时添加类?

此外,您不应该这样做:

select("core/editor").loadedInit = true;
如果您想存储数据,可以使用WP-data-API和其他替代方法。

另外,不要使用setTimeout, 使用window._wpLoadBlockEditor 承诺在编辑器初始化后将内容排队运行,例如:。

window._wpLoadBlockEditor.then( function() {
    console.log( \'hooray!\' );
});

相关推荐

Gutenberg通过wp.hooks.addFilter修改核心分类面板元素

我已经研究过修改现有的编辑器元素……但几乎没有。但我确实在Github得到了一个很好的回复,指出了这一点:https://github.com/WordPress/gutenberg/tree/master/packages/editor/src/components/post-taxonomies#custom-taxonomy-selector显然,分类小组可以通过wp.hooks.addFilter. 这是一个很好的开始!我已经能够使用该代码片段模拟一些虚拟代码,用Dashicon替换分类法面板。(