门户
什么是门户?
门户提供了一种一流的方法,可将子级渲染到父组件的 DOM 层级外部存在的 DOM 节点中。 yew::create_portal(child, host)
返回一个 Html
值,该值渲染 child
,使其不在其父组件的层级下,而作为 host
元素的子级。
用法
门户的典型用法包括模态对话框和悬停卡,以及更技术性的应用程序,例如控制元素的 shadowRoot
的内容,将样式表附加到周围文档的 <head>
,并在 <svg>
的中心 <defs>
元素中收集引用的元素。
请注意,yew::create_portal
是一个低级构建块。库应使用它来实现高级 API,然后应用程序可以使用这些 API。例如,这里有一个简单的模态对话框,它将它的 children
呈现到 yew
无法控制的元素中,该元素由 id="modal_host"
标识。
use yew::prelude::*;
#[derive(Properties, PartialEq)]
pub struct ModalProps {
#[prop_or_default]
pub children: Html,
}
#[function_component]
fn Modal(props: &ModalProps) -> Html {
let modal_host = gloo::utils::document()
.get_element_by_id("modal_host")
.expect("Expected to find a #modal_host element");
create_portal(
props.children.clone(),
modal_host.into(),
)
}
事件处理
在门户内元素上触发的事件在冒泡时遵循虚拟 DOM。也就是说,如果门户被呈现为元素的子元素,那么该元素上的事件侦听器将捕获从门户内部派发的事件,即使门户在实际 DOM 中不相关的某个位置呈现其内容。
这允许开发人员不必知道他们使用的组件是否使用门户实现。无论如何,在其子元素上触发的事件都会冒泡。
一个已知问题是,从门户到关闭的影子根的事件将被派发两次,一次针对影子根内的元素,另一次针对主机元素本身。请记住,打开的影子根工作正常。如果这影响到你,请随时就此打开一个错误报告。