将选定颜色的名称从自定义<ColorPalette/>组件传递到`Render_Callback`

时间:2020-10-19 作者:kanlukasz

我有一个自定义块ColorPalette 组成部分在这个组件中,我有一个有多种颜色可供选择的数组。

这个ColorPalette 组件仅传递颜色值。我也想传一下名字

This is what my block looks like:

registerBlockType(\'my/block\', {
    attributes: {
        backgroundColor: {
            type: \'string\',
            default: \'#ffffff\'
        },
    },

    edit({ attributes, setAttributes, className }) {
        const { backgroundColor } = attributes;
        return (
            <Fragment>
                <InspectorControls>
                    <PanelBody title="Container Settings">

                        <ColorPalette
                            colors={[
                                { name: \'bg-danger\', color: \'#dc3545\' },
                                { name: \'bg-dark\', color: \'#343a40\' },
                                { name: \'bg-info\', color: \'#17a2b8\' },
                                { name: \'bg-light\', color: \'#f8f9fa\' },
                                { name: \'bg-secondary\', color: \'#6c757d\' },
                                { name: \'bg-warning\', color: \'#ffc107\' },
                            ]}
                            value={backgroundColor}
                            onChange={(value) => setAttributes({ backgroundColor: value })}
                        />
                    </PanelBody>
                </InspectorControls>
            </Fragment>
        );
    },

    save() {
        // I use `render_callback` where I manage the data ​​returned by the block
        return (null);
    },
});

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

如果只想获取选定的颜色名称,则可以使用getColorObjectByColorValue() 中的函数@wordpress/block-editor 程序包,即wp.blockEditor.getColorObjectByColorValue 在浏览器中。该函数接受两个参数:颜色列表(每个都是colorname 属性)和颜色(十六进制代码,例如。#17a2b8) 你想在颜色列表中找到的。例如:

导入或加载函数:

//import { InspectorControls, getColorObjectByColorValue } from \'@wordpress/block-editor\';
const { InspectorControls, getColorObjectByColorValue } = wp.blockEditor;

const colorList = [
    { name: \'bg-danger\', color: \'#dc3545\' },
    { name: \'bg-dark\', color: \'#343a40\' },
    { name: \'bg-info\', color: \'#17a2b8\' },
    { name: \'bg-light\', color: \'#f8f9fa\' },
    { name: \'bg-secondary\', color: \'#6c757d\' },
    { name: \'bg-warning\', color: \'#ffc107\' },
];

// ...

registerBlockType( \'my/block\', ... );
edit() 函数,您可以使用getColorObjectByColorValue( colorList, backgroundColor ) 获取包含选定颜色的颜色数据/对象。

但实际上,您不一定需要使用getColorObjectByColorValue() 作用您可以使用find() JavaScript中的原型/函数Array... 示例:

const color = colorList.find( ( obj ) => ( backgroundColor === obj.color ) );
所以我要说的是,定义颜色列表并在检索所选颜色时使用它。

奖励:转换backgroundColor 到具有colorname 作为属性,您不必将其转换为对象,只需添加另一个属性,如backgrounColorName, 但我认为这对你和我都有用。:)我还包括了一个样本render_callback 只显示颜色代码和名称的函数。

定义块属性:

attributes: {
    backgroundColor: {
        type: \'object\',
        properties: {
            color: {
                type: \'string\',
                default: \'#ffffff\',
                format: \'hex-color\',
            },
            name: {
                type: \'string\',
                default: \'\',
            },
        },
        default: {
            color: \'#ffffff\',
            name: \'\',
        },
    },
},
backgroundColor.color):

<ColorPalette
    colors={ colorList }
    value={ backgroundColor.color }
    onChange={ ( value ) => setAttributes({ backgroundColor: {
        color: value,
        name: getColorObjectByColorValue( colorList, value ).name,
    } })}
/>

register_block_type( \'my/block\', [
    // The schema should match the one used in your JavaScript.
    \'attributes\'      => [
        \'backgroundColor\' => [
            \'type\'       => \'object\',
            \'properties\' => [
                \'color\' => [
                    \'type\'    => \'string\',
                    \'default\' => \'#ffffff\',
                    \'format\'  => \'hex-color\',
                ],
                \'name\'  => [
                    \'type\'    => \'string\',
                    \'default\' => \'\',
                ],
            ],
            \'default\'    => [
                \'color\' => \'#ffffff\',
                \'name\'  => \'\',
            ],
        ],
    ],
    \'render_callback\' => \'my_block_render_callback\',
] );
render_callback:

function my_block_render_callback( $attrs, $content ) {
    $background = $attrs[\'backgroundColor\'];
    echo \'color: \' . $background[\'color\'];
    echo \'; name: \' . $background[\'name\'];
}
我希望这会有所帮助,有关属性的更多详细信息,请查看:

相关推荐

如何在Pluggable.php中使用我的插件文件中的函数

我正在创建一个插件,需要使用get\\u user\\u by()和wp\\u check\\u password()以及wordpress pluggable中提供的一些很酷的函数。但是它总是抛出一个未定义的函数错误。但是如果我像这样直接在插件文件中包含该文件include (ABSPATH . \'wp_includes/pluggable.php\') 我将能够在我的插件中使用这些函数,但我读到直接包含这些文件并不好,所以我想知道最好的方法来避免冲突。我也尝试过创建这样的函数add_act