Skip to content

koutaro-masaki/radix-dialog-mount

Repository files navigation

Radix-UI Dialog Mount Boundary Demo

Radix-UI Dialogコンポーネントのマウント境界による状態管理の動作を実証するサンプルプロジェクト。

概要

useStateをDialogContentの内側と外側どちらで宣言するかによって動作が変わることを比較するデモです。

インストール

npm install

使用方法

開発サーバーを起動:

npm run dev

ブラウザで http://localhost:5173 にアクセスしてください。

解説

Radix-UI DialogのDialogContentコンポーネントは、内部でPresenceコンポーネントを利用しています。

Presenceコンポーネントは、presentプロパティに応じてchildrenのレンダリングを制御します。

そのため、DialogContentchildrenに渡されたコンポーネントはDialogopen = trueになるまでマウントされず、open = falseになるとアンマウントされます。

パターン1では、DialogContentの外側でuseStateが宣言されているため、ダイアログを開閉しても状態は保持されます。

一方で、パターン2ではuseStateを宣言しているコンポーネントがDialogContentchildrenに渡されているため、ダイアログが開くまで状態は初期化されず、また、ダイアログが閉じると状態は揮発します。

これはDialogにかぎらず、PopoverやContextMenuなど、Context - Trigger - Contentからなるコンポーネントすべてに共通する挙動です。