diff --git a/reflex/components/core/foreach.py b/reflex/components/core/foreach.py index e9222b200..13db48575 100644 --- a/reflex/components/core/foreach.py +++ b/reflex/components/core/foreach.py @@ -54,9 +54,10 @@ class Foreach(Component): TypeError: If the render function is a ComponentState. UntypedVarError: If the iterable is of type Any without a type annotation. """ - from reflex.vars.object import ObjectVar + from reflex.vars import ArrayVar, ObjectVar, StringVar + + iterable = LiteralVar.create(iterable).guess_type() - iterable = LiteralVar.create(iterable) if iterable._var_type == Any: raise ForeachVarError( f"Could not foreach over var `{iterable!s}` of type Any. " @@ -75,6 +76,15 @@ class Foreach(Component): if isinstance(iterable, ObjectVar): iterable = iterable.entries() + if isinstance(iterable, StringVar): + iterable = iterable.split() + + if not isinstance(iterable, ArrayVar): + raise ForeachVarError( + f"Could not foreach over var `{iterable!s}` of type {iterable._var_type}. " + "See https://reflex.dev/docs/library/dynamic-rendering/foreach/" + ) + component = cls( iterable=iterable, render_fn=render_fn, diff --git a/tests/integration/test_var_operations.py b/tests/integration/test_var_operations.py index 16885cd06..35763556a 100644 --- a/tests/integration/test_var_operations.py +++ b/tests/integration/test_var_operations.py @@ -628,6 +628,14 @@ def VarOperations(): ), id="dict_in_foreach3", ), + rx.box( + rx.foreach("abcdef", lambda x: rx.text.span(x + " ")), + id="str_in_foreach", + ), + rx.box( + rx.foreach(VarOperationState.str_var1, lambda x: rx.text.span(x + " ")), + id="str_var_in_foreach", + ), rx.box( rx.foreach( VarOperationState.people, @@ -844,6 +852,8 @@ def test_var_operations(driver, var_operations: AppHarness): ("dict_in_foreach1", "a1b2"), ("dict_in_foreach2", "12"), ("dict_in_foreach3", "1234"), + ("str_in_foreach", "a b c d e f"), + ("str_var_in_foreach", "f i r s t"), ("typed_dict_in_foreach", "Hello Alice33Hello Bob28"), ]