嗯,我想出来了。虽然我的解决方案可能还远远不够优雅(我不会对超时或可用性/可访问性做出让步)。我的问题主要是过度配置、复制和粘贴错误,以及需要应用异步/等待关键字。
属性如下所示:
attributes: {
url: {
source: \'attribute\',
type: \'string\',
selector: \'.o_microlink\',
attribute: \'href\',
},
title: {
type: \'string\',
source: \'text\',
selector: \'.o_microlink\',
}
编辑功能如下所示:
edit: ({ attributes, setAttributes, className }) => {
const onChangeURL = async value => {
const response = await fetch( `https://api.microlink.io?url=${ value }`, {
cache: \'no-cache\',
headers: {
\'user-agent\': \'WP Block\',
\'content-type\': \'application/json\'
},
method: \'GET\',
redirect: \'follow\',
referrer: \'no-referrer\',
})
.then(
returned => {
if (returned.ok) return returned;
throw new Error(\'Network response was not ok.\');
}
);
let data = await response.json();
data = data.data;
setAttributes( { url: value[0] } );
setAttributes( { title: data.title} );
};
return <div className={className}>
<RichText
tagName="div"
placeholder={__(\'Add URL here.\')}
value={attributes.url}
onChange={onChangeURL}
/>
{!attributes.title ? __(\'Add URL\') : <div> {attributes.title} </div>}
</div>;
}
值得注意的要求是箭头函数中的async关键字和赋值中的两个await关键字。(我没有在这里捕捉到错误,也没有将用户代理设置为任何有用的内容。)url
value
在里面
onChangeURL
正在设置为一个项目的数组,我不知道为什么。
和保存功能:
save: ({ attributes, className }) => {
return <div className={ className }>
<a className="o_microlink" href={ attributes.url }> { attributes.title } </a>
</div>;
}
这很标准,但我把自定义类放错了位置。