Skip to content

Commit 1485f0e

Browse files
authored
Cleanup examples/function_todomvc/src/main.rs (#3413)
* Update main.rs Add function `make_callback()`. * Cleanup main.rs Removed `.clone()`. * Moved vars inside `if` branch in `entry_edit()`
1 parent 194a1e6 commit 1485f0e

File tree

2 files changed

+44
-70
lines changed

2 files changed

+44
-70
lines changed

examples/function_todomvc/src/components/entry.rs

+26-26
Original file line numberDiff line numberDiff line change
@@ -85,40 +85,40 @@ pub struct EntryEditProps {
8585

8686
#[function_component(EntryEdit)]
8787
pub fn entry_edit(props: &EntryEditProps) -> Html {
88-
let id = props.entry.id;
89-
90-
let target_input_value = |e: &Event| {
91-
let input: HtmlInputElement = e.target_unchecked_into();
92-
input.value()
93-
};
94-
95-
let onblur = {
96-
let edit = props.onedit.clone();
88+
if props.editing {
89+
let id = props.entry.id;
9790

98-
move |e: FocusEvent| {
99-
let value = target_input_value(&e);
100-
edit.emit((id, value))
101-
}
102-
};
91+
let target_input_value = |e: &Event| {
92+
let input: HtmlInputElement = e.target_unchecked_into();
93+
input.value()
94+
};
10395

104-
let onkeypress = {
105-
let edit = props.onedit.clone();
96+
let onblur = {
97+
let edit = props.onedit.clone();
10698

107-
move |e: KeyboardEvent| {
108-
if e.key() == "Enter" {
99+
move |e: FocusEvent| {
109100
let value = target_input_value(&e);
110101
edit.emit((id, value))
111102
}
112-
}
113-
};
103+
};
114104

115-
let onmouseover = |e: MouseEvent| {
116-
e.target_unchecked_into::<HtmlInputElement>()
117-
.focus()
118-
.unwrap_or_default();
119-
};
105+
let onkeypress = {
106+
let edit = props.onedit.clone();
107+
108+
move |e: KeyboardEvent| {
109+
if e.key() == "Enter" {
110+
let value = target_input_value(&e);
111+
edit.emit((id, value))
112+
}
113+
}
114+
};
115+
116+
let onmouseover = |e: MouseEvent| {
117+
e.target_unchecked_into::<HtmlInputElement>()
118+
.focus()
119+
.unwrap_or_default();
120+
};
120121

121-
if props.editing {
122122
html! {
123123
<input
124124
class="edit"

examples/function_todomvc/src/main.rs

+18-44
Original file line numberDiff line numberDiff line change
@@ -22,52 +22,26 @@ fn app() -> Html {
2222
});
2323

2424
// Effect
25-
use_effect_with(state.clone(), move |state| {
25+
use_effect_with(state.clone(), |state| {
2626
LocalStorage::set(KEY, &state.clone().entries).expect("failed to set");
27-
|| ()
2827
});
2928

3029
// Callbacks
31-
let onremove = {
30+
fn make_callback<E, F>(state: &UseReducerHandle<State>, f: F) -> Callback<E>
31+
where
32+
F: Fn(E) -> Action + 'static,
33+
{
3234
let state = state.clone();
33-
Callback::from(move |id: usize| state.dispatch(Action::Remove(id)))
34-
};
35-
36-
let ontoggle = {
37-
let state = state.clone();
38-
Callback::from(move |id: usize| state.dispatch(Action::Toggle(id)))
39-
};
40-
41-
let ontoggle_all = {
42-
let state = state.clone();
43-
Callback::from(move |_| state.dispatch(Action::ToggleAll))
44-
};
45-
46-
let onclear_completed = {
47-
let state = state.clone();
48-
Callback::from(move |_| state.dispatch(Action::ClearCompleted))
49-
};
50-
51-
let onedit = {
52-
let state = state.clone();
53-
Callback::from(move |(id, value): (usize, String)| {
54-
state.dispatch(Action::Edit((id, value)));
55-
})
56-
};
57-
58-
let onadd = {
59-
let state = state.clone();
60-
Callback::from(move |value: String| {
61-
state.dispatch(Action::Add(value));
62-
})
63-
};
35+
Callback::from(move |e: E| state.dispatch(f(e)))
36+
}
6437

65-
let onset_filter = {
66-
let state = state.clone();
67-
Callback::from(move |filter: Filter| {
68-
state.dispatch(Action::SetFilter(filter));
69-
})
70-
};
38+
let onremove = make_callback(&state, Action::Remove);
39+
let ontoggle = make_callback(&state, Action::Toggle);
40+
let ontoggle_all = make_callback(&state, |_| Action::ToggleAll);
41+
let onclear_completed = make_callback(&state, |_| Action::ClearCompleted);
42+
let onedit = make_callback(&state, Action::Edit);
43+
let onadd = make_callback(&state, Action::Add);
44+
let onset_filter = make_callback(&state, Action::SetFilter);
7145

7246
// Helpers
7347
let completed = state
@@ -109,9 +83,9 @@ fn app() -> Html {
10983
{ for state.entries.iter().filter(|e| state.filter.fits(e)).cloned().map(|entry|
11084
html! {
11185
<EntryItem {entry}
112-
ontoggle={ontoggle.clone()}
113-
onremove={onremove.clone()}
114-
onedit={onedit.clone()}
86+
ontoggle={&ontoggle}
87+
onremove={&onremove}
88+
onedit={&onedit}
11589
/>
11690
}) }
11791
</ul>
@@ -126,7 +100,7 @@ fn app() -> Html {
126100
html! {
127101
<FilterItem {filter}
128102
selected={state.filter == filter}
129-
onset_filter={onset_filter.clone()}
103+
onset_filter={&onset_filter}
130104
/>
131105
}
132106
}) }

0 commit comments

Comments
 (0)