保存 SelectControl 选项
Saving SelectControl option
我已经成功创建了一个 WordPress 自定义 Gutenberg 块,并且创建了一个面板部分来存储我所有的块选项。
但是,我对反应还很陌生,我已经设法将其搭建在一起。我试图给这个 select 一个初始状态,并在更改时保存状态。
我知道我需要用 withState 做点什么,但我不确定我是否能看到我的承诺失败了,但我不确定为什么。
// Block Options
const withInspectorControls = createHigherOrderComponent( ( BlockEdit ) => {
return (props) => {
const size = {size:"display-2"};
return (
<Fragment>
<BlockEdit { ...props } />
<InspectorControls>
<PanelBody title="Display Block Settings"
icon="welcome-widgets-menus"
initialOpen={ true }
>
<SelectControl
label="Display Size"
value={size}
options={[
{ label: 'Display 1', value: 'display-1' },
{ label: 'Display 2', value: 'display-2' },
{ label: 'Display 3', value: 'display-3' },
{ label: 'Display 4', value: 'display-4' },
]}
onChange={ ( size ) => { setState( { size:size } ) } }
/>
</PanelBody>
</InspectorControls>
</Fragment>
);
};
}, "withInspectorControl" );
wp.hooks.addFilter( 'editor.BlockEdit', 'display-heading/with-inspector-controls', withInspectorControls );
你走在正确的轨道上。正如您已经提到的,您实际上只需要添加 withState
HOC。这可能看起来像这样:
// 1. add the withState import
import { withState } from '@wordpress/compose';
// 2. wrap your SelectControl with the withState HOC
const MySelectControl = withState( {
// this is your state, in this case display-2 would be the default
size: 'display-2',
} )( ( { size, setState } ) => (
<SelectControl
label="Size"
value={ size }
options={ [
{ label: 'Display 1', value: 'display-1' },
{ label: 'Display 2', value: 'display-2' },
{ label: 'Display 3', value: 'display-3' },
{ label: 'Display 4', value: 'display-4' },
] }
onChange={ ( size ) => { setState( { size } ) } }
/>
) );
// Block Options
const withInspectorControls = createHigherOrderComponent( ( BlockEdit ) => {
return (props) => {
return (
<Fragment>
<BlockEdit { ...props } />
<InspectorControls>
<PanelBody title="Display Block Settings"
icon="welcome-widgets-menus"
initialOpen={ true }
>
// 3. now you can add your component in your panel
<MySelectControl />
</PanelBody>
</InspectorControls>
</Fragment>
);
};
}, "withInspectorControl" );
wp.hooks.addFilter( 'editor.BlockEdit', 'display-heading/with-inspector-controls', withInspectorControls );
Reacts Higher-Order Components 一开始真的很混乱。但是如果您熟悉 OOP
范式,您可以将它们想象成 composition
模式。对于 Gutenberg 开发,最重要的是要知道它们总是 return 一个新组件。这就是为什么我能够像这样使用它 <MySelectControl />
.
我已经成功创建了一个 WordPress 自定义 Gutenberg 块,并且创建了一个面板部分来存储我所有的块选项。
但是,我对反应还很陌生,我已经设法将其搭建在一起。我试图给这个 select 一个初始状态,并在更改时保存状态。
我知道我需要用 withState 做点什么,但我不确定我是否能看到我的承诺失败了,但我不确定为什么。
// Block Options
const withInspectorControls = createHigherOrderComponent( ( BlockEdit ) => {
return (props) => {
const size = {size:"display-2"};
return (
<Fragment>
<BlockEdit { ...props } />
<InspectorControls>
<PanelBody title="Display Block Settings"
icon="welcome-widgets-menus"
initialOpen={ true }
>
<SelectControl
label="Display Size"
value={size}
options={[
{ label: 'Display 1', value: 'display-1' },
{ label: 'Display 2', value: 'display-2' },
{ label: 'Display 3', value: 'display-3' },
{ label: 'Display 4', value: 'display-4' },
]}
onChange={ ( size ) => { setState( { size:size } ) } }
/>
</PanelBody>
</InspectorControls>
</Fragment>
);
};
}, "withInspectorControl" );
wp.hooks.addFilter( 'editor.BlockEdit', 'display-heading/with-inspector-controls', withInspectorControls );
你走在正确的轨道上。正如您已经提到的,您实际上只需要添加 withState
HOC。这可能看起来像这样:
// 1. add the withState import
import { withState } from '@wordpress/compose';
// 2. wrap your SelectControl with the withState HOC
const MySelectControl = withState( {
// this is your state, in this case display-2 would be the default
size: 'display-2',
} )( ( { size, setState } ) => (
<SelectControl
label="Size"
value={ size }
options={ [
{ label: 'Display 1', value: 'display-1' },
{ label: 'Display 2', value: 'display-2' },
{ label: 'Display 3', value: 'display-3' },
{ label: 'Display 4', value: 'display-4' },
] }
onChange={ ( size ) => { setState( { size } ) } }
/>
) );
// Block Options
const withInspectorControls = createHigherOrderComponent( ( BlockEdit ) => {
return (props) => {
return (
<Fragment>
<BlockEdit { ...props } />
<InspectorControls>
<PanelBody title="Display Block Settings"
icon="welcome-widgets-menus"
initialOpen={ true }
>
// 3. now you can add your component in your panel
<MySelectControl />
</PanelBody>
</InspectorControls>
</Fragment>
);
};
}, "withInspectorControl" );
wp.hooks.addFilter( 'editor.BlockEdit', 'display-heading/with-inspector-controls', withInspectorControls );
Reacts Higher-Order Components 一开始真的很混乱。但是如果您熟悉 OOP
范式,您可以将它们想象成 composition
模式。对于 Gutenberg 开发,最重要的是要知道它们总是 return 一个新组件。这就是为什么我能够像这样使用它 <MySelectControl />
.