{"record":{"id":"b5c0fb5fdd57c917","repo":"reflex-dev/reflex","slug":"rx-eventhandler-parameters-are-only-supported-on","errorCode":null,"errorMessage":"`rx.EventHandler` parameters are only supported on component-returning memos. Got `{parameter.name}` in `{fn_name}`.","messagePattern":"`rx\\.EventHandler` parameters are only supported on component-returning memos\\. Got `(.+?)` in `(.+?)`\\.","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/reflex-base/src/reflex_base/components/memo.py","lineNumber":955,"sourceCode":"\n\ndef _validate_rest(\n    parameter: inspect.Parameter, fn_name: str, for_component: bool\n) -> None:\n    if parameter.name == \"children\":\n        msg = f\"`children` in `{fn_name}` cannot be `rx.RestProp`.\"\n        raise TypeError(msg)\n\n\ndef _validate_event_trigger(\n    parameter: inspect.Parameter, fn_name: str, for_component: bool\n) -> None:\n    if not for_component:\n        msg = (\n            f\"`rx.EventHandler` parameters are only supported on component-\"\n            f\"returning memos. Got `{parameter.name}` in `{fn_name}`.\"\n        )\n        raise TypeError(msg)\n    if parameter.name == \"children\":\n        msg = (\n            f\"`children` in `{fn_name}` cannot be an `rx.EventHandler`; \"\n            \"use `rx.Var[rx.Component]`.\"\n        )\n        raise TypeError(msg)\n    if parameter.default is not inspect.Parameter.empty:\n        msg = (\n            f\"`rx.EventHandler` parameter `{parameter.name}` in `{fn_name}` \"\n            \"must not have a default value.\"\n        )\n        raise TypeError(msg)\n\n\ndef _placeholder_name_value(name: str, js_prop_name: str, for_component: bool) -> str:\n    return js_prop_name + CAMEL_CASE_MEMO_MARKER if for_component else name\n\n","sourceCodeStart":937,"sourceCodeEnd":973,"githubUrl":"https://github.com/reflex-dev/reflex/blob/45b8ed5ab735f8a56bbb09a42384f030eb0208e7/packages/reflex-base/src/reflex_base/components/memo.py#L937-L973","documentation":"An `@rx.memo` function declared a parameter annotated `rx.EventHandler`, but event handler props only make sense for memos that return components (they become callable event triggers on the compiled component). A Var-returning memo compiles to a pure expression with no component to attach the trigger to, so Reflex rejects it at decoration time.","triggerScenarios":"Decorating a function whose return annotation is not `rx.Component` (a Var-returning memo) that has a parameter annotated `rx.EventHandler`, e.g. `@rx.memo def total(n: rx.Var[int], on_change: rx.EventHandler) -> rx.Var[int]`. `_validate_event_trigger` runs with `for_component=False` and raises.","commonSituations":"Migrating a component wrapper into a value-computing memo but leaving the `on_change`/`on_click` handler parameter in place; mixing rendering callbacks into pure computed-value helpers.","solutions":["Change the memo to return `rx.Component` if the event handler is required","Remove the `rx.EventHandler` parameter from the Var-returning memo and handle the event in the calling component/state instead","Split into two memos: a Var-returning one for the value and a component-returning one that accepts the event handler"],"exampleFix":"// before\n@rx.memo\ndef total(n: rx.Var[int], on_change: rx.EventHandler) -> rx.Var[int]:\n    return n * 2\n\n// after\n@rx.memo\ndef total(n: rx.Var[int]) -> rx.Var[int]:\n    return n * 2\n\n# handle on_change in the parent component/state","handlingStrategy":"type-guard","validationCode":"import inspect, typing, reflex as rx\n\ndef check_handlers_only_on_components(fn) -> None:\n    hints = typing.get_type_hints(fn)\n    ret = hints.get(\"return\")\n    is_component = rx.Component in typing.get_args(ret or ())\n    for p in inspect.signature(fn).parameters.values():\n        if p.annotation is rx.EventHandler and not is_component:\n            raise TypeError(\"remove rx.EventHandler params from Var-returning memos\")","typeGuard":"import typing, reflex as rx\n\ndef memo_supports_event_handlers(fn) -> bool:\n    ret = typing.get_type_hints(fn).get(\"return\")\n    return rx.Component in typing.get_args(ret or ())","tryCatchPattern":null,"preventionTips":["Annotate memo return types explicitly","Keep event-handler props only in component-returning memos","Handle events in state or the parent component for value memos"],"tags":["reflex","rx-memo","typeerror","event-handler","parameters"],"backgroundTag":"decorator-validation-failed","analyzedSha":"45b8ed5ab735f8a56bbb09a42384f030eb0208e7","analyzedAt":"2026-08-28T19:25:27.644Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}