เริ่มต้นอย่างรวดเร็ว

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เป็นคุณสมบัติที่ควบคุมว่าเมื่อปรับขนาดแผงจะเคลื่อนที่แผงที่อยู่ติดกันอย่างไร ค่าพื้นฐานคือ divorceและสามารถใช้โหมดด้านล่างได้

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

ตั้งค่าวิธีการโต้ตอบระหว่างแผงเมื่อปรับขนาด

"bulldozer": ผลักแผงที่อยู่ติดกันออกไปแต่ไม่ติดกัน

"divorce": ผลักแผงที่อยู่ติดกันออกไปและติดกัน แต่เมื่อกลับมาจะแยกออก (ค่าเริ่มต้น)

"stalker": แผงที่อยู่ติดกันจะติดกันอย่างสมบูรณ์ แต่เมื่อถึงจุดสิ้นสุดจะถูกแยกออก