クイックスタート
FlexLayoutは基本的に一方向の分割画面を担当します。
基本的なRow分割
<FlexLayout layoutName="basic-row_1" direction="row">
<FlexLayoutContainer containerName="basic-row_1-left" isResizePanel>
<div>Left</div>
</FlexLayoutContainer>
<FlexLayoutContainer containerName="basic-row_1-mid" isResizePanel>
<div>Mid</div>
</FlexLayoutContainer>
<FlexLayoutContainer containerName="basic-row_1-right">
<div>Right</div>
</FlexLayoutContainer>
</FlexLayout>カラム分割 + grow
縦分割で特定の領域比率を事前に付与
<FlexLayout layoutName="basic-column_3" direction="column">
<FlexLayoutContainer containerName="basic-column_3-top" isResizePanel grow={0.45}>
<div>Left</div>
</FlexLayoutContainer>
<FlexLayoutContainer containerName="basic-column_3-mid">
<div>Mid</div>
</FlexLayoutContainer>
<FlexLayoutContainer containerName="basic-column_3-right">
<div>Right</div>
</FlexLayoutContainer>
</FlexLayout>
マルチクロス(ネスト)
二方向以上の分割はFlexLayoutを重ねて生成
<FlexLayout layoutName="basic-row_4" direction="row">
<FlexLayoutContainer containerName="basic-row_4-left" isResizePanel>
<div>
<FlexLayout layoutName="basic-row_4-basic-column-left" direction="column">
<FlexLayoutContainer containerName="basic-row_4-left-top" isResizePanel>
<div>left-top</div>
</FlexLayoutContainer>
<FlexLayoutContainer containerName="basic-row_4-left-bottom">
<div>left-bottom</div>
</FlexLayoutContainer>
</FlexLayout>
</div>
</FlexLayoutContainer>
<FlexLayoutContainer containerName="basic-row_4-right">
<div >
<FlexLayout layoutName="basic-row_4-basic-column-right" direction="column">
<FlexLayoutContainer containerName="basic-row_4-right-top" isResizePanel>
<div>right-top</div>
</FlexLayoutContainer>
<FlexLayoutContainer containerName="basic-row_4-right-bottom">
<div>right-bottom</div>
</FlexLayoutContainer>
</FlexLayout>
</div>
</FlexLayoutContainer>
</FlexLayout>
min/max + isFitContent
リサイズ範囲制限 + コンテンツサイズ基準で制限
FlexLayoutContainerにCSSを使用して最小/最大サイズを指定すると、リサイズされる範囲を調整できます。
const [handleSizeTarget, setHandleSizeTarget] = useState<HTMLElement|null>(null);
useEffect(()=>{
const layoutSubscribe = getLayoutInfos('basic-row_7').subscribe((layout)=>{
const leftContainer = layout.container?.['basic-row_7-left']?.current;
if(leftContainer){
setHandleSizeTarget(leftContainer);
}
});
return ()=>{
layoutSubscribe.unsubscribe();
}
},[])
useEffect(()=>{
if(!handleSizeTarget) return;
handleSizeTarget.style.minWidth = '25px';
handleSizeTarget.style.maxWidth = '180px';
},[handleSizeTarget])またはこのように使用できます。
const { layout: containers, container, resizePanel } = useDecompositionLayout({
layoutName: 'basic-row_7',
containerName: 'basic-row_7-left',
});
useEffect(()=>{
if(!container) return;
container.style.minWidth = '25px';
container.style.maxWidth = '180px';
},[container])実行結果は以下の通りです。
<FlexLayout layoutName="basic-row_7" direction="row">
<FlexLayoutContainer containerName="basic-row_7-left" isResizePanel>
<div>Left</div>
</FlexLayoutContainer>
<FlexLayoutContainer containerName="basic-row_7-mid" isResizePanel>
<div>Mid</div>
</FlexLayoutContainer>
<FlexLayoutContainer
containerName="basic-row_7-right"
isFitContent
>
<div
style={{
whiteSpace: "nowrap",
textWrapMode: "nowrap",
paddingRight:'1rem'
}}
>
I'm Using Fit Content{" "}
</div>
</FlexLayoutContainer>
</FlexLayout>
パネル移動モード (panelMovementMode)
リサイズ時の隣接パネルとの相互作用方法
panelMovementModeは、パネルをリサイズする際に隣接するパネルをどのように移動させるかを制御するプロパティです。デフォルトは divorceで、以下のモードを使用できます。
bulldozer
隣接するパネルを押し出しますが、お互いにくっつきません。
divorce (기본값)
隣接するパネルを押し出し、お互いにくっつきますが、リサイズを開始した位置に戻ると再び分離されます。
stalker
隣接するパネル同士が完全にくっつきますが、最終地点に達したときは再び分離されます。
const [mode, setMode] = useState<"bulldozer" | "divorce" | "stalker">("bulldozer");
<ButtonGroup variant="outlined" size="small">
{["bulldozer", "divorce", "stalker"].map((m) => (
<Button
key={m}
onClick={() => setMode(m)}
variant={mode === m ? "contained" : "outlined"}
>
{m}
</Button>
))}
</ButtonGroup>
<Box
sx={{
height: "100%",
"& [data-container_name]": {
minHeight: "2rem",
},
}}
>
<FlexLayout
layoutName={`panel-movement-demo-${mode}`}
direction="column"
panelMovementMode={mode}
>
<FlexLayoutContainer containerName="panel-top" isResizePanel>
<div>Top</div>
</FlexLayoutContainer>
<FlexLayoutContainer containerName="panel-mid1" isResizePanel>
<div>Mid 1</div>
</FlexLayoutContainer>
<FlexLayoutContainer containerName="panel-mid2" isResizePanel>
<div>Mid 2</div>
</FlexLayoutContainer>
<FlexLayoutContainer containerName="panel-bottom">
<div>Bottom</div>
</FlexLayoutContainer>
</FlexLayout>
</Box>最終確認
isResizePanel
コンテナの兄弟としてリサイズパネルがレンダリングされます。
例: MidとRightの間で、リサイズパネルの所有権はMidにありますが、リサイズパネルは両側の兄弟を扱います。
grow
特定のコンテナの初期比率を「明示」します。
grow未指定のコンテナは、明示されたgrowを除く残りを均等に分配されます。
isFitContent
コンテナが内部の子要素のサイズより大きくリサイズされないように制限します。
panelMovementMode
パネルリサイズ時の隣接パネルとの相互作用の方法を設定します。
"bulldozer"隣接パネルを押し出しますが、くっつきません。
"divorce"隣接パネルを押し出し、くっつきますが、戻ると分離します(デフォルト)。
"stalker"隣接パネル同士が完全にくっつきますが、最終地点に達したときは分離します。