快速开始
FlexLayout基本上负责单方向的分割屏幕。
基本行分割
tsx
<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>列分割 + 增长
在垂直分割中预先分配特定区域比例
tsx
<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生成
tsx
<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指定最小/最大大小,可以控制调整大小的范围。
tsx
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])或者可以这样使用。
tsx
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])执行结果如下。
tsx
<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是控制在调整大小时如何移动相邻面板的属性。默认值是 离婚,可以使用以下模式。
bulldozer
推开相邻面板,但彼此不粘附。
divorce (기본값)
推开相邻面板并彼此粘附,但如果返回到开始调整大小的位置,则会再次分开。
stalker
相邻面板完全粘附,但到达最末端时会再次分开。
tsx
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
容器的兄弟将渲染为 resize panel。
例如:在 Mid 和 Right 之间,resize panel 的所有权属于 Mid,但 resize panel 处理两侧的兄弟。
grow
明确指定特定容器的初始比例。
未指定 grow 的容器将均匀分配除指定 grow 之外的其余部分。
isFitContent
限制容器的大小不超过内部子元素的大小。
panelMovementMode
设置面板调整大小时与相邻面板的交互方式。
"推土机":推开相邻面板但不粘附
"离婚":推开相邻面板并粘附,但回弹时分离(默认值)
"跟踪者":相邻面板完全粘附,但到达末端时分离