hooks.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. """Add standard Hooks wrapper for React."""
  2. from reflex.utils.imports import ImportVar
  3. from reflex.vars import Var, VarData
  4. def _add_react_import(v: Var | None, tags: str | list):
  5. if v is None:
  6. return
  7. if isinstance(tags, str):
  8. tags = [tags]
  9. v._var_data = VarData( # type: ignore
  10. imports={"react": [ImportVar(tag=tag, install=False) for tag in tags]},
  11. )
  12. def const(name, value) -> Var | None:
  13. """Create a constant Var.
  14. Args:
  15. name: The name of the constant.
  16. value: The value of the constant.
  17. Returns:
  18. The constant Var.
  19. """
  20. if isinstance(name, list):
  21. return Var.create(f"const [{', '.join(name)}] = {value}")
  22. return Var.create(f"const {name} = {value}")
  23. def useCallback(func, deps) -> Var | None:
  24. """Create a useCallback hook with a function and dependencies.
  25. Args:
  26. func: The function to wrap.
  27. deps: The dependencies of the function.
  28. Returns:
  29. The useCallback hook.
  30. """
  31. if deps:
  32. v = Var.create(f"useCallback({func}, {deps})")
  33. else:
  34. v = Var.create(f"useCallback({func})")
  35. _add_react_import(v, "useCallback")
  36. return v
  37. def useContext(context) -> Var | None:
  38. """Create a useContext hook with a context.
  39. Args:
  40. context: The context to use.
  41. Returns:
  42. The useContext hook.
  43. """
  44. v = Var.create(f"useContext({context})")
  45. _add_react_import(v, "useContext")
  46. return v
  47. def useRef(default) -> Var | None:
  48. """Create a useRef hook with a default value.
  49. Args:
  50. default: The default value of the ref.
  51. Returns:
  52. The useRef hook.
  53. """
  54. v = Var.create(f"useRef({default})")
  55. _add_react_import(v, "useRef")
  56. return v
  57. def useState(var_name, default=None) -> Var | None:
  58. """Create a useState hook with a variable name and setter name.
  59. Args:
  60. var_name: The name of the variable.
  61. default: The default value of the variable.
  62. Returns:
  63. A useState hook.
  64. """
  65. setter_name = f"set{var_name.capitalize()}"
  66. v = const([var_name, setter_name], f"useState({default})")
  67. _add_react_import(v, "useState")
  68. return v