Latest Results
refactor(memo): promote memo out of `rx._x.memo` into `rx.memo` (#6517)
* refactor: promote memo out of experimental into rx.memo
Move the memo/custom-component machinery from
``reflex/experimental/memo.py`` and ``reflex_base.components.component``
into a dedicated ``reflex_base.components.memo`` module and expose it as
``rx.memo``. ``rx.experimental.memo`` becomes a deprecated alias, and the
legacy ``CustomComponent`` index path in the compiler is dropped now that
all memos declare their library per-file.
* feat(memo): support rx.EventHandler params in component memos
Component-returning `@rx._x.memo` functions can now declare
`rx.EventHandler[...]` (and bare `rx.EventHandler`) parameters, which compile
to destructured JSX prop callbacks and are wired through `EventChain` at the
call site. Var-returning memos still reject event handlers.
Refactors per-parameter behavior into a `_MemoParamSpec` table keyed by a new
`MemoParamKind` enum (VALUE / CHILDREN / REST / EVENT_TRIGGER), so each kind
owns its classification, validation, placeholder construction, call-site
binding, and JSX signature emission. Adds a `_MemoCallBinding` accumulator
so `_post_init` no longer special-cases prop vs. rest vs. event routing.
* chore(memo): annotate rx.memo return types and tighten arrow_svg sig
Add explicit rx.Component return annotations to memoized helpers across
docs and internal packages, and narrow arrow_svg_component's class_name
to Var[str] now that rx.memo handles the conversion.
* chore(memo): re-add experimental memo shim as deprecated alias
Restore reflex/experimental/memo.py as a thin module redirect to
reflex_base.components.memo so existing rx.experimental.memo imports
keep working with a deprecation warning.
* refactor(memo): drop Experimental prefix from memo registry and types
Rename ExperimentalMemo* classes, EXPERIMENTAL_MEMOS registry, and
related helpers/tests to plain Memo*/MEMOS now that memo is no longer
experimental. Move integration and unit tests out of experimental/ to
mirror the new module location.
* spellfix
* feat(vars): expose EMPTY_VAR_STR and EMPTY_VAR_INT as memo-friendly defaults
Reusable Var-typed empty-value constants so memo signatures can spell
strict defaults without per-call-site `Var.create(...)` (which trips B008)
or bespoke module-level singletons. Updates the memo doc and the
in-tree memos that previously rolled their own empty Var.
* chore(memo): tidy compile_app splats and inline-import cleanup
Drop redundant tuple() wraps around dict.values() splats in
compile_app, and hoist `import inspect` to module scope in the memo
unit tests. Refresh stale "experimental memo" wording in the memo
test docstrings now that the rename has landed.
* feat(memo): support self-referencing memos via name binding during eval
Bind the memo wrapper to the function's name (in both module globals
and any matching free-variable cell) while the body is eagerly
evaluated, so a memo can recursively call itself — e.g. a tree node
component that renders its children through `rx.foreach`. Also refresh
remaining `@rx._x.memo` references in error messages and docstrings now
that the public name is `@rx.memo`.
* chore: update pyi hash for experimental memo
* feat(memo): soft-deprecate missing rx.memo annotations instead of erroring
Missing return annotations default to `rx.Component`, and unannotated
parameters default to `rx.Var[Any]` (or `rx.Var[Component]` for `children`),
emitting a deprecation warning slated for removal in 1.0. Lets downstream
users keep compiling while they migrate to explicit annotations.
* feat(memo): suggest concrete return type in soft-deprecation warning
Infer the body's return type during memo eval and surface the public
`rx`/`rxe` qualname (e.g. `rxe.dnd.Draggable`) in the deprecation
message so users get a copy-pasteable annotation instead of the
generic hint. Update docs to use the inferred annotations.
* chore: update pyi hash for experimental memo
* refactor(memo): drop empty $/utils/components index file
Per-memo wrappers import from `$/utils/components/<name>` directly, so
the empty top-level index module had no callers. Remove the emission and
the now-unused `memo_index_template` and `get_components_path` helpers.
* fix(memo): drop $/utils/components from window bundle
The bundled `$/utils/components` specifier emitted a root.jsx import
from the now-removed index module, breaking the production build with
`Could not load utils/components (Is a directory)`. The bare path no
longer resolves — each memo lives at `$/utils/components/<name>` — so
remove it from the default window bundle.
* add news fragments
---------
Co-authored-by: Masen Furer <m_github@0x26.net> Latest Branches
0%
claude/modest-hypatia-lm4kG 0%
0%
agent-toolkit-launch-banner © 2026 CodSpeed Technology