🔁 Loader & Action

Remix と同じ HTTP サイクル。GET は loader、POST は action、成功後は自動 revalidate。

Crown は独自のクライアント状態管理を増やしません。loader(GET)と action(POST)を Web 標準の HTTP に 1:1 で対応させます。

loader(GET)

画面の初期表示に必要なデータをサーバーでまとめます。page(req, data) の第 2 引数に流れます。

proc loader*(req: Request): seq[Product] = let q = req.search(ProductsQuery) getProducts(q.page, q.sort) proc page*(req: Request, data: seq[Product]): string = render(data)

action(POST)と自動 Revalidate

proc action* は同じパスの POST になります。戻り値が空 / revalidate() / void のとき、Crown は同じルートの loaderpage を再実行して最新 HTML を返します。リダイレクトや明示的な HTML 断片を返せば、revalidate は走りません。

proc action*(req: Request) = db.insert(req.form(AddProduct)) # 成功後に loader → page が自動実行される

crown-postcrown-target が無いフォームは、返ってきたフル HTML ドキュメントでページ全体を差し替えます。