通过将自定义图块按钮放在div中对齐

时间:2022-01-20 作者:Watanabe.N

我制作了我的自定义块按钮。我想把它包起来,水平对齐一个按钮。你怎么能把它包起来?下面的代码有两个问题

不允许编辑按钮中的文本,不允许按钮居中对齐

(function (element, blocks, blockEditor) {
  var el = element.createElement;
  var RichText = blockEditor.RichText;
  blocks.registerBlockType(
    \'custome-namespace/button\',
    {
      title: \'nice button\',
      icon: \'button\',
      category: \'layout\',
      example: {},
      attributes: {
        text: {
          type: \'string\',
          default: \'\',
          source: \'html\',
          selector: \'button\'
        },
        align: {
          type: \'string\',
          default: \'center\',
        }
      },
      supports: {
        align: true,
        justifyContent: true,
        alignItems: true
      },
      edit: function (props) {
        var blockProps = blockEditor.useBlockProps();
        var buttonBlock = el(
          RichText, Object.assign(blockProps, {
            onChange: function handleChange(text) {
              props.setAttributes({ text: text })
            },
            value: props.attributes.text,
            placeholder: \'Input button label\',
            tagName: \'button\',
            className: props.className,
          })
        );
        return el(\'div\', blockProps, buttonBlock)
      },
      save: function (props) {
        var blockProps = blockEditor.useBlockProps.save();
        var buttonBlock = el(
          RichText.Content,
          Object.assign(blockProps, {
            value: props.attributes.text,
            tagName: \'button\',
          })
        );
        return el(\'div\', blockProps, buttonBlock)
      },
    }
  );

})(window.wp.element, window.wp.blocks, window.wp.blockEditor)
非常感谢!

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

如果您打开script debugging or the SCRIPT_DEBUG constant in WordPress, 然后,您会注意到,您的块类型导致React抛出此警告:“quot警告:React无法识别tagName 支持DOM元素“;,因此,在开发块类型时,应该启用脚本调试-至少,您会知道代码会导致警告或错误,即使消息没有意义。。i、 e.它不会告诉你类似的事情;嘿,移除tagName 从您的blockProps 反对"E;.:)

至于问题,或上述警告,是因为block (wrapper) props, i、 e.您的blockProps 变量,包含无效的属性/属性(即tagName) 对于<div> 标记您的edit()save() 函数返回。

该属性将添加到blockProps 当你这样做的时候Object.assign(blockProps, { your props }) 它修改了原始blockProps 对象-Object.assign() 工作原理如下array_merge() 在PHP中,但PHP不修改传递给函数的第一个数组,只返回一个新数组;Object.assign(), 另一方面,修改第一个对象。所以你应该用Object.assign({}, blockProps, { your props }) 相反(请注意{}), i、 e。clone 现有的blockProps 对象,而不是对其进行修改,例如edit():

var buttonBlock = el(
//  RichText, Object.assign(blockProps, {   // bad
// and it\'s bad because it adds the tagName property to the blockProps.

  RichText, Object.assign({}, blockProps, { // good
    ... your props.
  })
);
return el(\'div\', blockProps, buttonBlock)
然而,尽管使用blockProps (或useBlockProps) 在其他元素上不会导致任何错误/警告,我认为上面不需要它,因此我会使用blockProps 仅在div 要素:)

相关推荐