(古登堡块编辑器)使用编辑程序。块编辑过滤器,需要更改html/css类的块编辑组件

时间:2019-01-23 作者:criticalWP

我正在使用自定义图标按钮上的onClick操作,如下所示:

const { createHigherOrderComponent } = wp.compose;
const { Fragment } = wp.element;
const { BlockControls } = wp.editor;
const { Toolbar } = wp.components;
const { IconButton } = wp.components;

const withCollapseControl =  createHigherOrderComponent( ( BlockEdit ) => {

    return ( props ) =>
    {
      props.toggleBlockCollapse = (event) => {

      props.setAttributes({
        collapsed:!props.attributes.collapsed,
      }

      let iconProps = {
        onClick: props.toggleBlockCollapse.bind(props),
        class: "components-icon-button components-toolbar__control",
        label: props.attributes.collapsed ? \'Collapse\' : \'Expand\',
        icon: props.attributes.collapsed ? \'arrow-down\' : \'arrow-up\'
      }
      return (
        <Fragment>
          <BlockEdit { ...props } className=\'collapsed\'/>
          <BlockControls>
            <Toolbar>
              <IconButton { ...iconProps } />
            </Toolbar>
          </BlockControls>
        </Fragment>
      );


     };
    }, "withCollapseControl" );

wp.hooks.addFilter( \'editor.BlockEdit\', \'my-plugin/with-inspector-controls\', withCollapseControl );
我似乎无法向BlockEdit组件添加/删除HTML/CSS类。我可以切换图标按钮,调用setAttributes会触发重新渲染。。。

我希望可以在这里模仿公认答案中的示例,但在我的BlockEdit组件上:Add classname to Gutenberg block wrapper in the editor?

深入研究之后,似乎className在BlockEdit组件上的可重写性可能与在BlockListBlock组件上的不一样。

也许最好的方法是尝试修改BlockListBlock组件的类,但我不确定如何将它们链接在一起,因此可能会寻找这样的解决方案。

谢谢

编辑:请注意,我在示例BlockEdit组件中硬编码了一个类名值,以演示在代码中的其他逻辑独立的情况下失败的地方(添加类名)。共享整个代码,以帮助回答者了解更广泛的背景和我的意图:)

2 个回复
SO网友:criticalWP

我可以通过在自己的标记中包装BlockEdit组件来解决这个问题:

    <Fragment>
      <div className="customClass">
        <BlockEdit { ...props }/>
      <div>
      <BlockControls>
        <Toolbar>
          <IconButton { ...iconProps } />
        </Toolbar>
      </BlockControls>
    </Fragment>

SO网友:Félicette

在这种特定情况下(使用editor.BlockEdit过滤器),类名实际上是一个属性。因此,在设置“collapsed”属性之后,还可以设置类名:

  props.setAttributes({
    collapsed:!props.attributes.collapsed,
    className: \'myClass\'
  });
这最初让我很惊讶,但以下是它在源代码中的用法:

// Generate a class name for the block\'s editable form
const generatedClassName = hasBlockSupport( blockType, \'className\', true ) ?
    getBlockDefaultClassName( name ) : null;
const className = classnames( generatedClassName, attributes.className );
发件人https://github.com/WordPress/gutenberg/blob/master/packages/block-editor/src/components/block-edit/edit.js

相关推荐