在古登堡有条件地显示控制

时间:2020-05-23 作者:leemon

我有一个自定义的帖子类型,其中有两个元字段需要显示为切换控件(RestrictControlSubscribeControl) 在PluginDocumentSettingPanel 古腾堡编辑器中的侧栏。问题是我只想展示SubscribeControl 什么时候RestrictControl 已设置。这是我目前得到的代码,但它不起作用。当我切换时RestrictControl 始终显示打开和关闭两个控件。

有什么想法吗?

let RestrictControl = ({ restrict, onUpdateRestrict }) => (
    <ToggleControl
        label={ __( \'Restrict viewing?\' ) }
        checked={ restrict }
        onChange={ restrict => onUpdateRestrict( restrict ) }
    />
);

let SubscribeControl = ({ subscribe, onUpdateSubscribe }) => (
    <ToggleControl
        label={ __( \'Add to newsletter?\' ) }
        checked={ subscribe }
        onChange={ subscribe => onUpdateSubscribe( subscribe ) }
    />
);

const OptionsPanel = () => {
    const postType = select( \'core/editor\' ).getCurrentPostType();
    if ( \'custom_type\' !== postType ) {
        return null;
    }

    return (
        <PluginDocumentSettingPanel
            name=\'options\'
            title={ __( \'Options\' ) }
            className=\'options-panel\'
        >
            <RestrictControl />
            { restrict && (
                <SubscribeControl />
            ) }
        </PluginDocumentSettingPanel>
    );
}

registerPlugin( \'options-panel\', {
    render: OptionsPanel,
})

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

代码中有两个主要问题:

那是什么restrict 在您的OptionsPanel 组成部分您在何处以及如何定义它?

两个onUpdateRestrictonUpdateSubscribe 不是函数,因此单击切换控件将导致JavaScript错误。

如果您能显示完整的代码,我可能可以帮助您修复代码。但是,我建议您尝试compose package 要构建OptionsPanel 组件,因为这样做可以极大地帮助减少源代码,并使事情变得非常简单。

所以对于compose 程序包,步骤如下:

Note: I\'m using these two meta keys: restrict_viewing and subscribe_to_news, so be sure to change them to the correct ones. (即使用适当的元键。)

加载所有WordPress依赖项:

import { PluginDocumentSettingPanel } from \'@wordpress/edit-post\';
import { ToggleControl } from \'@wordpress/components\';
import { __ } from \'@wordpress/i18n\';
import { registerPlugin } from \'@wordpress/plugins\';
import { withSelect, withDispatch } from \'@wordpress/data\';
import { compose } from \'@wordpress/compose\';
RestrictControl &;SubscribeControl 在问题中)。

function OptionsPanelComponent( {
    // These props are passed by applyWithSelect(). (see step #3)
    currentPostType, // current post type
    restrictViewing, // current state of the meta restrict_viewing
    subscribeToNews, // current state of the meta subscribe_to_news
    // And these are passed by applyWithDispatch(). (see step #4)
    onUpdateRestrict,  // function which updates the meta restrict_viewing
    onUpdateSubscribe, // function which updates the meta subscribe_to_news
} ) {
    if ( \'custom_type\' !== currentPostType ) {
        return null;
    }

    return (
        <PluginDocumentSettingPanel
            name="options"
            title={ __( \'Options\' ) }
            className="options-panel"
        >
            <ToggleControl
                label={ __( \'Restrict viewing?\' ) }
                checked={ restrictViewing }
                onChange={ onUpdateRestrict }
            />
            { restrictViewing && (
                <ToggleControl
                    label={ __( \'Add to newsletter?\' ) }
                    checked={ subscribeToNews }
                    onChange={ onUpdateSubscribe }
                />
            ) }
        </PluginDocumentSettingPanel>
    );
}
使用wp.data.withSelect 从当前帖子(正在编辑)中“选择”/检索数据,并将数据传递给上述组件(OptionsPanelComponent).

注:该select 总是传递给函数select 相当于wp.data.select.

const applyWithSelect = withSelect( ( select ) => {
    const {
        getEditedPostAttribute,
        getCurrentPostType
    } = select( \'core/editor\' );

    const meta = getEditedPostAttribute( \'meta\' );

    return {
        currentPostType: getCurrentPostType(),
        restrictViewing: meta.restrict_viewing,
        subscribeToNews: meta.subscribe_to_news,
    };
} );
使用wp.data.withDispatch 定义更新post数据的函数,并在上面的步骤#2中将函数传递给组件(OptionsPanelComponent).

注:该dispatch 总是传递给函数dispatch 相当于wp.data.dispatch.

const applyWithDispatch = withDispatch( ( dispatch ) => {
    const { editPost } = dispatch( \'core/editor\' );

    return {
        onUpdateRestrict( restrict ) {
            const meta = { restrict_viewing: restrict };
            editPost( { meta } );
        },
        onUpdateSubscribe( subscribe ) {
            const meta = { subscribe_to_news: subscribe };
            editPost( { meta } );
        },
    };
} );
wp.compose.compose() 要“组合”或包装以上所有三个组件(可以使用functionconst, 但它们确实是组件)。这个“组合”组件将作为render 的回调wp.plugins.registerPlugin.

const OptionsPanel = compose(
    applyWithSelect,
    applyWithDispatch
)( OptionsPanelComponent );

registerPlugin( \'options-panel\', {
    render: OptionsPanel,
} );

我用于测试目的的完整代码

您可以找到它here, 或者您可以下载the full plugin 我是基于this example.

我已经试过了&;在WordPress 5.4.1上使用默认值进行了测试post 在这个答案前面提到的带有两个元键的帖子类型。

如果您不想使用compose(), 那你可以试试this one. 但我补充这一点,只是因为我认为这对我自己将来会有用。:)

相关推荐

禁用jQuery javascript的Cloudflare Rocket Loader并使其首先加载

我使用Cloudflare Rocket Loader在我的站点上加速Javascript。问题是,它在加载jQuery本身之前加载某些需要jQuery的脚本,使它们无法正常工作。尽快禁用Rocket Loader以添加特定脚本data-cfasync=\"false\" 到<script src=\"\"> 我想知道如何将其添加到jQuery脚本中,因为Wordpress并不是简单地通过脚本标记加载jQuery。目前我的网站加载jquery-migrate.min.js 和jquery.js