본문으로 건너뛰기

Render Only Visible

renderOnlyVisible 옵션으로 보이는 패널만 DOM에 유지하여 성능을 향상시킵니다.

import Flicking from "@egjs/flicking";
import "@egjs/flicking/dist/flicking.css";
import "./styles.css";

const TOTAL = 20;
const COLORS = ["#3e8ed0", "#00d1b2", "#f14668", "#ffe08a", "#48c78e", "#9c27b0", "#ff5722"];

// Create panels
function createPanels(cameraSelector) {
  const camera = document.querySelector(cameraSelector);
  for (let i = 0; i < TOTAL; i++) {
    const panel = document.createElement("div");
    panel.className = "flicking-panel";
    panel.style.background = COLORS[i % COLORS.length];
    panel.textContent = `Panel ${i + 1}`;
    camera.appendChild(panel);
  }
}

createPanels("#flick-visible .flicking-camera");
createPanels("#flick-normal .flicking-camera");

const visibleCountEl = document.getElementById("visible-count");
const normalCountEl = document.getElementById("normal-count");

function updateCounts() {
  visibleCountEl.textContent = document.querySelectorAll("#flick-visible .flicking-camera > .flicking-panel").length;
  normalCountEl.textContent = document.querySelectorAll("#flick-normal .flicking-camera > .flicking-panel").length;
}

// renderOnlyVisible: true
const visibleFlicking = new Flicking("#flick-visible", {
  align: "prev",
  renderOnlyVisible: true
});

visibleFlicking.on("ready", updateCounts);
visibleFlicking.on("visibleChange", updateCounts);

// renderOnlyVisible: false (default)
const normalFlicking = new Flicking("#flick-normal", {
  align: "prev"
});

normalFlicking.on("ready", updateCounts);

요약

주요 옵션

옵션타입기본값설명
renderOnlyVisiblebooleanfalse보이는 패널만 DOM에 유지

모드별 비교

설정DOM 패널 수스크롤 시메모리
false (기본값)전체 패널변화 없음높음
true보이는 패널만DOM 추가/제거 발생낮음

상세 설명

동작 원리

renderOnlyVisible: true를 설정하면 보이지 않는 패널의 DOM 엘리먼트를 카메라 컨테이너에서 제거합니다.
스크롤하여 새 패널이 화면에 들어오면 DOM에 추가되고, 화면에서 벗어난 패널은 DOM에서 제거됩니다.

// Vanilla JS
const flicking = new Flicking("#flick", {
renderOnlyVisible: true
});
// React
<Flicking renderOnlyVisible={true}>
{panels.map(p => <Panel key={p.id} />)}
</Flicking>

Vanilla JS와 프레임워크의 차이

이 옵션은 Vanilla JS와 프레임워크 모두에서 동작합니다.

환경동작효과
Vanilla JSremoveChild/appendChild로 DOM 제거/추가DOM 노드 수 절감
React / Vue프레임워크 렌더 사이클로 DOM 제거/추가 + 컴포넌트 미렌더링DOM 노드 수 절감 + 렌더링 비용 절감

프레임워크에서는 컴포넌트 자체의 렌더링 비용도 줄어들기 때문에 더 큰 효과를 볼 수 있습니다.

virtual 옵션과의 차이

특성renderOnlyVisiblevirtual
DOM 요소 수보이는 패널만 (점진적 추가/제거)panelsPerView + 버퍼 (고정)
적용 환경모든 환경모든 환경
패널 콘텐츠제한 없음renderPanel 콜백의 innerHTML 문자열만
설정 복잡도단순 (boolean)복잡 (renderPanel 콜백 필요)

사용 시나리오

언제 renderOnlyVisible을 사용하나요?

사용 권장:

  • 패널 수가 많아 DOM 노드를 줄이고 싶은 경우
  • 프레임워크에서 패널 컴포넌트가 복잡한 경우
  • virtual의 복잡성을 피하고 싶은 경우

virtual이 더 적합한 경우:

  • 패널 수가 매우 많은 경우 (100개 이상)
  • 메모리 사용량을 최소화해야 하는 경우
  • 단순한 패널 내용인 경우

관련 링크

관련 옵션

  • virtual: DOM 요소 자체를 제한하는 가상화

관련 데모