Browse Source

fix dynamic components

Khaleel Al-Adhami 2 weeks ago
parent
commit
449c00cf8d
2 changed files with 26 additions and 10 deletions
  1. 19 7
      reflex/state.py
  2. 7 3
      reflex/vars/base.py

+ 19 - 7
reflex/state.py

@@ -82,7 +82,6 @@ from reflex.vars.base import (
     Var,
     Var,
     computed_var,
     computed_var,
     dispatch,
     dispatch,
-    get_unique_variable_name,
     is_computed_var,
     is_computed_var,
 )
 )
 
 
@@ -688,9 +687,16 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
 
 
         of_type = of_type or Component
         of_type = of_type or Component
 
 
-        unique_var_name = get_unique_variable_name()
+        unique_var_name = (
+            ("dynamic_" + f.__module__ + "_" + f.__qualname__)
+            .replace("<", "")
+            .replace(">", "")
+            .replace(".", "_")
+        )
+
+        while unique_var_name in cls.vars:
+            unique_var_name += "_"
 
 
-        @computed_var(_js_expr=unique_var_name, return_type=of_type)
         def computed_var_func(state: Self):
         def computed_var_func(state: Self):
             result = f(state)
             result = f(state)
 
 
@@ -702,10 +708,16 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
 
 
             return result
             return result
 
 
-        setattr(cls, unique_var_name, computed_var_func)
-        cls.computed_vars[unique_var_name] = computed_var_func
-        cls.vars[unique_var_name] = computed_var_func
-        cls._update_substate_inherited_vars({unique_var_name: computed_var_func})
+        computed_var_func.__name__ = unique_var_name
+
+        computed_var_func_arg = computed_var(return_type=of_type, cache=False)(
+            computed_var_func
+        )
+
+        setattr(cls, unique_var_name, computed_var_func_arg)
+        cls.computed_vars[unique_var_name] = computed_var_func_arg
+        cls.vars[unique_var_name] = computed_var_func_arg
+        cls._update_substate_inherited_vars({unique_var_name: computed_var_func_arg})
         cls._always_dirty_computed_vars.add(unique_var_name)
         cls._always_dirty_computed_vars.add(unique_var_name)
 
 
         return getattr(cls, unique_var_name)
         return getattr(cls, unique_var_name)

+ 7 - 3
reflex/vars/base.py

@@ -2122,14 +2122,18 @@ class ComputedVar(Var[RETURN_TYPE]):
 
 
         if hint is Any:
         if hint is Any:
             raise UntypedComputedVarError(var_name=fget.__name__)
             raise UntypedComputedVarError(var_name=fget.__name__)
-        kwargs.setdefault("_js_expr", fget.__name__ + "_rx_state_")
+        is_using_fget_name = "_js_expr" not in kwargs
+        js_expr = kwargs.pop("_js_expr", fget.__name__ + "_rx_state_")
         kwargs.setdefault("_var_type", hint)
         kwargs.setdefault("_var_type", hint)
 
 
         Var.__init__(
         Var.__init__(
             self,
             self,
-            _js_expr=kwargs.pop("_js_expr"),
+            _js_expr=js_expr,
             _var_type=kwargs.pop("_var_type"),
             _var_type=kwargs.pop("_var_type"),
-            _var_data=kwargs.pop("_var_data", VarData(field_name=fget.__name__)),
+            _var_data=kwargs.pop(
+                "_var_data",
+                VarData(field_name=fget.__name__) if is_using_fget_name else None,
+            ),
         )
         )
 
 
         if kwargs:
         if kwargs: