WordPress (Gutenberg) のブロックにて、インナーブロック(InnerBlocks
)を持つ階層構造のブロックで、ルートブロック(親)の atributes
値に合わせてインナーブロック(子孫)の状態を変化(条件分岐)させたい場合、一つの方法として “ブロックコンテキスト” が利用できます。
例えば、カラムスタイルの料金表や定義リストなど、同じスタイルで分割されるインナーブロックを持つようなブロックの場合、ベースとなる背景カラーやテキストカラーをルートブロックで一括で指定したいときなどに利用できます。
ブロックコンテキストは、ルートブロックの block.json にて継承させる属性を providesContext
プロパティで宣言しておき、インナーブロックの block.json にて usesContext
プロパティでルートブロックで宣言した同じ属性を指定することで、ルートブロックの属性の状態をインナーブロックから参照できます。
... "name": "my-plugin/root-block", "attributes": { "commonTextColor": { "typ": "string" }, "commonBackgroundColor": { "type": "string" } }, "providesContext": { "my-plugin/commonTextColor": "commonTextColor", "my-plugin/commonBackgroundColor": "commonBackgroundColor" } ...
... "name": "my-plugin/child-block", "attributes": { "commonTextColor": { "typ": "string" }, "commonBackgroundColor": { "type": "string" } }, "usesContext": [ "my-plugin/commonTextColor", "my-plugin/commonBackgroundColor" ], "parent": [ "my-plugin/root-block" ], ....
上記の場合、コンテキストのキーとして my-plugin/commonTextColor
と my-plugin/commonBackgroundColor
の2つを割り当てています。
キーは他のキーとの重複を避けるため、通常はプラグインの名前空間(上記の場合、my-plugin
)を先頭に付けたものを指定します。
あとは、インナーブロックの edit.js にて props.context[ contextKey ]
としてコンテキスト値を利用します。
const Edit = props => { const { attributes: { commonTextColor, commonBackgroundColor, }, setAttributes } = props; // インナーブロックで個別にカラーが指定されていなければルートブロックで指定されたカラーを利用 const textColor = commonTextColor || props.context[ 'my-plugin/commonTextColor' ]; const backgroundColor = backgroundColor || props.context[ 'my-plugin/backgroundColor' ]; ... } export default Edit;
上記の場合、インナーブロックでもテキストカラーと背景カラーの属性が与えられており、これらが指定されていればインナーブロックの配色を優先し、値がなければルートブロックで指定されている共通のテキストカラーと背景カラーを利用するようになります。