foreach.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. """Create a list of components from an iterable."""
  2. from __future__ import annotations
  3. from typing import Any, Callable, List
  4. from pynecone.components.component import Component
  5. from pynecone.components.tags import IterTag, Tag
  6. from pynecone.var import BaseVar, Var
  7. class Foreach(Component):
  8. """Display a foreach."""
  9. # The iterable to create components from.
  10. iterable: Var[List]
  11. # A function from the render args to the component.
  12. render_fn: Callable
  13. @classmethod
  14. def create(cls, iterable: Var[List], render_fn: Callable, **props) -> Foreach:
  15. """Create a foreach component.
  16. Args:
  17. iterable: The iterable to create components from.
  18. render_fn: A function from the render args to the component.
  19. **props: The attributes to pass to each child component.
  20. Returns:
  21. The foreach component.
  22. """
  23. try:
  24. type_ = iterable.type_.__args__[0]
  25. except:
  26. type_ = Any
  27. arg = BaseVar(name="_", type_=type_, is_local=True)
  28. return cls(
  29. iterable=iterable,
  30. render_fn=render_fn,
  31. children=[IterTag.render_component(render_fn, arg=arg)],
  32. **props,
  33. )
  34. def _render(self) -> Tag:
  35. return IterTag(iterable=self.iterable, render_fn=self.render_fn)