我正在尝试构建一个带有导航选项卡的应用程序,并尝试使用最佳方式为整个应用程序提供状态。目前这些选项卡是功能性的,但我正在努力实现一种方法,使用 Yew 前端单页应用程序框架通过 rust 中的状态映射和恢复选项卡导航。如何将这些选项卡及其各自的上下文部分链接到状态?
我的目标是:
使用 Rust 和 Yew crate 实现有状态的选项卡导航。
我设置了一个 toggle_tab 函数,它使用 STDweb 库通过 , 类迭代现有的tabcontent
HTML set attribute ("style", "display: none;")
。然后我根据唯一的类名进行匹配(通过函数输入并onclick
从退出的 HTML 中调用)。
从Github 上的 Yew 示例中,我知道我可能需要将存储实现为状态并将状态实现为模型。用 Yew & Rust 实现应用导航的好方法是什么?
HTML 和切换功能:
impl Renderable<Model> for Model {
fn view(&self) -> Html<Self> {
html! {
<>
<nav class="tab grey lighten-2">
<div class="nav-wrapper">
// BUTTONS
<ul class="row">
<div class="col s1" >
<button class="tablinks brand-logo welcome " onclick=|e| toggle_tab(e, ".welcome")>{"Welcome"}</button>
</div>
<div class="col s1 push-s1" >
<button class="tablinks brand-logo home active" onclick=|e| toggle_tab(e, ".home")>{"Home"}</button>
</div>
</ul>
</div>
</nav>
//SNIPPETS
<div class="tabcontent white welcome content" >
<Welcome/>
</div>
<div class="tabcontent white home content" style="display: block;">
// <HomeTabs/>
</div>
</>
}
}
}
fn toggle_tab(event: ClickEvent, tab_unique_class_name: &str) {
use crate::stdweb::web::{IElement, IParentNode, INonElementParentNode};
// Get all elements with class="tabcontent" and hide them
for tab in document().query_selector_all(".tabcontent").unwrap() {
let tab: Element = tab.try_into().unwrap();
tab.set_attribute("style", "display: none;").unwrap();
}
// Get all elements with class="tablinks" and remove the class "active"
for tab in document().query_selector_all(".tablinks").unwrap() {
let tab: Element = tab.try_into().unwrap();
tab.class_list().remove("active");
}
let matching_tabs = document().query_selector_all(tab_unique_class_name).unwrap();
match tab_unique_class_name {
".welcome" => {
for elem in matching_tabs.iter() {
let elem: Element = elem.try_into().unwrap();
elem.class_list().add("active");
elem.set_attribute("style", "display: block");
}
}
".home" => {
for elem in matching_tabs.iter() {
let elem: Element = elem.try_into().unwrap();
elem.class_list().add("active");
elem.set_attribute("style", "display: block");
document().get_element_by_id("dashboard").unwrap().set_attribute("style", "display: block;");
}
}
".campaign" => {
for elem in matching_tabs.iter() {
let elem: Element = elem.try_into().unwrap();
elem.class_list().add("active");
elem.set_attribute("style", "display: block");
}
}
".comming_soon" => {
for elem in matching_tabs.iter() {
let elem: Element = elem.try_into().unwrap();
elem.class_list().add("active");
elem.set_attribute("style", "display: block");
}
}
_ => alert("Catchall WHoahw!"),
}
}
源代码
如果看到更多代码有帮助,我在这里上传了当前源代码https://github.com/robust-systems/Rust_MVC/blob/master/src/components/tabs_level_1.rs
这非常重要,非常感谢您的任何指导。
我意识到这是一个相当抽象和冗长的问题,所以如果取得任何进展,我会在这里更新。