fix: usestate modify panic
This commit is contained in:
1 parent
120ee18368
commit
fb75948363
1 file changed
+13
-10
@@ -39,16 +39,17 @@ pub fn use_state<'a, T: 'static>(
|
|||||||
let setter = Rc::new({
|
let setter = Rc::new({
|
||||||
crate::to_owned![update_callback, slot];
|
crate::to_owned![update_callback, slot];
|
||||||
move |new| {
|
move |new| {
|
||||||
let mut slot = slot.borrow_mut();
|
{
|
||||||
|
let mut slot = slot.borrow_mut();
|
||||||
|
|
||||||
// if there's only one reference (weak or otherwise), we can just swap the values
|
// if there's only one reference (weak or otherwise), we can just swap the values
|
||||||
// Typically happens when the state is set multiple times - we don't want to create a new Rc for each new value
|
// Typically happens when the state is set multiple times - we don't want to create a new Rc for each new value
|
||||||
if let Some(val) = Rc::get_mut(&mut slot) {
|
if let Some(val) = Rc::get_mut(&mut slot) {
|
||||||
*val = new;
|
*val = new;
|
||||||
} else {
|
} else {
|
||||||
*slot = Rc::new(new);
|
*slot = Rc::new(new);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
update_callback();
|
update_callback();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -153,8 +154,10 @@ impl<T: 'static> UseState<T> {
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
pub fn modify(&self, f: impl FnOnce(&T) -> T) {
|
pub fn modify(&self, f: impl FnOnce(&T) -> T) {
|
||||||
let current = self.slot.borrow();
|
let new_val = {
|
||||||
let new_val = f(current.as_ref());
|
let current = self.slot.borrow();
|
||||||
|
f(current.as_ref())
|
||||||
|
};
|
||||||
(self.setter)(new_val);
|
(self.setter)(new_val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user