Element-UI Table을 사용하여 드래그 앤 드롭 기능 구현
이번에는 Element-UI 테이블을 사용하여 드래그 앤 드롭 기능을 구현하는 방법에 대해 소개하겠습니다. Element-UI 테이블을 사용하여 드래그 앤 드롭 기능을 구현하는 경우 다음은 실제 사례입니다. 봐.
Element-UI의 테이블 구성 요소는 매우 강력하지만 우리의 요구 사항은 훨씬 더 강력합니다...
간단하고 투박한 렌더링:
1. 데이터 기반
전통적인 드래그 효과는 모두 mousedown, mousemove, mouseup 이벤트
를 통해 dom 노드 수정 및 삭제를 기반으로 하지만 Vue는 데이터 기반 프런트엔드 프레임워크이므로 개발 중에 dom 운영을 피해야 합니다
그리고 Element의 Table 구성 요소 -UI는 캡슐화되어 있습니다. 매우 엄격하여 DOM을 직접 조작하면 예측할 수 없는 버그가 쉽게 발생할 수 있습니다.
그래서 내 핵심 아이디어는 다음과 같습니다. 테이블 헤더(열)를 배열을 통해 렌더링한 다음 배열 순서를 수정하여 열을 수정합니다. sorting of the list
템플릿 부분:
<p class="w-table" :class="{'w-table_moving': dragState.dragging}"> <el-table :data="data" :border="option.border" :height="option.height" :max-height="option.maxHeight" :style="{ width: parseInt(option.width)+'px' }" :header-cell-class-name="headerCellClassName" > <slot name="fixed"></slot> <el-table-column v-for="(col, index) in tableHeader" :key="index" :prop="col.prop" :label="col.label" :width="col.width" :min-width="col.minWidth" :type="col.type" :header-align="col.headerAlign" :column-key="index.toString()" :render-header="renderHeader" > </el-table-column> </el-table> </p>
위 데이터는 목록 데이터 모음, 옵션은 Table 컴포넌트 구성 항목, header는 상위 컴포넌트에서 전달되는 테이블 헤더 데이터 모음
props: { data: { default: function () { return [] }, type: Array }, header: { default: function () { return [] }, type: Array }, option: { default: function () { return {} }, type: Object } }
구성 항목은 Element-UI
의 API에 따라 삭제될 수 있습니다.그러나 구성 요소 내부에서 사용되는 여러 매개 변수가 있습니다:
1.header-cell-class-name
은 다음과 같은 함수에 바인딩됩니다. 드래그하는 동안 점선 효과를 얻으려면 헤더 셀에 클래스를 동적으로 추가하세요.
2.column-key
는 헤더 배열의 인덱스에 바인딩되어 수정이 필요한 헤더 요소의 첨자를 결정하는 데 사용됩니다
3.render-header
테이블 헤더 렌더링 기능 , 사용자 정의를 추가하는 데 사용됨 mousemove 및 기타 관련 이벤트를 모니터링하는 방법
2. 드래그 상태 기록
드래그 프로세스 중에 몇 가지 주요 매개 변수를 기록해야 합니다.
data () { return { tableHeader: this.header, dragState: { start: -1, // 起始元素的 index end: -1, // 结束元素的 index move: -1, // 移动鼠标时所覆盖的元素 index dragging: false, // 是否正在拖动 direction: undefined // 拖动方向 } } }
또한 상위 요소는 헤더를 전달합니다. 데이터 헤더인데 드래그가 완료되었습니다. 이 데이터는 나중에 수정됩니다
자식 컴포넌트에서 상위 요소의 데이터를 직접 수정하는 것은 권장하지 않으므로 여기에서 tableHeader를 초기화하여 헤더 데이터 헤더를 호스팅합니다
하지만 헤더 수정을 허용하려면 tableHeader도 수정에 응답할 수 있습니다. 모니터 watch
watch: { header (val, oldVal) { this.tableHeader = val } }
를 추가해야 합니다. 3. 헤더
Element-UI의 Table 구성 요소를 사용자 정의하여 [drag the] 기능을 구현합니다. 열 너비 수정을 위한 테두리], mousemove, mouseup, mousedown이 없습니다. 이벤트가 노출됩니다
따라서 헤더를 사용자 정의하고 마우스 이벤트에 대한 핸들러 함수를 수동으로 추가해야 합니다. 이를 위해서는 renderHeader() 를 사용해야 합니다. method
renderHeader (createElement, {column}) { return createElement( 'p', { 'class': ['thead-cell'], on: { mousedown: ($event) => { this.handleMouseDown($event, column) }, mouseup: ($event) => { this.handleMouseUp($event, column) }, mousemove: ($event) => { this.handleMouseMove($event, column) } } }, [ // 添加 <a> 用于显示表头 label createElement('a', column.label), // 添加一个空标签用于显示拖动动画 createElement('span', { 'class': ['virtual'] }) ]) },
세 가지 마우스 이벤트 중 첫 번째 매개변수가 이벤트 객체, 두 번째 매개변수가 헤더 객체입니다.
해당 처리 함수에서 해당 헤더 요소 첨자 인덱스는 columnKey를 통해 얻을 수 있습니다.
빈 라벨 드래그하는 동안 애니메이션을 표시하는 데 사용됩니다(점선)
4. 이벤트 처리
마우스를 누르면 시작 열이 기록됩니다. 마우스를 떼면 끝 열이 기록됩니다. 드래그 방향은 둘 사이의 차이를 기반으로 계산됩니다.
그런 다음 헤더 데이터는 시작 열과 끝 열의 위치에 따라 재정렬되어 열 드래그를 실현합니다.
드래깅 프로세스의 처리 기능은 다음과 같습니다.
// 按下鼠标开始拖动 handleMouseDown (e, column) { this.dragState.dragging = true this.dragState.start = parseInt(column.columnKey) // 给拖动时的虚拟容器添加宽高 let table = document.getElementsByClassName('w-table')[0] let virtual = document.getElementsByClassName('virtual') for (let item of virtual) { item.style.height = table.clientHeight - 1 + 'px' item.style.width = item.parentElement.parentElement.clientWidth + 'px' } }, // 鼠标放开结束拖动 handleMouseUp (e, column) { this.dragState.end = parseInt(column.columnKey) // 记录起始列 this.dragColumn(this.dragState) // 初始化拖动状态 this.dragState = { start: -1, end: -1, move: -1, dragging: false, direction: undefined } }, // 拖动中 handleMouseMove (e, column) { if (this.dragState.dragging) { let index = parseInt(column.columnKey) // 记录起始列 if (index - this.dragState.start !== 0) { this.dragState.direction = index - this.dragState.start < 0 ? 'left' : 'right' // 判断拖动方向 this.dragState.move = parseInt(column.columnKey) } else { this.dragState.direction = undefined } } else { return false } }, // 拖动易位 dragColumn ({start, end, direction}) { let tempData = [] let left = direction === 'left' let min = left ? end : start - 1 let max = left ? start + 1 : end for (let i = 0; i < this.tableHeader.length; i++) { if (i === end) { tempData.push(this.tableHeader[start]) } else if (i > min && i < max) { tempData.push(this.tableHeader[ left ? i - 1 : i + 1 ]) } else { tempData.push(this.tableHeader[i]) } } this.tableHeader = tempData },
5. 드래그 중 점선 효과
이 과정에서 mousemove 이벤트를 통해 현재 열의 헤더 상태가 변경되고
그런 다음 해당 클래스가 headerCellClassName
headerCellClassName ({column, columnIndex}) { return (columnIndex - 1 === this.dragState.move ? `darg_active_${this.dragState.direction}` : '') }
의 도움으로 동적으로 수정됩니다. 헤더 셀
직접 작성한 전체 스타일을 게시하세요(sass를 다음과 같이 사용). 컴파일 도구):
<style lang="scss"> .w-table { .el-table th { padding: 0; .virtual{ position: fixed; display: block; width: 0; height: 0; margin-left: -10px; z-index: 99; background: none; border: none; } &.darg_active_left { .virtual { border-left: 2px dotted #666; } } &.darg_active_right { .virtual { border-right: 2px dotted #666; } } } .thead-cell { padding: 0; display: inline-flex; flex-direction: column; align-items: left; cursor: pointer; overflow: initial; &:before { content: ""; position: absolute; top: 0; left: 0; bottom: 0; right: 0; } } &.w-table_moving { .el-table th .thead-cell{ cursor: move !important; } .el-table__fixed { cursor: not-allowed; } } }
6. 상위 구성 요소 호출
<template> <p> <wTable :data="tableData" :header="tableHeader" :option="tableOption"> <el-table-column slot="fixed" fixed prop="date" label="日期" width="150"> </el-table-column> </wTable> </p> </template> <script> import wTable from '@/components/w-table.vue' export default { name: 'Table', data () { return { tableOption: { border: true, maxHeight: 500 }, tableHeader: [{ prop: 'name', label: '姓名', sortable: true, sortMethod: this.handleNameSort }, { prop: 'province', label: '省份', minWidth: '120' }, { prop: 'city', label: '市区', minWidth: '120' }, { prop: 'address', label: '地区', minWidth: '150' }, { prop: 'zip', label: '邮编', minWidth: '120' }], tableData: [{ date: '2016-05-03', name: '王小虎', province: '上海', city: '普陀区', address: '上海市普陀区金沙江路 1518 弄', zip: 200333 }, { date: '2016-05-02', name: '王小虎', province: '上海', city: '普陀区', address: '上海市普陀区金沙江路 1518 弄', zip: 200333 }, { date: '2016-05-04', name: '王小虎', province: '上海', city: '普陀区', address: '上海市普陀区金沙江路 1518 弄', zip: 200333 }, { date: '2016-05-01', name: '王小虎', province: '上海', city: '普陀区', address: '上海市普陀区金沙江路 1518 弄', zip: 200333 }, { date: '2016-05-08', name: '王小虎', province: '上海', city: '普陀区', address: '上海市普陀区金沙江路 1518 弄', zip: 200333 }, { date: '2016-05-06', name: '王小虎', province: '上海', city: '普陀区', address: '上海市普陀区金沙江路 1518 弄', zip: 200333 }] } }, methods: { handleNameSort () { console.log('handleNameSort') } }, components: { wTable } } </script>
믿으세요. 이 기사의 사례를 읽은 후, 더 흥미로운 정보를 보려면 PHP 중국어의 다른 관련 기사를 주목하세요. 웹사이트!
추천 자료:
위 내용은 Element-UI Table을 사용하여 드래그 앤 드롭 기능 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











요소를 수정하는 방법: 1. 요소의 배경색을 수정합니다. 2. 요소의 글꼴 크기를 수정합니다. 4. 요소의 글꼴 스타일을 수정합니다. . 요소의 수평 정렬을 수정합니다. 자세한 소개: 1. 요소의 배경색을 수정합니다. 구문은 "document.getElementById("myElement").style.BackgroundColor = "red";"입니다. 2. 요소의 글꼴 크기 등을 수정합니다.

JavaScript를 사용하여 이미지의 드래그 및 확대/축소 기능을 구현하는 방법은 무엇입니까? 최신 웹 개발에서는 이미지 드래그 및 확대/축소가 일반적인 요구 사항입니다. JavaScript를 사용하면 이미지에 드래그 및 확대/축소 기능을 쉽게 추가하여 더 나은 사용자 경험을 제공할 수 있습니다. 이 기사에서는 구체적인 코드 예제와 함께 JavaScript를 사용하여 이 기능을 구현하는 방법을 소개합니다. HTML 구조 먼저, 그림을 표시하고 추가하려면 기본 HTML 구조가 필요합니다.

Elden's Ring에서는 일정 시간이 지나면 이 게임의 UI 페이지가 자동으로 숨겨집니다. 많은 플레이어는 UI가 항상 어떻게 표시되는지 알지 못합니다. 플레이어는 디스플레이 및 사운드 구성에서 게이지 표시 구성을 선택하기만 하면 됩니다. 그것을. 엘든링 UI가 계속 나타나는 이유는 무엇인가요? 1. 먼저 메인 메뉴에 진입한 후 [시스템 구성]을 클릭하세요. 2. [디스플레이 및 사운드 구성] 인터페이스에서 미터 디스플레이 구성을 선택합니다. 3. 활성화를 클릭하여 완료합니다.

Vue는 단일 페이지 애플리케이션(SPA)을 구축하는 데 적합한 널리 사용되는 JavaScript 프레임워크입니다. 지침과 구성 요소를 통해 드래그 앤 드롭 선택 및 배치 기능을 지원하여 사용자에게 더 나은 대화형 경험을 제공합니다. 이 기사에서는 Vue에서 드래그 앤 드롭 선택 및 배치에 대한 기술과 모범 사례를 소개합니다. 드래그 명령어 Vue는 드래그 효과를 쉽게 얻을 수 있는 v-드래그 가능한 명령어를 제공합니다. 이 명령은 모든 요소에 적용할 수 있으며 드래그 스타일을 사용자 정의할 수 있습니다.

Vue는 구성 요소 기반 접근 방식을 사용하여 웹 애플리케이션을 구축하는 인기 있는 JavaScript 프레임워크입니다. Vue 생태계에는 아름다운 인터페이스를 빠르게 구축하고 풍부한 기능과 대화형 효과를 제공하는 데 도움이 되는 많은 UI 구성 요소 라이브러리가 있습니다. 이 기사에서는 몇 가지 일반적인 VueUI 구성 요소 라이브러리를 소개합니다. ElementUIElementUI는 Ele.me 팀에서 개발한 Vue 구성 요소 라이브러리로 개발자에게 우아하고

Vue를 사용하여 드래그 앤 드롭 정렬 효과를 구현하는 방법 Vue.js는 대화형 프런트 엔드 애플리케이션을 구축하는 데 도움이 되는 인기 있는 JavaScript 프레임워크입니다. Vue에서는 드래그 앤 드롭 정렬 효과를 쉽게 구현할 수 있어 사용자가 요소를 드래그하여 데이터를 정렬할 수 있습니다. 이 기사에서는 Vue를 사용하여 드래그 앤 드롭 정렬 효과를 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 먼저 Vue 인스턴스를 생성하고 정렬할 데이터를 저장할 배열을 정의해야 합니다. 이 예에서 우리는

Vue 실무 기술: v-on 명령을 사용하여 마우스 끌기 이벤트 처리 서문: Vue.js는 단순성, 사용 용이성 및 유연성으로 인해 많은 개발자가 가장 먼저 선택하는 JavaScript 프레임워크입니다. Vue 애플리케이션 개발에서 사용자 상호 작용 이벤트를 처리하는 것은 필수적인 기술입니다. 이 기사에서는 Vue의 v-on 지시문을 사용하여 마우스 드래그 이벤트를 처리하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. Vue 인스턴스 만들기: 먼저 HTML 파일에 Vue.js 라이브러리 파일을 도입합니다. &

AI의 경우 '휴대전화 가지고 노는 것'은 쉬운 일이 아니다. 단지 다양한 사용자 인터페이스(UI)를 식별하는 것만으로도 큰 문제다. 각 구성 요소의 종류를 식별해야 할 뿐만 아니라, 기능을 결정하기 위해 사용된 기호, 위치도 식별해야 한다. 구성 요소의. 모바일 장치의 UI를 이해하면 UI 자동화와 같은 다양한 인간-컴퓨터 상호 작용 작업을 실현하는 데 도움이 될 수 있습니다. 모바일 UI 모델링에 대한 이전 작업은 일반적으로 화면의 뷰 계층 정보에 의존하고 UI의 구조 데이터를 직접 활용하여 화면 픽셀에서 시작하는 구성 요소를 식별하는 문제를 우회합니다. 그러나 뷰 계층 구조를 모든 시나리오에서 사용할 수 있는 것은 아닙니다. 이 방법은 일반적으로 개체 설명이 누락되거나 위치가 잘못된 구조 정보로 인해 잘못된 결과를 출력하므로
