Open18
Reactについて勉強していく
おまじない的にsetState使ってたけど、ミュータブルでメモリ参照先が同じだからReactが変更を感知できないということを知った。
Reactはどんなアーキテクチャ(MVC・MVVMなど)と言える?
Vue.jsはMVVMだし、ReduxはFluxだった。
hooks時代のReactはどんなアーキテクチャなのか?
React Server Components(RSC)
コンポーネントをサーバーサイドのみで実行することが可能になった。関数単位でクライアント/サーバーサイドの実行を制御できるため、Streaming HTMLと相性が良い。Server Actionsも使える。
Next.jsのApp Routerは上記の流れを汲んだもの。
App Router
ディレクトリ構成
- Collocationにしたい(昨今の流れ&確かにそうだという感覚)。
- 上位のコンポーネントはできるだけサーバーサイドにしたい。
- サーバーサイドとクライアントサイドの処理を簡単に判別できるようにしたい。
- (Remixが流行っていることを踏まえてワンちゃん移行が簡単にできるようにしたい 🐶 )
app/
_components/ <-- 機能に依存しないコンポーネントはここ
button.tsx: Button
users/
(list)/
_logic/
action.ts: action
loader.ts: loader
_view/
userList.tsx: UserList
deleteUserButton.tsx: DeleteUserButton
newUserButton.tsx: newUserButton
page.tsx: UserListPage <-- server
layout.tsx: UserListLayout
[userId]/
(info)/
_logic/
action.ts: action
loader.ts: loader
_view/
userInfo.tsx: UserInfo
deleteUserButton.tsx: DeleteUserButton
editUserButton.tsx: EditUserButton
layout.tsx: UserInfoLayout
page.tsx: UserInfoPage <-- server
edit/
_logic/
action.ts: action
loader.ts: loader
_view/
editUser.tsx: EditUser
updateUserButton.tsx: UpdateUserButton
layout.tsx: UserLayout
page.tsx: UserPage <-- server
new/
_logic/
action.ts: action
loader.ts: loader
_view/
newUser.tsx: NewUser <-- server or client
saveUserButton.tsx: SaveUserButton
layout.tsx: NewUserLayout
page.tsx: NewUserPage <-- server
page.tsx: Page
layout.tsx: Layout
-
page.tsx
にはルーティングに専念してもらう。 - ロジックとビューを分離しておき、
page.tsx
で_logic/
_view/
をそれぞれ呼び出す。 -
action.ts
とloader.ts
はRemixのように切り出す。
これでもいいかも
new/
_components/
saveUserButton.tsx: SaveUserButton
action.ts: action
layout.tsx: NewUserLayout
loader.ts: loader
page.tsx: NewUserPage <-- server
もしくはこれ
new/
_components/
saveUserButton.tsx: SaveUserButton
server.ts: action, loader
layout.tsx: NewUserLayout
page.tsx: NewUserPage <-- server
最後のいいかもな
server.tsがロジックでpage.tsxがビューで分離できてるし
useFormState
フォームが送信されている間に保留中の状態を表示するために、ReactのuseFormStatusフックを使用することができます。
エラーハンドリング
データの再検証とリダイレクト
サーバーアクション内ではユーザーを検証する。
バリデーション
import server onlyがserver.tsで使えるかも?
小技
input
要素の key
を更新することで、意図的に defaultValue
を更新する。
- <input defaultValue={value} />
+ <input key={value} defaultValue={value} />
setterの中身を関数にすることで、useStateを即座に更新する。
- setCount(count + 1)
+ setCount((count) => count + 1)
Remix
Drizzle
console.log(row.toSQL()) // 生のSQLが確認できる。
DuckDB WASM
One
One is a new React framework for web and native, built on Vite.