Gutenberg/日記005
Attributesについて
ちゃんと調べないでなぁなぁのままのままできてしまった部分を少し補完していこうと思います。Gutenbergのブロックで入力された値を扱うにあたって attributes というプロパティを設けましたが、あれの正体がちゃんとわかっていなかったのですが、いくつかブロックを実装していく中で少し見えてきた気がします。
attributes: {
content: {
source: 'children',
selector: 'p'
}
},
リッチテキストの入力欄を設けたとき↑上記のようなcontentというアトリビュートを設けました。これは実装の参考にしたサイトを見よう見まねでやってみただけで、なんとなくchildrenからpタグを取得するのだろうなと理解しただけでした。childrenって何だよって話です。ちなみにアトリビュートは自分の感覚だと日本語で「属性」なので、content属性って呼ぶのでいいのでしょうか?HTMLのタグの中の「hoge="fuga"」の部分もattributeですね。今どきは何て呼称するんでしょう?
RichTextコンポーネントの中身を見たことがないので、このコンポーネントはsourceに「children」と指定すると中身を渡してくれるのだろうなと勝手に考えていたのですが、後々この考えを改めることになりました。RichTextはあくまでも編集用のUIコンポーネントであって、編集されたデータの実体と切り離して考えるのがよさそうです。
<!-- wp:ameya/hoge-->
<section id="hoge" class="wp-block-ameya-hoge">
<div class="fuga">
<p>RichTextで編集した内容。</p>
</div>
</section>
<!-- /wp:ameya/hoge-->
Wordpressの記事編集画面で Ctrl+Shift+Alt+M キーを押してコードエディタを呼び出すと、ブロックがどのように記録されているか見ることができますが、RichTextで編集されたpタグは本当にpタグとして記録されているだけで、RichTextが何をどうしたというようなことはコードには記載されていません。どうもattributesの設定値はこの該当ブロックのコードに対して意味を持っているようです。では改めて、content属性の「source: 'children'」が何を指しているか考えてみます。これはどうも node.childnodes のことのようです。jQuery風なら$(node).children() かな。selectorで指定された要素の子ノードが属性値としての保存対象であることを明示しているということになります。
<RichText.Content tagName="p" value={ props.attributes.content } />
saveメソッドではRichText.Contentというコンポーネントが登場しましたが、これは「tagNameで指定されたタグの中に、先ほどcontent属性に格納した子ノード(value)を入れて出力する」役割を持ったものなのですね。
ではsourceに指定できる他の値にはどんなものがあるのでしょう?
- children
- text
- html
- attribute
- meta
- query
ザっと見かけたのはこんな感じでした。最近、脱jQueryな案件も多いですが、jQuery風に書いてみます。childrenはさっきの通り。
// content:{selector:'p',source:'children'}
content = $(block).find(selector).children()
textとhtmlもjQuery風に書くとそのまんまです。
// content:{selector:'p',source:'text'}
content = $(block).find(selector).text();
// content:{selector:'p',source:'html'}
content = $(block).find(selector).html();
attributeは属性名も一緒に設定します。
// content:{selector:'img',source:'attribute',attribute:'src'}
content = $(block).find(selector).attr(attribute);
metaはちょっと特殊で、WordpressのGutenbergでは投稿記事のmeta情報を取得できます。詳細は省きますが、カスタムフィールドとの合わせ技に使えますね。
queryは保存対象を複雑に指定したいときに使うもののようです。例えば、imgタグのsrc属性とalt属性をペアで取得する場合は以下の感じだそうです。
content:{
source: 'query'
selector: 'img',
query: {
src: { source: 'attribute', attribute: 'src' },
alt: { source: 'attribute', attribute: 'alt' },
}
}
typeも指定できる
source, selectorの他にtypeという指定もできるようです。
- string
- number
- array
よくみかけたのは↑この辺です。属性値の種別(type)を指定するもののようですね。arrayは複数の値を配列にして取得するものでしょうか。selectorで指定した条件に複数のタグが該当した場合に、複数の値を取得できるのでしょう。通常はテキスト情報を扱うことが多いので、string(文字列)を利用することになるのでしょうが、入力された数値を計算に使いたいときなどはnumber(数値)を指定するのでしょう。
- Gutenberg/日記003前回ブロックの構成をある程度把握できたので、今回は実際に使えるブロックに仕上げてみます。簡単な目標として、記事編集画面上でリッチテキストエディタによって中身が編â¦
- Gutenberg/日記006Wordpressの記事編集画面で、テキストの次に入力したくなるのは画像情報だと思います。今回は実際に作成したブロックをご紹介します。ブロックの概要は「画像と著â¦
- facebookアプリ/日記2いざ、既存のmixiアプリをfacebookアプリに移植しようと思ったのですが、ちょっと立ち止まることにしました。どこから手をつけていいのかわからなくなったのでâ¦
- mixiアプリ/日記3mixiアプリは、mixiサイトのいろいろな場所に設置できることはわかったので、一番表示面積の大きい「アプリ利用画面」に自分で作ったアプリを実際に置いてみることâ¦
- mixiアプリ/日記7登録者数の増加も落ち着いてきた私のアプリですが、先日、新機能を投入してみたところいきなりユーザがまた大きく増加しました。これほど手ごたえがあると機能の追加しがいâ¦
- 開発日記/2018年の日記Chrome(多分Safariも)で発生した問題がありました。display:flexで3つdiv要素を並べていたのですが、ある環境ではそれが崩れるようになってâ¦
- WPF/日記8前回、アバタのアニメーション設定でつまづいてから、長いこと試行錯誤を繰り返した結果、ようやく出口がみえてきた感じです。問題点を整理すると、Identityで書きâ¦
- Gutenberg/日記002前回、create-guten-blockによって生成されたブロックの雛形情報の実体は、プラグインフォルダの中の src/block/blocks.js の中にâ¦
- Vue.js/日記002<div id="app"> {{ message }} </div> 前回、二重括弧({{}})で囲んだ部分がテンプレート機能のようにVue.jsの制御下に置â¦
- Rust/ライフタイムRustに関して、コンパイルの段階で大方の問題はコンパイラが気づいて教えてくれるので「なんて便利な子!?」ってかわいがってきてたんですが、unsafe な文脈にâ¦