vue 3 드래그 가능 한 좌우 패 널 분할 구성 요소 구현
효과 도
분해 모듈
전체 flex 레이아웃 사용
왼쪽 판 넬
4.567917.패 널 의 구체 적 인 내용 은 slot 서명 슬롯 을 통 해 들 어 옵 니 다
4.567917.오른쪽 판 넬 의 너 비 는 왼쪽 판 넬 의 너비 에 따라 달라 집 니 다.여기 서 주의해 야 할 것 은 내용 의 너 비 는 flex-auto 를 사용 하여 자동 으로 적응 합 니 다4.567917.이동 단의 자가 적응 이 필요 하 다tailwind 를 사용 하 는 미디어 조회 에 적응 합 니 다
입 참 분해
props
@param{Number}max Width 최대 너비@param{Number}minWidth 최소 너비@param{String}leftTitle 왼쪽 제목@param{String}오른쪽 제목 오른쪽 제목?
right-content{Element}오른쪽 내용
어떻게 드래그 합 니까?
왼쪽 판 넬 과 오른쪽 판 넬 사이 에 숨겨 진 상 자 를 추가 합 니 다.저 는 이 상 자 를 box-shadow 에 숨 깁 니 다.구체 적 인 사건 은 이 div 에서 이 루어 집 니 다.
<div id="line" class="w-2 cursor-move hidden md4:block"onMousedown={hnadleMouseDown}>
</div>
사건 감청
const hnadleMouseDown = (evt: MouseEvent) => {
/* , */
let { pageX, pageY } = evt;
basePosition.pageX = pageX;
basePosition.pageY = pageY;
/* */
document.addEventListener("mousemove", handleMouseMove);
document.addEventListener("mouseup", handleMouseUp);
};
const handleMouseMove = evt => {
/* , */
evt.preventDefault();
/* , dom */
clearTimeout(timer.value);
timer.value = setTimeout(() => {
let { pageX } = evt;
const baseDiv = document.querySelector(".right-border-shadow");
/* , / */
let baseWidth: Number | undefined =
Number(baseDiv?.clientWidth) + (pageX - basePosition.pageX);
baseWidth =
baseWidth > Number(props?.maxWidth) ? props.maxWidth : baseWidth;
baseWidth =
Number(baseWidth) < Number(props?.minWidth)
? props.minWidth
: baseWidth;
baseDiv?.setAttribute("style", `width:${baseWidth}px`);
/* emit */
ctx.emit("drugend");
/* store */
setStore(baseWidth);
}, 50);
};
const handleMouseUp = evt => {
/* , , emit */
const width = document.querySelector(".right-border-shadow")?.clientWidth;
document.removeEventListener("mousemove", handleMouseMove);
document.removeEventListener("mouseup", handleMouseUp);
ctx.emit("drugend", width);
};
너비 처리
style={`width:${
store.get("split-width")
? store.get("split-width")
: props.minWidth
? props.minWidth
: 384
}px`}
최적화 하 다.브 라 우 저 창 너비 수 동 변경
nextTick(() => {
ctx.emit("load", ctx);
MutationObserver = window.MutationObserver;
if (MutationObserver) {
/* , api */
mo = new MutationObserver(function() {
const __wm = document.querySelector("#rezie-id");
// __wm __canvasWM
if (!__wm) {
//
mo.disconnect();
mo = null;
ctx.emit("resize");
}
});
mo.observe(document.querySelector("#rezie-id"), {
attributes: true,
subtree: true,
childList: true,
});
}
});
효력 이 발생 하지 않 았 습 니 다.bug
부모 구성 요소 의 onMounted 갈고리 에서 하위 요 소 를 가 져 오 는 slot 요소 노드 가 잘못 되 었 습 니 다.null 입 니 다.현재 해결 방법 은 하위 구성 요소 의 onMounted 갈고리 에서 load 이 벤트 를 던 지 는 것 입 니 다.부모 구성 요 소 는 onLoad 를 사용 하여 다음 논 리 를 처리 합 니 다.
git 주소
창고 주소
미리 보기 주소
vue 3 드래그 가능 한 좌우 패 널 분할 구성 요소 구현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 vue 3 드래그 가능 좌우 분할 패 널 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Fastapi websocket 및 vue 3(Composition API)1부: FastAPI virtualenv 만들기(선택 사항) FastAPI 및 필요한 모든 것을 다음과 같이 설치하십시오. 생성main.py 파일 및 실행 - 브라우저에서 이 링크 열기http://127.0.0.1:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.