CheckboxControl不可见更改

时间:2022-02-18 作者:Thomas Zwirner

我使用以下代码在Gutenberg提要栏中添加一个自定义选项。其可见并保存复选框值有效。

但是:如果我单击复选框控件,它上没有任何可见的更改。如果它没有被检查,而我想检查它,它就不会被检查。“The”;“更新”-按钮变为活动状态,我看到它后面有复选框。

为什么?

import { CheckboxControl } from \'@wordpress/components\';
import { dispatch, select } from \'@wordpress/data\';
import { PluginDocumentSettingPanel } from \'@wordpress/edit-post\';
import { Component  } from \'@wordpress/element\';
import { __ } from \'@wordpress/i18n\';

export default class Sidebar extends Component {
    render() {
        const meta = select( \'core/editor\' ).getEditedPostAttribute( \'meta\' );
        const toggleState = meta[\'code\'];

        return (
            <PluginDocumentSettingPanel
                name="code"
                title={ __( \'Display Settings\', \'myplugin\' ) }
            >
                <CheckboxControl
                    checked={ toggleState }
                    help={ __( \'My help.\', \'myplugin\' ) }
                    label={ __( \'My Label\', \'myplugin\' ) }
                    onChange={ ( value ) => {
                        dispatch( \'core/editor\' ).editPost( {
                            meta: {
                                \'code\': value,
                            },
                        } );
                    } }
                />
            </PluginDocumentSettingPanel>
        );
    }
}

2 个回复
最合适的回答,由SO网友:Thomas Zwirner 整理而成

Solution found:

const { __ } = wp.i18n;
const { useSelect, useDispatch } = wp.data;
const { PluginDocumentSettingPanel } = wp.editPost;
const { CheckboxControl, PanelRow } = wp.components;

const Sidebar = () => {
    const { postMeta } = useSelect( ( select ) => {
        return {
            postMeta: select( \'core/editor\' ).getEditedPostAttribute( \'meta\' ),
        };
    } );
    const { editPost } = useDispatch( \'core/editor\', [ postMeta.code ] );

    return(
        <PluginDocumentSettingPanel title={ __( \'Display Settings\', \'myplugin\') }>
            <PanelRow>
                <CheckboxControl
                    label={ __( \'My Label\', \'myplugin\' ) }
                    checked={ postMeta.code }
                    onChange={ ( value ) => editPost( { meta: { code: value } } ) }
                />
            </PanelRow>
        </PluginDocumentSettingPanel>
    );
}

export default Sidebar;
SO网友:Tom J Nowell

因为React没有意识到任何更改,所以所有道具都是相同的,状态也是相同的,因此不需要更新。这是因为你selectdispatch 直接从@wordpress/data 包裹

你不应该使用selectdispatch 直接来说,你应该使用useSelectuseDispatch 挂钩。

您还需要将其转换为基于函数的组件,不能对基于类的组件使用挂钩

相关推荐

Searchresult sidebar change

那么,searchresult页面侧栏位于哪里?例如,在searchresult页面中,有一个“A”侧栏。但是,我想将其更改为“B”侧栏。我看着search.php 但无法理解侧边栏的来源。