From 977a3daec4a2797290f77b0e0424af2ad4995989 Mon Sep 17 00:00:00 2001 From: luoxiaozero <48741584+luoxiaozero@users.noreply.github.com> Date: Fri, 12 Jan 2024 20:43:45 +0800 Subject: [PATCH] fix: checkbox item adds tracking value changes (#80) --- thaw/src/checkbox/checkbox_item.rs | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/thaw/src/checkbox/checkbox_item.rs b/thaw/src/checkbox/checkbox_item.rs index cd49a2c..a87456f 100644 --- a/thaw/src/checkbox/checkbox_item.rs +++ b/thaw/src/checkbox/checkbox_item.rs @@ -10,19 +10,31 @@ pub fn CheckboxItem( #[prop(optional, into)] class: MaybeSignal, #[prop(into)] key: String, ) -> impl IntoView { - let checkbox_group = use_checkbox_group(); - let checked = checkbox_group - .0 - .with_untracked(|checkbox_group| checkbox_group.contains(&key)); - let checked = create_rw_signal(checked); + let checkbox_group_value = use_checkbox_group().0; + let checked = create_rw_signal(false); let item_key = store_value(key); + create_effect(move |_| { + let is_checked = + checkbox_group_value.with(|value| item_key.with_value(|key| value.contains(key))); + + if is_checked { + if !checked.get_untracked() { + checked.set(true); + } + } else { + if checked.get_untracked() { + checked.set(false); + } + } + }); + _ = checked.watch(move |checked| { - checkbox_group.0.update(move |checkbox_group| { + checkbox_group_value.update(move |value| { if *checked { - checkbox_group.insert(item_key.get_value()); + value.insert(item_key.get_value()); } else { - checkbox_group.remove(&item_key.get_value()); + value.remove(&item_key.get_value()); } }); });