作用域
组件的 Scope<_>
接口
Scope
是通过消息创建回调并更新自身的机制。我们通过在传递给组件的上下文对象上调用 link()
来获得对它的引用。
send_message
这个函数可以向组件发送消息。消息由 update
方法处理,该方法确定组件是否应重新渲染。
send_message_batch
这个函数可以同时向组件发送多个消息。这类似于 send_message
,但是如果任何消息导致 update
方法返回 true
,则组件将在处理完批处理中的所有消息后重新渲染。
如果给定的参数向量为空,则此函数不执行任何操作。
callback
创建一个回调,当执行时将向组件发送消息。在内部,它将使用提供的闭包返回的消息调用 send_message
。
use yew::{html, Component, Context, Html};
enum Msg {
Text(String),
}
struct Comp;
impl Component for Comp {
type Message = Msg;
type Properties = ();
fn create(_ctx: &Context<Self>) -> Self {
Self
}
fn view(&self, ctx: &Context<Self>) -> Html {
// 创建一个接受一些文本并将其作为 `Msg::Text` 消息变体发送到组件的回调。
let cb = ctx.link().callback(|text: String| Msg::Text(text));
// 上一行是多余的冗长,为了更清晰,可以简化为这样:
let cb = ctx.link().callback(Msg::Text);
// 将 `Msg::Text("Hello World!")` 发送到组件。
cb.emit("Hello World!".to_owned());
html! {
// 在这里放置 HTML
}
}
}
batch_callback
创建一个回调,当执行时将向组件发送一批消息。与 callback
的区别在于,传递给此方法的闭包不必返回消息。相反,闭包可以返回 Vec<Msg>
或 Option<Msg>
,其中 Msg
是组件的消息类型。
Vec<Msg>
被视为一批消息,并在内部使用 send_message_batch
。
Option<Msg>
在值为 Some
时调用 send_message
。如果值为 None
,则不执行任何操作。这可以用于根据情况,不需要更新 的情况。
这是通过使用仅为这些类型实现的 SendAsMessage
trait 实现的。您可以为自己的类型实现 SendAsMessage
,这样可以在 batch_callback
中使用它们。