Просмотр исходного кода

fix: subscription should apply internally to hook

Jonathan Kelley 3 лет назад
Родитель
Сommit
07529e491c
2 измененных файлов с 29 добавлено и 14 удалено
  1. 2 1
      examples/fermi.rs
  2. 27 13
      packages/fermi/src/hooks/atom_ref.rs

+ 2 - 1
examples/fermi.rs

@@ -47,7 +47,8 @@ fn ChildWithRef(cx: Scope) -> Element {
                     cx.spawn(async move {
                         names.write().push("asd".to_string());
                     })
-                }
+                },
+                "Add name"
             }
         }
     })

+ 27 - 13
packages/fermi/src/hooks/atom_ref.rs

@@ -16,15 +16,35 @@ use std::{
 pub fn use_atom_ref<T: 'static>(cx: &ScopeState, atom: AtomRef<T>) -> &UseAtomRef<T> {
     let root = use_atom_root(cx);
 
-    cx.use_hook(|_| {
+    &cx.use_hook(|_| {
         root.initialize(atom);
-        UseAtomRef {
-            ptr: atom.unique_id(),
-            root: root.clone(),
-            scope_id: cx.scope_id(),
-            value: root.register(atom, cx.scope_id()),
-        }
+        (
+            UseAtomRef {
+                ptr: atom.unique_id(),
+                root: root.clone(),
+                scope_id: cx.scope_id(),
+                value: root.register(atom, cx.scope_id()),
+            },
+            AtomRefSubscription {
+                ptr: atom.unique_id(),
+                root: root.clone(),
+                scope_id: cx.scope_id(),
+            },
+        )
     })
+    .0
+}
+
+pub struct AtomRefSubscription {
+    ptr: AtomId,
+    root: Rc<AtomRoot>,
+    scope_id: ScopeId,
+}
+
+impl Drop for AtomRefSubscription {
+    fn drop(&mut self) {
+        self.root.unsubscribe(self.ptr, self.scope_id)
+    }
 }
 
 pub struct UseAtomRef<T> {
@@ -65,9 +85,3 @@ impl<T: 'static> UseAtomRef<T> {
         self.root.set(self.ptr, new);
     }
 }
-
-impl<T> Drop for UseAtomRef<T> {
-    fn drop(&mut self) {
-        self.root.unsubscribe(self.ptr, self.scope_id)
-    }
-}