要素
DOM ノード
Yew で DOM ノードを手動で作成または管理する理由はたくさんあります。たとえば、管理されたコンポーネントと競合する可能性のある JS ライブラリとの統合などです。
web-sys
を使用すると、DOM 要素を作成して Node
に変換できます。次に、VRef
を使用して Html
値として使用できます:
use web_sys::{Element, Node};
use yew::prelude::*;
use gloo::utils::document;
#[function_component]
fn MyComponent() -> Html {
// メモ化された関数、一度だけ実行されます
let node = use_memo(
(),
|_| {
// ドキュメントから div 要素を作成
let div: Element = document().create_element("div").unwrap();
// コンテンツ、クラスなどを追加
div.set_inner_html("Hello, World!");
// Element を Node に変換
let node: Node = div.into();
// その Node を Html 値として返す
Html::VRef(node)
},
);
// use_memo は Rc ポインタを返すので、参照解除とクローンが必要です
(*node).clone()
}
動的なタグ名
高階コンポーネントを構築する際、タグ名が静的ではない状況に遭遇することがあります。例えば、Title
コンポーネントがあり、レベル属性に応じて h1
から h6
までの任意の内容をレンダリングする場合です。大きなマッチ式を使用する代わりに、Yew は @{name}
を使用してタグ名を動的に設定することを許可します。ここで、name
は文字列を返す任意の式です。
use yew::prelude::*;
let level = 5;
let text = "Hello World!".to_owned();
html! {
<@{format!("h{}", level)} class="title">{ text }</@>
};
論理値属性
いくつかのコンテンツ属性(例えば、checked、hidden、required)は論理値属性と呼ばれます。Yew では、論理値属性はブール値に設定する必要があります:
use yew::prelude::*;
html! {
<div hidden=true>
{ "This div is hidden." }
</div>
};
これは次の HTML と機能的に同等です:
<div hidden>This div is hidden.</div>
論理値属性を false に設定することは、その属性を使用しないことと同等です。論理式の値を使用することもできます:
use yew::prelude::*;
let no = 1 + 1 != 2;
html! {
<div hidden={no}>
{ "This div is NOT hidden." }
</div>
};
これは次の HTML と機能的に同等です:
<div>This div is NOT hidden.</div>
文字列に似た属性
いくつかの論理値属性に加えて、多くの文字列に似た HTML 属性を扱うことがあります。Yew には、文字列に似た値をコンポーネントに渡すためのいくつかのオプションがあります。
use yew::{html, virtual_dom::AttrValue};
let str_placeholder = "I'm a str!";
let string_placeholder = String::from("I'm a String!");
let attrvalue_placeholder = AttrValue::from("I'm an AttrValue!");
html! {
<div>
<input placeholder={str_placeholder} />
<input placeholder={string_placeholder} />
<input placeholder={attrvalue_placeholder} />
</div>
};
それらはすべて有効ですが、特にクローンを作成する必要がある場合や、別のコンポーネントに属性として渡す必要がある場合は、Yew のカスタム AttrValue
を使用することをお勧めします。
HTML 要素のオプション属性
ほとんどの HTML 属性はオプションの値(Some(x) または None)を使用できます。これにより、属性がオプションとしてマークされている場合にその属性を省略できます。
use yew::prelude::*;
let maybe_id = Some("foobar");
html! {
<div id={maybe_id}></div>
};
属性が None
に設定されている場合、その属性は DOM に設定されません。