浏览代码

mro is weird

Khaleel Al-Adhami 2 周之前
父节点
当前提交
a40628b209
共有 1 个文件被更改,包括 21 次插入17 次删除
  1. 21 17
      reflex/components/component.py

+ 21 - 17
reflex/components/component.py

@@ -207,6 +207,8 @@ class BaseComponentMeta(ABCMeta):
     """Meta class for BaseComponent."""
 
     if TYPE_CHECKING:
+        _inherited_fields: Mapping[str, ComponentField]
+        _own_fields: Mapping[str, ComponentField]
         _fields: Mapping[str, ComponentField]
         _js_fields: Mapping[str, ComponentField]
 
@@ -222,22 +224,24 @@ class BaseComponentMeta(ABCMeta):
             The new class.
         """
         # Add the field to the class
-        fields: dict[str, ComponentField] = {}
-        js_fields: dict[str, ComponentField] = {}
+        inherited_fields: dict[str, ComponentField] = {}
+        own_fields: dict[str, ComponentField] = {}
         resolved_annotations = resolve_annotations(
             namespace.get("__annotations__", {}), namespace["__module__"]
         )
 
         for base in bases[::-1]:
-            if hasattr(base, "_fields"):
-                fields.update(base._fields)
-                js_fields.update(base._js_fields)
+            if hasattr(base, "_inherited_fields"):
+                inherited_fields.update(base._inherited_fields)
+        for base in bases[::-1]:
+            if hasattr(base, "_own_fields"):
+                inherited_fields.update(base._own_fields)
 
         for key, value, inherited_field in [
             (key, value, inherited_field)
             for key, value in namespace.items()
             if key not in resolved_annotations
-            and ((inherited_field := fields.get(key)) is not None)
+            and ((inherited_field := inherited_fields.get(key)) is not None)
         ]:
             new_value = ComponentField(
                 default=value,
@@ -245,10 +249,7 @@ class BaseComponentMeta(ABCMeta):
                 annotated_type=inherited_field.annotated_type,
             )
 
-            if new_value.is_javascript:
-                js_fields[key] = new_value
-
-            fields[key] = new_value
+            own_fields[key] = new_value
 
         for key, annotation in resolved_annotations.items():
             value = namespace.get(key, MISSING)
@@ -266,7 +267,7 @@ class BaseComponentMeta(ABCMeta):
                     default=value,
                     is_javascript=(
                         True
-                        if (existing_field := fields.get(key)) is None
+                        if (existing_field := inherited_fields.get(key)) is None
                         else existing_field.is_javascript
                     ),
                     annotated_type=annotation,
@@ -279,13 +280,16 @@ class BaseComponentMeta(ABCMeta):
                     annotated_type=annotation,
                 )
 
-            if value.is_javascript:
-                js_fields[key] = value
+            own_fields[key] = value
 
-            fields[key] = value
-
-        namespace["_fields"] = fields
-        namespace["_js_fields"] = js_fields
+        namespace["_own_fields"] = own_fields
+        namespace["_inherited_fields"] = inherited_fields
+        namespace["_fields"] = inherited_fields | own_fields
+        namespace["_js_fields"] = {
+            key: value
+            for key, value in own_fields.items()
+            if value.is_javascript is True
+        }
         return super().__new__(cls, name, bases, namespace)