分割画面
ドラッグ&ドロップ分割、センタータブの整列、タイトル/ガイド/More UIのカスタマイズを行ったSplit Screenで構成します。
基本SplitScreen
FlexLayoutSplitScreenは中央コンポーネントを基準にbefore/center/after領域をストアで管理します。DragBoxがこの画面上にドロップされると、位置に応じて行または列の分割が生成され、同じcenterに入った画面はタブのように管理されます。
<FlexLayoutSplitScreen
layoutName="editor-split"
containerName="editor-home"
navigationTitle="Home"
>
<HomeView />
</FlexLayoutSplitScreen>navigationTitleとタイトルレンダリング
navigationTitleは画面のラベルデータであり、 navigationTitleComponentはSplit Screenが各ラベルを実際のタイトルUIとしてレンダリングする際に使用する共通ラッパーです。DragBoxはnavigationTitle文字列のみを渡し、navigationTitleComponentを持って移動しません。
function SplitScreenTitle({ children }: { children?: React.ReactNode }) {
return <strong className="split-title">{children}</strong>;
}
<FlexLayoutSplitScreen
layoutName="editor-split"
containerName="editor-home"
navigationTitle="Home"
navigationTitleComponent={<SplitScreenTitle />}
>
<HomeView />
</FlexLayoutSplitScreen>分割ガイドとMore UIのカスタマイズ
titleWrapperComponent
navigationTitleComponentとtitleCloseButtonComponentを一緒に包む共通ラッパーです。省略すると別のDOMラッパーは作成されません。
titleCloseButtonComponent
centerタブの閉じるUIを置き換えます。undefinedの場合はデフォルトのXボタンを使用し、nullの場合は閉じるボタンを隠します。
dropGuideComponent
分割可能な領域にドラッグしたときに表示される基本ガイドUIを置き換えます。省略すると基本ガイド文言が使用されます。
titleMoreButtonComponent
タイトル右の...トリガーのみを置き換えます。undefinedの場合は基本ボタンを使用し、nullの場合はMoreを隠します。
renderTitleMoreMenuItems
基本Moreメニューを保持しつつ、ユーザーメニュー項目を下に追加します。
renderTitleMoreMenu
基本メニュー内容をすべて置き換えます。Portal、位置計算、外クリック、Escape閉じるはライブラリが引き続き処理します。
<FlexLayoutSplitScreen
layoutName="editor-split"
containerName="editor-home"
navigationTitle="Home"
titleWrapperComponent={<div className="split-tab" />}
titleCloseButtonComponent={<button type="button">Close</button>}
dropGuideComponent={<div>Drop here</div>}
titleMoreButtonComponent={<button type="button">Menu</button>}
renderTitleMoreMenuItems={(context) => (
<button
type="button"
onClick={() => {
console.log(context.activeItem);
context.closeMenu();
}}
>
Custom action
</button>
)}
>
<HomeView />
</FlexLayoutSplitScreen>centerタブタイトルの順序変更
同じSplit Screenのcenterタブタイトルをドラッグして順序を変更できます。対象タイトルの左半分に置くと前に、右半分に置くと後ろに移動し、アクティブタブはscreenKeyに基づいて保持されます。
Escapeでドラッグをキャンセル
DragBoxをドラッグ中にEscapeを押すと、現在のドラッグクローンと保留中のドラッグ状態を整理し、isDragging false / isDrop falseの状態を伝播します。分割ガイドUIは即座に消え、その後のmouse/touch終了でもドロップは実行されません。
Next.jsでURLを使って画面をドロップ
import { FlexLayoutSplitScreenDragBox } from "@byeolnaerim/flex-layout/next";
<FlexLayoutSplitScreenDragBox
url="/orders/1"
containerName="order-1"
navigationTitle="Order #1"
>
<button type="button">Order #1</button>
</FlexLayoutSplitScreenDragBox>状態ライフサイクルオプション
preserveStateOnUnmount
true면 FlexLayoutSplitScreen이 언마운트되어도 현재 JavaScript runtime의 in-memory split store를 유지합니다. 브라우저 새로고침 persistence와는 별개이며 기본값은 false입니다.
screenKey
split screen 내 화면을 식별하는 key입니다. 생략하면 내부에서 생성됩니다.
リフレッシュとブラウザURLの復元
<FlexLayoutNextSplitScreen
persistence={{
storage: "auto",
restoreOnReload: true,
syncWithBrowserUrl: true,
}}
>
<FlexLayoutSplitScreen
layoutName="editor-split"
containerName="editor-home"
navigationTitle="Home"
>
<HomeView />
</FlexLayoutSplitScreen>
</FlexLayoutNextSplitScreen>