Bladeren bron

Add onload event handler (#337)

Thomas Brandého 2 jaren geleden
bovenliggende
commit
52aaf365c9
2 gewijzigde bestanden met toevoegingen van 18 en 1 verwijderingen
  1. 9 1
      pynecone/app.py
  2. 9 0
      pynecone/middleware/hydrate_middleware.py

+ 9 - 1
pynecone/app.py

@@ -11,7 +11,7 @@ from pynecone.base import Base
 from pynecone.compiler import compiler
 from pynecone.compiler import compiler
 from pynecone.compiler import utils as compiler_utils
 from pynecone.compiler import utils as compiler_utils
 from pynecone.components.component import Component, ComponentStyle
 from pynecone.components.component import Component, ComponentStyle
-from pynecone.event import Event
+from pynecone.event import Event, EventHandler
 from pynecone.middleware import HydrateMiddleware, Middleware
 from pynecone.middleware import HydrateMiddleware, Middleware
 from pynecone.model import Model
 from pynecone.model import Model
 from pynecone.state import DefaultState, Delta, State, StateManager, StateUpdate
 from pynecone.state import DefaultState, Delta, State, StateManager, StateUpdate
@@ -45,6 +45,9 @@ class App(Base):
     # Middleware to add to the app.
     # Middleware to add to the app.
     middleware: List[Middleware] = []
     middleware: List[Middleware] = []
 
 
+    # events handlers to trigger when a page load
+    load_events: Dict[str, EventHandler] = {}
+
     def __init__(self, *args, **kwargs):
     def __init__(self, *args, **kwargs):
         """Initialize the app.
         """Initialize the app.
 
 
@@ -165,6 +168,7 @@ class App(Base):
         title: str = constants.DEFAULT_TITLE,
         title: str = constants.DEFAULT_TITLE,
         description: str = constants.DEFAULT_DESCRIPTION,
         description: str = constants.DEFAULT_DESCRIPTION,
         image=constants.DEFAULT_IMAGE,
         image=constants.DEFAULT_IMAGE,
+        on_load: Optional[EventHandler] = None,
     ):
     ):
         """Add a page to the app.
         """Add a page to the app.
 
 
@@ -178,6 +182,7 @@ class App(Base):
             title: The title of the page.
             title: The title of the page.
             description: The description of the page.
             description: The description of the page.
             image: The image to display on the page.
             image: The image to display on the page.
+            on_load: The event handler that will be called each time the page load.
         """
         """
         if path is not None:
         if path is not None:
             utils.deprecate(
             utils.deprecate(
@@ -213,6 +218,9 @@ class App(Base):
         self._check_routes_conflict(route)
         self._check_routes_conflict(route)
         self.pages[route] = component
         self.pages[route] = component
 
 
+        if on_load:
+            self.load_events[route] = on_load
+
     def _check_routes_conflict(self, new_route: str):
     def _check_routes_conflict(self, new_route: str):
         """Verify if there is any conflict between the new route and any existing route.
         """Verify if there is any conflict between the new route and any existing route.
 
 

+ 9 - 0
pynecone/middleware/hydrate_middleware.py

@@ -27,4 +27,13 @@ class HydrateMiddleware(Middleware):
             An optional state to return.
             An optional state to return.
         """
         """
         if event.name == utils.get_hydrate_event(state):
         if event.name == utils.get_hydrate_event(state):
+            route = event.router_data.get("pathname", "")
+            if route == "/":
+                load_event = app.load_events.get("index")
+            elif route:
+                load_event = app.load_events.get(route.lstrip("/"))
+            else:
+                load_event = None
+            if load_event:
+                load_event.fn(state)
             return utils.format_state({state.get_name(): state.dict()})
             return utils.format_state({state.get_name(): state.dict()})