古腾堡自定义块的带有RichText的可编辑按钮

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

我正在为古腾堡编辑器制作一个可编辑按钮。我写了下面的代码,但它不允许我编辑按钮中的文本。有人知道怎么了吗?提前谢谢你。

主题图像/自定义块/块。js公司

var el = window.wp.element.createElement;
var RichText = window.wp.blockEditor.RichText;

wp.blocks.registerBlockType( 
  \'custom-namespace/button\',
  {
    title: \'nice_button\',
    icon: \'button\',
    category: \'layout\',
    example: {},
    attributes: {
      text: {
        type: \'string\',
        default: \'\',
        source: \'html\',
        selector: \'button\'
      },
    },
    edit: function (props) {
      var blockProps = wp.blockEditor.useBlockProps();
      return el(
        RichText, Object.assign(blockProps, {
          onChange: function(text) {
            props.setAttributes({text: text})
          },
          value: props.attributes.text,
          placeholder: \'Input your text\',
          tagName: \'button\',
          className: props.className,
        })
      );
    },
    save: function (props) {
      var blockProps = wp.blockEditor.useBlockProps.save();
      return el(
        RichText.Content,
        Object.assign(blockProps, {
          value: props.attributes.text,
          tagName: \'button\',
        })
      );
    },
  }
);
已编辑:更改了名称空间,使其不包含下划线。下面的文件加载块。js公司

主题IR/自定义块/寄存器块。php

<?php
defined(\'ABSPATH\') || exit;

function custom_gutenberg_block_enqueue() {
  wp_register_script(
    \'block-script\',
    get_theme_file_uri(\'/custom-block/block.js\'),
    array(\'wp-block-editor\', \'wp-element\'),
    filemtime(get_theme_file_path(\'/custom-block/block.js\'))
  );

  wp_register_style(
    \'block-editor\',
    get_theme_file_uri(\'/custom-block/editor.css\'),
    array(\'wp-edit-blocks\'),
    filemtime(get_theme_file_path(\'/custom-block/editor.css\'))
  );

  wp_register_style(
    \'block-front\',
    get_theme_file_uri(\'/custom-block/front.css\'),
    array(),
    filemtime(get_theme_file_path(\'/custom-block/front.css\'))
  );

  register_block_type(
    \'custom-namespace/button\',
    array(
      \'editor_script\' => \'block-script\',
      \'editor_style\' => \'block-editor\',
      \'style\' => \'block-front\',
    )
  );
}
add_action(\'init\', \'custom_gutenberg_block_enqueue\');

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

正如我在评论中所说,您的代码对我来说运行良好。

但这可能是因为我在运行默认WordPress设置的测试站点上使用了默认的2021主题(基本上,几乎没有插件)。

我问你的原因是<这是实际的和entire 文件中的代码;,是因为elRichText 中的变量block.js 文件位于全局范围内(就像wp 可以使用“just”访问的对象;wp“;如中所示wp.blocks 以及window.wp 如中所示window.wp.element), 因此,问题很可能发生,因为您的一个变量可能有;“丢失”;它的原始定义可能发生,因为全局范围内的变量很容易被其他脚本覆盖,无论是在插件还是主题中,就像PHP中的全局变量一样。

例如,您定义了el 像这样:var el = window.wp.element.createElement; 这相当于window.el = window.wp.element.createElement;. 现在如果插件稍后在全局范围内重新定义变量,例如。var el = \'foo bar\'; 或者也许window.el = \'foo bar\';, 然后你的edit()save() 函数将出现问题:)(因为el 不再是函数)。

因此,为了防止此类问题的发生,scope your code, e、 g.使用Immediately-Invoked Function Expression (或简称“生命”),比如:

( ( function () { // <- 1. Add this line
    var el = window.wp.element.createElement;
    var RichText = window.wp.blockEditor.RichText;

    wp.blocks.registerBlockType( ... your code );
} )(); // <- 2. Add this line
顺便说一句,如果您还没有这样做,您应该考虑使用ES6/ESNext和JSX进行开发,然后按照JavaScript build setup 有关如何将ES6+JSX代码转换为;“正常”;JavaScript(大多数浏览器都能理解)。

相关推荐