βμ΄λ€ λ¬Έμ κ° μμλμβ
splitView λ΄μ©λ§ λ°λλ λ° splitView 컨ν μ΄λκΉμ§ 리λ λλ§ λλ€.
βλ¬Έμ μμΈμ΄ 무μμΈκ°μβ
splitView 컨ν μ΄λ μ΄κ³ λ«λ λ‘μ§κ³Ό λ΄μ© λ°κΎΈλ λ‘μ§μ΄ κ°μ μ»΄ν¬λνΈμ μλ€. κ·Έλμ λ΄μ©μ΄ λ°λ λ 컨ν μ΄λ κΉμ§ 리λ λλ§
βν΄κ²°μ± β
λ¨μΌ μ± μ μμΉμΌλ‘ splitView μμ λ΄μ©μ κ²°μ νλ μ»΄ν¬λνΈμ splitView μ΄κ³ λ«λ μ»΄ν¬λνΈλ‘ λΆλ¦¬νλ€.
βμ μ΄λ° ν΄κ²°μ± μ¬μ©νλμβ
splitView μμ λ΄μ©μ κ²°μ νλ μ»΄ν¬λνΈκ° λΆλ¦¬λλ©΄ μμ λ΄μ©μ΄ λ°λμ΄μ λ 컨ν μ΄λλ μν₯μ λ°μ§ μλλ€.
βμ΄λ»κ² μ μ©νλμβ
λΉν¬
//λΆλ¦¬ μ
import SecondaryViewContainer from "./SecondaryViewContainer "
function SplitViewContainer({ PrimaryView }: SplitViewContainerProp) {
//μ¬λ λ‘μ§
const isOpen = useStoreSelector(splitViewStore, (state) => state.isOpen)
//μμ λ΄μ© κ²°μ λ‘μ§
const id = useStoreSelector(splitViewStore, (state) => state.id)
const Content = id != null ? ssulContents[id] : () => null
return (
<div className="relative flex size-full justify-end">
<div
className={`absolute size-full lg:w-3/6 ${
isOpen ? 'lg:left-0' : 'lg:left-1/2 lg:-translate-x-1/2'
} overflow-y-scroll transition-all duration-300 ease-out`}
>
{PrimaryView}
</div>
{isOpen && (
<div className="size-full animate-slide-in-right lg:w-5/12">
<SecondaryViewContainer>
<Content />
</SecondaryViewContainer>
</div>
)}
</div>
)
}
μ νν°
//컨ν
μ΄λ(μ΄κ³ λ«λ λ‘μ§λ§ λ΄λΉ)
function SplitViewContainer({
PrimaryView,
SecondaryView,
}: SplitViewContainerProp) {
const isOpen = useStoreSelector(splitViewStore, (state) => state.isOpen)
return (
<div className="relative flex size-full justify-end">
<div
className={`absolute size-full lg:w-3/6 ${
isOpen ? 'lg:left-0' : 'lg:left-1/2 lg:-translate-x-1/2'
} overflow-y-scroll transition-all duration-300 ease-out`}
>
{PrimaryView}
</div>
{isOpen && (
<div className="size-full animate-slide-in-right lg:w-5/12">
{SecondaryView}
</div>
)}
</div>
)
}
//컨ν
νΈ (μμ λ΄μ©λ¬Ό κ²°μ λ‘μ§λ§ λ΄λΉ)
function SecondaryViewContent({ id }: SecondaryViewContentProps) {
const id = useStoreSelector(splitViewStore, (state) => state.id)
const Content = id != null ? ssulContents[id] : () => null
return (
<article className="prose size-full !max-w-full py-5 md:prose">
<Content />
</article>
)
}
λΆλ¦¬νκ³ λλκΉ propλ λ κ°λ μ±μ΄ μ’μμ‘λ€.
//before
//μΈμ»¨λ리뷰λ μ΄λ¨μ§? μλ¬ΈμΈ μ½λ
function Page() {
return <SplitViewContainer PrimaryView={<PrimaryViewContainer/>} />
}
//after
//νλΌμ΄λ¨Έλ¦¬ λ·°μ μΈμ»¨λ리 λ·°κ° κ°κ° μ΄λ€ μ»΄ν¬λνΈμ§ μμ μλ€.
function Page() {
return (
<SplitViewContainer
PrimaryView={<PrimaryViewContainer/>}
SecondaryView={<SecondaryViewContainer/>}
/>
)
}
λ λλ§ κ°―μ
λΉν¬: 5κ°

μ νν°: 4κ°

λ λλ§ μκ°
λΉν¬: 5.7ms

μ νν°
λ λλ§ μκ° 3.3ms
