私はfetch
を使用してレート制限のあるサードパーティのAPIから情報を取得しようとしています。フロントエンドでAPIを実行する代わりに、edit関数でAPI呼び出しを行うためにfetch
を使用しようとしています。フェッチは機能しているようですが、データを保存できません。どこか私が間違っているところを誰かが提案することができますか?
属性は次のようになります。
attributes: {
url: {
type: 'string',
selector: '.o_microlink',
attribute: 'href',
default: '',
},
title: {
type: 'string',
selector: '.o_microlink',
default: '',
},
}
編集機能は次のようになります。
edit: props => {
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;
props.setAttributes( { url: value } );
props.setAttributes( { title: data.title} );
};
return <div className={ props.className }>
<RichText
tagName="div"
placeholder={ __( 'Add URL here.' ) }
value={ props.attributes.url }
onChange={ onChangeURL }
/>
{ ! props.attributes.title ? __( 'Add URL' ) : <div> { props.attributes.title } </div> }
</div>;
}
保存機能はかなり標準的です。
save: props => {
return (
<div className={ [props.className, 'o_microlink'].join( ' ' ) }>
<a href={ props.url}> { props.title } </a>
</div>
);
}
まあ、私はそれを考え出しました。私の解決策はおそらく洗練されたものからは程遠いですが(私はタイムアウトやユーザビリティ/アクセシビリティのために譲歩をしていない)。私が抱えていた問題は、あまりにも熱心な設定、エラーのコピー&ペースト、そしてasync/awaitキーワードの適用が必要でした。
属性は次のようになります。
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>;
}
注目すべき要件は、arrow関数のasyncキーワードと代入の2つのawaitキーワードです。 value
のurl onChangeURL
は1つの項目の配列として設定されているので、その理由はわかりません。
そして保存機能:
save: ({ attributes, className }) => {
return <div className={ className }>
<a className="o_microlink" href={ attributes.url }> { attributes.title } </a>
</div>;
}
これはかなり標準的ですが、私はカスタムクラスを間違った場所に置いていました。