@@ -1223,13 +1223,16 @@ def render(self) -> dict:
12231223 Returns:
12241224 The dictionary for template of component.
12251225 """
1226+ if (cached := self .__dict__ .get ("_cached_render" )) is not None :
1227+ return cached
12261228 tag = self ._render ()
12271229 rendered_dict = dict (
12281230 tag .set (
12291231 children = [child .render () for child in self .children ],
12301232 )
12311233 )
12321234 self ._replace_prop_names (rendered_dict )
1235+ self .__dict__ ["_cached_render" ] = rendered_dict
12331236 return rendered_dict
12341237
12351238 def _replace_prop_names (self , rendered_dict : dict ) -> None :
@@ -1496,6 +1499,8 @@ def _get_all_custom_code(self) -> dict[str, None]:
14961499 Returns:
14971500 The custom code.
14981501 """
1502+ if (cached := self .__dict__ .get ("_cached_all_custom_code" )) is not None :
1503+ return cached
14991504 # Store the code in a set to avoid duplicates.
15001505 code : dict [str , None ] = {}
15011506
@@ -1517,6 +1522,7 @@ def _get_all_custom_code(self) -> dict[str, None]:
15171522 code |= child ._get_all_custom_code ()
15181523
15191524 # Return the code.
1525+ self .__dict__ ["_cached_all_custom_code" ] = code
15201526 return code
15211527
15221528 def _get_dynamic_imports (self ) -> str | None :
@@ -1648,10 +1654,18 @@ def _get_all_imports(self, collapse: bool = False) -> ParsedImportDict:
16481654 Returns:
16491655 The import dict with the required imports.
16501656 """
1657+ if (
1658+ not collapse
1659+ and (cached := self .__dict__ .get ("_cached_all_imports" )) is not None
1660+ ):
1661+ return cached
16511662 imports_ = imports .merge_parsed_imports (
16521663 self ._get_imports (), * [child ._get_all_imports () for child in self .children ]
16531664 )
1654- return imports .collapse_imports (imports_ ) if collapse else imports_
1665+ result = imports .collapse_imports (imports_ ) if collapse else imports_
1666+ if not collapse :
1667+ self .__dict__ ["_cached_all_imports" ] = result
1668+ return result
16551669
16561670 def _get_mount_lifecycle_hook (self ) -> str | None :
16571671 """Generate the component lifecycle hook.
@@ -1805,6 +1819,8 @@ def _get_all_hooks(self) -> dict[str, VarData | None]:
18051819 Returns:
18061820 The code that should appear just before returning the rendered component.
18071821 """
1822+ if (cached := self .__dict__ .get ("_cached_all_hooks" )) is not None :
1823+ return cached
18081824 code = {}
18091825
18101826 # Add the internal hooks for this component.
@@ -1821,6 +1837,7 @@ def _get_all_hooks(self) -> dict[str, VarData | None]:
18211837 for child in self .children :
18221838 code .update (child ._get_all_hooks ())
18231839
1840+ self .__dict__ ["_cached_all_hooks" ] = code
18241841 return code
18251842
18261843 def get_ref (self ) -> str | None :
@@ -2439,13 +2456,20 @@ def _render_stateful_code(
24392456 ) -> str :
24402457 if not self .tag :
24412458 return ""
2459+ cache_key = (
2460+ "_cached_stateful_code_export" if export else "_cached_stateful_code"
2461+ )
2462+ if (cached := self .__dict__ .get (cache_key )) is not None :
2463+ return cached
24422464 # Render the code for this component and hooks.
2443- return stateful_component_template (
2465+ result = stateful_component_template (
24442466 tag_name = self .tag ,
24452467 memo_trigger_hooks = self .memo_trigger_hooks ,
24462468 component = self .component ,
24472469 export = export ,
24482470 )
2471+ self .__dict__ [cache_key ] = result
2472+ return result
24492473
24502474 @classmethod
24512475 def _fix_event_triggers (
0 commit comments