微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Wordpress Gutenberg Sidebar 中将状态从子组件传递到父组件

如何解决在 Wordpress Gutenberg Sidebar 中将状态从子组件传递到父组件

我正在设置一个侧边栏,其中包含一些自定义元字段的控件。我有一个包含一些内部子组件的父功能组件,我想根据 RadioControl 的选择来切换(显示/隐藏)不同的控件。

这是我现在得到的:

父组件:

import { __ } from "@wordpress/i18n";
import {
    PanelBody,PanelRow,HorizontalRule
} from "@wordpress/components";

/**
 * Local dependencies.
 */
import icons from './icons.js'

import MyRadioControl from "./my-radio-control";
import MyCustom1 from "./my-custom-1";
import MyCustom2 from "./my-custom-2";
import MyCustom3 from "./my-custom-3";

const ParentItem = () => {

    return (
        <PanelBody
            title={__("Parent item","textdomain")}
            icon={icons.parentItem}
            initialOpen={false}
        >
            <PanelRow>
                <MyRadioControl />
            </PanelRow>
            <HorizontalRule />
            <PanelRow>
                <MyCustom1 />
            </PanelRow>
            <HorizontalRule />
            <PanelRow>
                <MyCustom2 />
            </PanelRow>
            <HorizontalRule />
            <PanelRow>
                <MyCustom3 />
            </PanelRow>
        </PanelBody>
    )
}

export default ParentItem

子项(RadioControl):

import { __ } from "@wordpress/i18n";
import { compose } from "@wordpress/compose";
import { withSelect,withdispatch } from "@wordpress/data";
import { RadioControl } from "@wordpress/components";

const MyRadioControl = ({ MetaFieldValue,setMetaFieldValue }) => {
    return (
        <RadioControl
            label={__("MyRadioControl","textdomain")}
            selected={
                MetaFieldValue ? MetaFieldValue : "none"
            }
            options={[
                {
                    label: __("None","textdomain"),value: 'none'
                },{
                    label: __("Show custom 1",value: 'show-custom-1'
                },{
                    label: __("Show custom 2",value: 'show-custom-2'
                },{
                    label: __("Show custom 3",value: 'show-custom-3'
                },]}
            onChange={setMetaFieldValue}
        />
    )
}

export default compose([
    withdispatch((dispatch,props) => {
        return {
            setMetaFieldValue: function (value) {
                dispatch('core/editor').editPost({ Meta: { _mysite_my_radio_control: value } });
            }
        }
    }),withSelect((select,props) => {
        return {
            MetaFieldValue: select('core/editor').getEditedPostAttribute('Meta')['_mysite_my_radio_control'],};
    }),])(MyRadioControl);

这是有效的(意味着设置/调度 HOC 允许选择和更新元字段值)。我现在想获得的是将 MyRadioControl 组件的值传递给父组件,以便通过条件语句(例如,当“show-custom-1”值时)切换(隐藏/显示)相应的控件在 MyRadioControl 中选择,然后显示 MyCustom1 组件等...)

也许我在一杯水里迷路了...

解决方法

...正如我所说,我迷失在一杯水中。以下是我在上述情况下解决问题的方法(也许它可以帮助像我这样的 React 新手):

const ParentItem = ({ state,setState }) => {

    return (
        <PanelBody
            title={__("Parent item","textdomain")}
            initialOpen={false}
        >
        <PanelRow>
            <RadioControl
                label={__("MyRadioControl","textdomain")}
                selected={ state ? state : "none" }
                options={[
                    {
                        label: __("None","textdomain"),value: 'none'
                    },{
                        label: __("Show custom 1",value: 'show-custom-1'
                    },{
                        label: __("Show custom 2",value: 'show-custom-2'
                    },{
                        label: __("Show custom 3",value: 'show-custom-3'
                    },]}
                onChange={setState}
            />
        </PanelRow>

        {state === "show-custom-1" &&
            <PanelRow>
                <MyCustom1 />
            </PanelRow>
        }

        {state === "show-custom-2" &&
            <PanelRow>
                <MyCustom2 />
            </PanelRow>
        }

        {state === "show-custom-3" &&
            <PanelRow>
                <MyCustom3 />
            </PanelRow>
        }
    </PanelBody>
)}

export default compose([
    withDispatch((dispatch,props) => {
        return {
            setState: function (value) {
                dispatch('core/editor').editPost({ meta: { _mysite_my_radio_control: value } });
            }
        }
    }),withSelect((select,props) => {
        return {
            state: select('core/editor').getEditedPostAttribute('meta')['_mysite_my_radio_control'],};
    }),])(ParentItem);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?