Dioxus 开发指南

列表渲染

有什么我们需要将同一组件渲染多次,那我们就可以把它当成一个列表来渲染。

通过列表渲染§

想想我们常用的一些网站:类似于知乎,在主页中会有很多条同样的 文章 块。

它看起来就是这样的:每一个 Post 组件包含了具体内容,但是页面又由多个组件组成。

rsx!(
    div {
        Post {/* some properties */}
        Post {/* some properties */}
        Post {/* some properties */}
    }
)

下面这个例子可以将一个列表渲染为一堆 li 标签:

let names = ["jim", "bob", "jane", "doe"];
let name_list = names.iter().map(|name| rsx!(
    li { "{name}" }
));

rsx!(
    ul {
        name_list
    }
)

上面的代码会先遍历生成单独的 li 标签,再将它全部插入到 ul 中。

它的 HTML 代码会是这样的:

<ul>
    <li> jim </li>
    <li> bob </li>
    <li> jane </li>
    <li> doe </li>
</ul>

过滤迭代器§

Rust 的迭代器非常强大,特别是用于过滤数据时。在构建用户界面时,你可能希望显示被过滤的项目列表。

let names = ["jim", "bob", "jane", "doe"];

let name_list = names
    .iter()
    .filter(|name| name.starts_with('j'))
    .map(|name| rsx!( li { "{name}" }));

render() 方法非常高效,所以最好的做法是让它为我们完成大部分的工作。

列表键§

在很多需要对列表 增删改查 的情况下,我们需要对列表的每一项提供一个 让它可被 Dioxus 识别。 否则你将不知道哪行对应的是哪条数据了。

rsx!( li { key: "a" } )

设置一个便于识别的键可帮助 Dioxus 更好的分辨它,并提供相应的反馈。

为什么 Dioxus 需要键?‘§

如果一个列表了没有唯一标识(我们也可称之为索引),那我们无法确定哪条数据对应哪些东西。 这就很象我们常用的 HashMap ,只有拥有 Key 我们才能快速明白对应关系。而不是像 Vec 一样删除一条数据其他都乱了。

注意,键只会被 Dioxus 私下使用。

Post { key: "{key}", id: "{id}" }