ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

如何用 Dioxus 的 document 头部组件动态修改页面 Title、Meta 与 Script

如何用 Dioxus 的 document 头部组件动态修改页面 Title、Meta 与 Script 如何用 Dioxus 的 document 头部组件动态修改页面 Title、Meta 与 Script【免费下载链接】dioxusFullstack app framework for web, desktop, and mobile.项目地址: https://gitcode.com/GitHub_Trending/di/dioxus在 Dioxus 应用里页面head中的标题、元数据和脚本不能像普通 DOM 元素那样直接写进rsx!模板而是通过dioxus-document提供的一组头部组件完成Title设置页面标题web 上是浏览器标签页标题桌面端是窗口标题Meta注入meta标签Script注入script标签另外还有同系列的document::Link和Style。这些组件随dioxus::prelude可用无需额外配置。本文给出在rsx!中使用这三类组件的写法、动态更新标题的信号驱动方式以及如何验证结果。需要一开始就明确的边界来自 head 文档除Title外所有头部组件在首次渲染后无法修改后续 props 变化不会反映到 head 中头部组件从组件树移除后对应标签不会从 head 中删除head 中元素的顺序没有保证不要依赖定义顺序。设置并动态更新页面 TitleTitle组件的 children 必须是一个静态字符串或格式化字符串。如果 children 包含组件、条件、循环或片段标题不会被更新见 title.rs 的约束说明。基本用法文档示例use dioxus::prelude::*; fn App() - Element { rsx! { // 渲染 title 到页面 headweb 上设置浏览器标签标题桌面端设置窗口标题 document::Title { My Page } } }Title是头部组件中唯一支持首渲染后修改的。官方示例 document_title.rs 展示了用信号驱动标题实时更新fn app() - Element { let mut unread use_signal(|| 0); rsx! { // 信号变化时标题跟着更新 Title { if unread() 0 { ({unread}) Inbox } else { Inbox } } h1 { Inbox } p { Unread messages: {unread} } button { onclick: move |_| unread 1, New message } button { onclick: move |_| unread.set(0), Mark all read } } }实现上Title在每次渲染时比较文本是否变化变化时调用document.set_title(...)因此它不需要use_effect也能在服务端运行见 title.rs 实现。向 head 注入 Meta 标签Meta组件通过 props 指定meta的属性property、name、charset、http_equiv、content、data均可选另有additional_attributes扩展其他属性见 meta.rs 的MetaProps。官方示例 meta.rs 设置 Open Graph 与描述信息rsx! { document::Meta { property: og:title, content: My Site, } document::Meta { property: og:type, content: website, } document::Meta { property: og:url, content: https://www.example.com, } document::Meta { property: og:image, content: https://example.com/image.jpg, } document::Meta { name: description, content: My Site is a site, } }http_equiv的一个典型用途是refresh跳转文档示例rsx! { // 该 meta 标签会在 10 秒后把用户重定向到 dioxuslabs 主页 document::Meta { http_equiv: refresh, content: 10;urlhttps://dioxuslabs.com, } }注意Meta首次渲染后修改 props 不会反映到 headdebug 构建下会打印tracing警告Changing the props of Meta {} is not supported见 elements/mod.rs 中的use_update_warning。向 head 注入 Script 标签Script组件支持两种方式内联脚本children 作为内容和外部脚本src属性。ScriptProps还提供defer、crossorigin、fetchpriority、integrity、nomodule、nonce、referrerpolicy、type等属性见 script.rs。官方示例 script.rs 两者都展示了rsx! { // 内联脚本 — children 必须是单个文本节点 document::Script { console.log(Hello from an inline script!); } // 外部脚本defer 表示解析完成后执行 document::Script { src: https://cdn.jsdelivr.net/npm/canvas-confetti1.9.3/dist/confetti.browser.min.js, defer: true, } h1 { Script example } p { Open your browsers console to see the inline scripts output. } }两个行为细节按src去重带src的脚本以src为键去重多个组件挂载同一脚本只会插入一次没有src时 children 必须能提取为单个文本节点否则该脚本不会被添加且若既无src又无有效 children 会记录错误日志与Meta一样首渲染后修改 props 不会更新 headdebug 下同样有警告。Script组件的示例文档还指出与在 body 中手写link {}相比Script与 SSR 和预渲染的集成更好。验证结果Title浏览器中查看标签页标题是否为目标文本动态场景中如上面的信号示例操作页面按钮后标题应随之变化桌面端则查看窗口标题。内联 Script打开浏览器控制台按示例应看到Hello from an inline script!输出。Meta在浏览器中查看源代码或检查head中的meta标签是否按 props 生成。误用信号当 children 不满足单文本节点约束时日志中会输出Error while rendering Title: The children of Title must be a single text nodeMeta、Script等组件同理据此可判断标题/脚本未更新的原因。已知限制与边界head 顺序不保证。文档给出的对策是用 ES6 module import 处理脚本间依赖使加载顺序可预测head 文档 的示例static HIGHLIGHT: Asset asset!(/assets/highlight/es/highlight.min.js); static RUST: Asset asset!(/assets/highlight/es/languages/rust.min.js); static STYLE: Asset asset!(/assets/highlight/styles/atom-one-dark.css); fn App() - Element { rsx! { document::Link { rel: stylesheet, href: STYLE } document::Script { type: module, r#import hljs from {HIGHLIGHT}; import rust from {RUST}; hljs.registerLanguage(rust, rust); hljs.highlightAll();# } } }Fullstack 渲染。头部组件兼容 fullstack 渲染但只有初始渲染suspense 边界解析之前中渲染的头部组件才会进入 SSR 输出的 head。需要被搜索引擎看到的元数据务必放在任何 pending 的 suspense 边界之外放在SuspenseBoundary内的头部组件只会在水合后的客户端渲染搜索引擎可能看不到。头部标签不会被移除。即使组件从树中卸载head 中已插入的标签依然保留因此不要依赖卸载来撤销一个 head 标签。扩展属性不支持事件监听。document::*元素的additional_attributes不支持事件监听器和任意值属性遇到时会记录错误日志见 elements/mod.rs 的extend_attributes。各组件的完整 props 定义可直接查阅 meta.rs、script.rs、link.rs 与 title.rsDocumenttrait 的默认实现set_title、create_meta、create_script等见 document.rs。【免费下载链接】dioxusFullstack app framework for web, desktop, and mobile.项目地址: https://gitcode.com/GitHub_Trending/di/dioxus创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表