我正在为古腾堡编辑器制作一个可编辑按钮。我写了下面的代码,但它不允许我编辑按钮中的文本。有人知道怎么了吗?提前谢谢你。
主题图像/自定义块/块。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\');
最合适的回答,由SO网友:Sally CJ 整理而成
正如我在评论中所说,您的代码对我来说运行良好。
但这可能是因为我在运行默认WordPress设置的测试站点上使用了默认的2021主题(基本上,几乎没有插件)。
我问你的原因是<这是实际的和entire 文件中的代码;,是因为el
和RichText
中的变量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(大多数浏览器都能理解)。