Skip to content

Commit caab8ba

Browse files
authored
preserve prop names to some degree with memo (#5777)
* preserve prop names to some degree with memo * fix tests
1 parent a605e7a commit caab8ba

File tree

7 files changed

+25
-23
lines changed

7 files changed

+25
-23
lines changed

reflex/app.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,12 +1281,12 @@ def memoized_toast_provider():
12811281

12821282
# Compile custom components.
12831283
(
1284-
custom_components_output,
1285-
custom_components_result,
1286-
custom_components_imports,
1287-
) = compiler.compile_components(dict.fromkeys(CUSTOM_COMPONENTS.values()))
1288-
compile_results.append((custom_components_output, custom_components_result))
1289-
all_imports.update(custom_components_imports)
1284+
memo_components_output,
1285+
memo_components_result,
1286+
memo_components_imports,
1287+
) = compiler.compile_memo_components(dict.fromkeys(CUSTOM_COMPONENTS.values()))
1288+
compile_results.append((memo_components_output, memo_components_result))
1289+
all_imports.update(memo_components_imports)
12901290
progress.advance(task)
12911291

12921292
with console.timing("Collect all imports and app wraps"):

reflex/compiler/compiler.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ def _compile_component(component: Component | StatefulComponent) -> str:
336336
return templates.component_template(component=component)
337337

338338

339-
def _compile_components(
339+
def _compile_memo_components(
340340
components: Iterable[CustomComponent],
341341
) -> tuple[str, dict[str, list[ImportVar]]]:
342342
"""Compile the components.
@@ -376,7 +376,7 @@ def _compile_components(
376376

377377
# Compile the components page.
378378
return (
379-
templates.custom_component_template(
379+
templates.memo_components_template(
380380
imports=utils.compile_imports(imports),
381381
components=component_renders,
382382
dynamic_imports=sorted(dynamic_imports),
@@ -565,7 +565,7 @@ def compile_page(path: str, component: BaseComponent) -> tuple[str, str]:
565565
return output_path, code
566566

567567

568-
def compile_components(
568+
def compile_memo_components(
569569
components: Iterable[CustomComponent],
570570
) -> tuple[str, str, dict[str, list[ImportVar]]]:
571571
"""Compile the custom components.
@@ -580,7 +580,7 @@ def compile_components(
580580
output_path = utils.get_components_path()
581581

582582
# Compile the components.
583-
code, imports = _compile_components(components)
583+
code, imports = _compile_memo_components(components)
584584
return output_path, code, imports
585585

586586

reflex/compiler/templates.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from reflex import constants
1010
from reflex.constants import Hooks
11+
from reflex.constants.state import CAMEL_CASE_MEMO_MARKER
1112
from reflex.utils.format import format_state_name, json_dumps
1213
from reflex.vars.base import VarData
1314

@@ -637,7 +638,7 @@ def stateful_components_template(imports: list[_ImportDict], memoized_code: str)
637638
return f"{imports_str}\n{memoized_code}"
638639

639640

640-
def custom_component_template(
641+
def memo_components_template(
641642
imports: list[_ImportDict],
642643
components: list[dict[str, Any]],
643644
dynamic_imports: Iterable[str],
@@ -661,7 +662,7 @@ def custom_component_template(
661662
components_code = ""
662663
for component in components:
663664
components_code += f"""
664-
export const {component["name"]} = memo(({{ {", ".join(component.get("props", []))} }}) => {{
665+
export const {component["name"]} = memo(({{ {",".join([f"{prop}:{prop}{CAMEL_CASE_MEMO_MARKER}" for prop in component.get("props", [])])} }}) => {{
665666
{_render_hooks(component.get("hooks", {}))}
666667
return(
667668
{_RenderUtils.render(component["render"])}

reflex/components/component.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
PageNames,
3838
)
3939
from reflex.constants.compiler import SpecialAttributes
40-
from reflex.constants.state import FRONTEND_EVENT_STATE, MEMO_MARKER
40+
from reflex.constants.state import CAMEL_CASE_MEMO_MARKER, FRONTEND_EVENT_STATE
4141
from reflex.event import (
4242
EventCallback,
4343
EventChain,
@@ -1983,7 +1983,7 @@ def get_args_spec(key: str) -> types.ArgsSpec | Sequence[types.ArgsSpec]:
19831983

19841984
super()._post_init(
19851985
event_triggers={
1986-
key + MEMO_MARKER: EventChain.create(
1986+
key: EventChain.create(
19871987
value=props[key],
19881988
args_spec=get_args_spec(key),
19891989
key=key,
@@ -1994,9 +1994,7 @@ def get_args_spec(key: str) -> types.ArgsSpec | Sequence[types.ArgsSpec]:
19941994
)
19951995

19961996
to_camel_cased_props = {
1997-
format.to_camel_case(key + MEMO_MARKER): None
1998-
for key in props
1999-
if key not in event_types
1997+
format.to_camel_case(key): None for key in props if key not in event_types
20001998
}
20011999
self.get_props = lambda: to_camel_cased_props # pyright: ignore [reportIncompatibleVariableOverride]
20022000

@@ -2011,7 +2009,7 @@ def get_args_spec(key: str) -> types.ArgsSpec | Sequence[types.ArgsSpec]:
20112009
if key not in props_types:
20122010
continue
20132011

2014-
camel_cased_key = format.to_camel_case(key + MEMO_MARKER)
2012+
camel_cased_key = format.to_camel_case(key)
20152013

20162014
# Get the type based on the annotation.
20172015
type_ = props_types[key]
@@ -2101,11 +2099,13 @@ def get_prop_vars(self) -> list[Var | Callable]:
21012099
"""
21022100
return [
21032101
Var(
2104-
_js_expr=name,
2102+
_js_expr=name + CAMEL_CASE_MEMO_MARKER,
21052103
_var_type=(prop._var_type if isinstance(prop, Var) else type(prop)),
21062104
).guess_type()
21072105
if isinstance(prop, Var) or not isinstance(prop, EventChain)
2108-
else CustomComponent._get_event_spec_from_args_spec(name, prop)
2106+
else CustomComponent._get_event_spec_from_args_spec(
2107+
name + CAMEL_CASE_MEMO_MARKER, prop
2108+
)
21092109
for name, prop in self.props.items()
21102110
]
21112111

reflex/constants/state.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ class StateManagerMode(str, Enum):
1616

1717
FIELD_MARKER = "_rx_state_"
1818
MEMO_MARKER = "_rx_memo_"
19+
CAMEL_CASE_MEMO_MARKER = "RxMemo"

tests/units/components/markdown/test_markdown.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ def test_create_map_fn_var_subclass(cls, fn_body, fn_args, explicit_return, expe
169169
(
170170
"code",
171171
{"codeblock": syntax_highlighter_memoized_component(CodeBlock)},
172-
r"""(({node, inline, className, children, ...props}) => { const match = (className || '').match(/language-(?<lang>.*)/); let _language = match ? match[1] : ''; ; return inline ? ( jsx(RadixThemesCode,{...props},children) ) : ( jsx(CodeBlock,{codeRxMemo:((Array.isArray(children)) ? children.join("\n") : children),languageRxMemo:_language,...props},) ); })""",
172+
r"""(({node, inline, className, children, ...props}) => { const match = (className || '').match(/language-(?<lang>.*)/); let _language = match ? match[1] : ''; ; return inline ? ( jsx(RadixThemesCode,{...props},children) ) : ( jsx(CodeBlock,{code:((Array.isArray(children)) ? children.join("\n") : children),language:_language,...props},) ); })""",
173173
),
174174
(
175175
"code",
@@ -178,7 +178,7 @@ def test_create_map_fn_var_subclass(cls, fn_body, fn_args, explicit_return, expe
178178
ShikiHighLevelCodeBlock
179179
)
180180
},
181-
r"""(({node, inline, className, children, ...props}) => { const match = (className || '').match(/language-(?<lang>.*)/); let _language = match ? match[1] : ''; ; return inline ? ( jsx(RadixThemesCode,{...props},children) ) : ( jsx(CodeBlock,{codeRxMemo:((Array.isArray(children)) ? children.join("\n") : children),languageRxMemo:_language,...props},) ); })""",
181+
r"""(({node, inline, className, children, ...props}) => { const match = (className || '').match(/language-(?<lang>.*)/); let _language = match ? match[1] : ''; ; return inline ? ( jsx(RadixThemesCode,{...props},children) ) : ( jsx(CodeBlock,{code:((Array.isArray(children)) ? children.join("\n") : children),language:_language,...props},) ); })""",
182182
),
183183
],
184184
)

tests/units/components/test_component.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -825,7 +825,7 @@ def test_create_custom_component(my_component):
825825
"""
826826
component = rx.memo(my_component)(prop1="test", prop2=1)
827827
assert component.tag == "MyComponent"
828-
assert set(component.get_props()) == {"prop1RxMemo", "prop2RxMemo"}
828+
assert set(component.get_props()) == {"prop1", "prop2"}
829829
assert component.tag in CUSTOM_COMPONENTS
830830

831831

0 commit comments

Comments
 (0)