In Reflex, State is the single source of truth for your application's data. Unlike React where state is typically client-side, Reflex state lives on the server, allowing you to use Python's full power for business logic while keeping the UI in sync.
As your app grows, putting everything in one rx.State class becomes unmanageable and slow. Reflex allows you to split logic into Substates.
class ThemeState(rx.State):
is_dark: bool = False
def toggle_mode(self):
self.is_dark = not self.is_dark
class AuthState(rx.State):
user_id: str | None = None
@rx.var
def is_authenticated(self) -> bool:
return self.user_id is not None
Sometimes one state needs to know about another. Reflex provides two key async methods for this:
Retrieves the entire instance of another state. Use this when you need to call methods or modify multiple variables in the target state.
class CartState(rx.State):
async def checkout(self):
auth = await self.get_state(AuthState)
if not auth.is_authenticated:
return rx.redirect("/login")
# Proceed with checkout...
A more efficient way to retrieve a single value without loading the entire target state object.
class AnalyticsState(rx.State):
async def track_view(self):
user_id = await self.get_var_value(AuthState.user_id)
# Track view for user_id...