Remove use of ChildrenRenderer from nested_list (#3436)

* Remove ChildrenRenderer from nested_list.

* Remove undeed conversion.
This commit is contained in:
Kaede Hoshikawa 2023-10-03 19:38:48 +09:00 committed by GitHub
parent 3a365c4059
commit 013440d36a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 76 deletions

View File

@ -1,3 +1,5 @@
use std::iter;
use yew::prelude::*; use yew::prelude::*;
use super::header::ListHeader; use super::header::ListHeader;
@ -48,23 +50,48 @@ impl Component for App {
// note the use of `html_nested!` instead of `html!`. // note the use of `html_nested!` instead of `html!`.
let letters = ('A'..='C') let letters = ('A'..='C')
.map(|letter| html_nested! { <ListItem name={letter.to_string()} {on_hover} /> }); .map(|letter| html_nested! { <ListItem key={format!("letter-{}", letter)} name={letter.to_string()} {on_hover} /> });
html! { html! {
<div class="main" {onmouseover}> <div class="main" {onmouseover}>
<h1>{ "Nested List Demo" }</h1> <h1>{ "Nested List Demo" }</h1>
<List {on_hover} weak_link={list_link}> <List
<ListHeader text="Calling all Rusties!" {on_hover} {list_link} /> {on_hover}
<ListItem name="Rustin" {on_hover} /> weak_link={list_link}
<ListItem hide=true name="Rustaroo" {on_hover} /> header={
<ListItem name="Rustifer" {on_hover}> vec![
<div class="sublist" onmouseover={onmouseoversublist}>{ "Sublist!" }</div> html_nested! {
<List {on_hover} weak_link={sub_list_link}> <ListHeader text="Calling all Rusties!" {on_hover} {list_link} key="header" />
<ListHeader text="Sub Rusties!" {on_hover} list_link={sub_list_link}/> }
<ListItem hide=true name="Hidden Sub" {on_hover} /> ]
{ for letters } }
</List> >
</ListItem> {vec![
html_nested! { <ListItem key="rustin" name="Rustin" {on_hover} /> },
html_nested! { <ListItem key="rustaroo" hide=true name="Rustaroo" {on_hover} /> },
html_nested! {
<ListItem key="rustifer" name="Rustifer" {on_hover}>
<div class="sublist" onmouseover={onmouseoversublist}>{ "Sublist!" }</div>
<List
{on_hover}
weak_link={sub_list_link}
header={
vec![html_nested! {
<ListHeader key="sub-rusties" text="Sub Rusties!" {on_hover} list_link={sub_list_link}/>
}]
}
>
{
iter::once(html_nested! { <ListItem key="hidden-sub" hide=true name="Hidden Sub" {on_hover} /> })
.chain(letters)
.collect::<Vec<_>>()
}
</List>
</ListItem>
},
]}
</List> </List>
{ self.view_last_hovered() } { self.view_last_hovered() }
</div> </div>

View File

@ -1,64 +1,23 @@
use std::rc::Rc; use std::rc::Rc;
use yew::html::ChildrenRenderer;
use yew::prelude::*; use yew::prelude::*;
use yew::virtual_dom::{VChild, VComp}; use yew::virtual_dom::VChild;
use crate::header::{ListHeader, Props as HeaderProps}; use crate::header::ListHeader;
use crate::item::{ListItem, Props as ItemProps}; use crate::item::ListItem;
use crate::{Hovered, WeakComponentLink}; use crate::{Hovered, WeakComponentLink};
#[derive(Clone, PartialEq)]
pub enum Variants {
Item(Rc<<ListItem as Component>::Properties>),
Header(Rc<<ListHeader as Component>::Properties>),
}
impl From<ItemProps> for Variants {
fn from(props: ItemProps) -> Self {
Variants::Item(Rc::new(props))
}
}
impl From<HeaderProps> for Variants {
fn from(props: HeaderProps) -> Self {
Variants::Header(Rc::new(props))
}
}
#[derive(PartialEq, Clone)]
pub struct ListVariant {
props: Variants,
}
impl<CHILD> From<VChild<CHILD>> for ListVariant
where
CHILD: Component,
CHILD::Properties: Into<Variants> + Clone,
{
fn from(vchild: VChild<CHILD>) -> Self {
Self {
props: (*vchild.props).clone().into(),
}
}
}
impl From<ListVariant> for Html {
fn from(variant: ListVariant) -> Html {
match variant.props {
Variants::Header(props) => VComp::new::<ListHeader>(props, None).into(),
Variants::Item(props) => VComp::new::<ListItem>(props, None).into(),
}
}
}
pub enum Msg { pub enum Msg {
HeaderClick, HeaderClick,
} }
#[derive(Clone, PartialEq, Properties)] #[derive(Clone, PartialEq, Properties)]
pub struct Props { pub struct Props {
pub children: ChildrenRenderer<ListVariant>, #[prop_or_default]
pub header: Vec<VChild<ListHeader>>,
#[prop_or_default]
pub children: Vec<VChild<ListItem>>,
pub on_hover: Callback<Hovered>, pub on_hover: Callback<Hovered>,
pub weak_link: WeakComponentLink<List>, pub weak_link: WeakComponentLink<List>,
} }
@ -97,9 +56,9 @@ impl Component for List {
html! { html! {
<div class="list-container" {onmouseover}> <div class="list-container" {onmouseover}>
<div class={classes!("list", inactive)}> <div class={classes!("list", inactive)}>
{ Self::view_header(&ctx.props().children) } { ctx.props().header.clone() }
<div class="items"> <div class="items">
{ Self::view_items(&ctx.props().children) } { Self::view_items(ctx.props().children.clone()) }
</div> </div>
</div> </div>
</div> </div>
@ -108,21 +67,15 @@ impl Component for List {
} }
impl List { impl List {
fn view_header(children: &ChildrenRenderer<ListVariant>) -> Html { fn view_items(children: Vec<VChild<ListItem>>) -> Html {
html! { for children.iter().filter(|c| matches!(c.props, Variants::Header(_))) }
}
fn view_items(children: &ChildrenRenderer<ListVariant>) -> Html {
children children
.iter() .into_iter()
.filter(|c| matches!(&c.props, Variants::Item(props) if !props.hide)) .filter(|c| !c.props.hide)
.enumerate() .enumerate()
.map(|(i, mut c)| { .map(|(i, mut c)| {
if let Variants::Item(props) = c.props { let mut props = (*c.props).clone();
let mut props = (*props).clone(); props.name = format!("#{} - {}", i + 1, props.name);
props.name = format!("#{} - {}", i + 1, props.name); c.props = Rc::new(props);
c.props = Variants::Item(Rc::new(props));
}
c c
}) })
.collect::<Html>() .collect::<Html>()