Vue+ElementUI 기술 공유: Sortablejs를 결합하여 테이블 행 드래그 앤 드롭 구현


머리말

많은 동적 웹 애플리케이션에서 사용자 인터페이스의 상호작용은 사용자 경험을 향상시키는 열쇠입니다. Vue.js에서는 Element UI와 sortablejs을 결합하여 테이블의 행 드래그 기능을 쉽게 구현할 수 있습니다. 이 기사에서는 Vue 프로젝트에서 이러한 도구를 사용하고 드래그 앤 드롭 후 백엔드 서비스 시스템에 데이터를 업데이트하는 방법을 보여줍니다.


준비

요소 UI가 있는지 확인하고 sortablejs 프로젝트에 설치하세요. 아직 설치되지 않은 경우 다음 명령을 사용하여 설치할 수 있습니다.

npm install element-ui sortablejs

기본 항목 파일(예: main.js 또는 app.js)에 요소 UI 및 해당 스타일을 소개합니다.

import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);

샘플 코드

다음은 테이블 행 드래그 기능을 포함하는 Vue 구성 요소의 예입니다.

<template>
  <div>
    <el-table :data="planTableData"
              row-key="id">
      <el-table-column prop="createTime"
                       label="日期"
                       width="180"></el-table-column>
      <el-table-column prop="event"
                       label="事件"
                       width="180"></el-table-column>
      <!-- 其他列 -->
    </el-table>
  </div>
</template>

<script>
import Sortable from 'sortablejs'
import axios from 'axios' // 引入axios进行HTTP请求

export default {
    
    
  name: 'PlanTableDraggable',
  data () {
    
    
    return {
    
    
      planTableData: []
    }
  },
  created () {
    
    
    this.planTableData = [
      {
    
     id: 1, createTime: '2023-01-01', event: '事件1' },
      {
    
     id: 2, createTime: '2023-01-02', event: '事件2' },
      {
    
     id: 3, createTime: '2023-01-03', event: '事件3' }
      // ...更多测试数据
    ]
  },
  mounted () {
    
    
    this.$nextTick(() => {
    
    
      const el = this.$el.querySelector('.el-table__body-wrapper tbody')
      Sortable.create(el, {
    
    
        onEnd: (event) => {
    
    
          const {
    
     oldIndex, newIndex } = event
          this.updateRowOrder(oldIndex, newIndex)
        }
      })
    })
  },
  methods: {
    
    
    updateRowOrder (oldIndex, newIndex) {
    
    
      const movedItem = this.planTableData.splice(oldIndex, 1)[0]
      this.planTableData.splice(newIndex, 0, movedItem)
      this.updateOrderOnServer()
    },
    updateOrderOnServer () {
    
    
      axios.post('/api/update-order', {
    
     newOrder: this.planTableData })
        .then(response => {
    
    
          console.log('Order updated:', response)
        })
        .catch(error => {
    
    
          console.error('Error updating order:', error)
          // 可能需要回滚操作
        })
    }
  }
}
</script>

이 코드는 Element UI 테이블과 sortablejs Vue 구성요소를 결합하여 행 드래그 기능을 구현하는 방법을 보여줍니다. 주요 단계에는 테이블 데이터 초기화, 드래그 앤 드롭을 활성화하도록 sortablejs 구성, 드래그가 완료되면 데이터 업데이트 및 서버 동기화가 포함됩니다. 이렇게 하면 대화형의 사용자 친화적인 테이블 인터페이스를 만들 수 있습니다.

코드 설명

1. 종속성 및 구성 요소 구조 소개

<template>
  <div>
    <el-table :data="planTableData" row-key="id">
      <!-- 表格列 -->
    </el-table>
  </div>
</template>

<script>
import Sortable from 'sortablejs'
import axios from 'axios'

export default {
    
    
  // ...
}
</script>
  • <template> 섹션은 구성 요소의 HTML 구조를 정의합니다. 여기에서는 Element UI의 <el-table> 구성 요소를 사용하여 테이블을 생성합니다.
  • :data="planTableData"planTableData 배열을 테이블의 데이터 소스에 바인딩하는 동적 속성(Vue의 v-bind 약칭)입니다.
  • row-key="id"은 각 데이터 행에 고유한 키 값을 지정하는 데 사용됩니다. 각 데이터 항목에는 고유한 id 필드가 있다고 가정합니다.
  • import Sortable from 'sortablejs'에서는 드래그 앤 드롭 기능을 구현하는 데 사용되는 sortablejs 라이브러리를 소개합니다.
  • import axios from 'axios'에서는 HTTP 요청 전송을 위한 axios 라이브러리를 소개합니다.

2. 구성요소 데이터 및 수명주기

export default {
    
    
  name: 'PlanTableDraggable',
  data () {
    
    
    return {
    
    
      planTableData: []
    }
  },
  created () {
    
    
    this.planTableData = [/* 初始数据 */]
  },
  mounted () {
    
    
    this.$nextTick(() => {
    
    
      const el = this.$el.querySelector('.el-table__body-wrapper tbody')
      Sortable.create(el, {
    
    /* 配置项 */})
    })
  },
  // ...
}
  • data() 함수는 구성 요소의 응답 데이터를 반환합니다. 여기에는 테이블 데이터를 저장하는 데 사용되는 planTableData 배열이 있습니다.
  • created() 수명 주기 후크를 사용하여 초기화합니다 planTableData. 이는 서버에서 데이터를 로드하여 대체할 수 있습니다.
  • mounted() 후크는 구성 요소가 DOM에 마운트된 후에 실행됩니다. 여기서 this.$nextTick을 사용하면 모든 하위 구성 요소도 렌더링됩니다.
  • 내부 mounted에서는 this.$el.querySelector를 통해 테이블의 DOM 요소를 가져오고 Sortable.create을 사용하여 드래그를 초기화하고 드롭 기능.

3. 드래그 앤 드롭 기능 구현

Sortable.create(el, {
    
    
  onEnd: (event) => {
    
    
    const {
    
     oldIndex, newIndex } = event
    this.updateRowOrder(oldIndex, newIndex)
  }
})
  • Sortable.create드래그가 적용될 요소와 구성 개체라는 두 가지 매개 변수를 허용합니다.
  • onEnd드래그 작업이 완료되면 트리거되는 이벤트 핸들러입니다.
  • event 매개변수는 원본 색인 oldIndex 및 새 색인 newIndex을 포함하여 드래그 작업에 대한 세부정보를 제공합니다.
  • this.updateRowOrder배열의 요소 순서를 업데이트하는 데 사용되는 사용자 정의 방법입니다.

4. 데이터 업데이트 및 서버 동기화

methods: {
    
    
  updateRowOrder (oldIndex, newIndex) {
    
    
    const movedItem = this.planTableData.splice(oldIndex, 1)[0]
    this.planTableData.splice(newIndex, 0, movedItem)
    this.updateOrderOnServer()
  },
  updateOrderOnServer () {
    
    
    axios.post('/api/update-order', {
    
     newOrder: this.planTableData })
      .then(response => {
    
    
        console.log('Order updated:', response)
      })
      .catch(error => {
    
    
        console.error('Error updating order:', error)
      })
  }
}
  • updateRowOrder은 배열의 splice 메소드를 통해 planTableData에 있는 요소의 위치를 ​​조정합니다.
  • updateOrderOnServer axios을 사용하여 서버에 POST 요청을 보내 업데이트된 시퀀스를 동기화하세요. 여기서 '/api/update-order'는 샘플 API 엔드포인트이며 실제 백엔드 서비스에 따라 조정되어야 합니다.

실행 결과

작동 효과 1
러닝 효과 2


요약하다

Vue.js, Element UI 및 sortablejs을 결합하여 사용자 친화적인 드래그 앤 드롭 테이블 인터페이스를 효과적으로 구현하고 백엔드 서비스의 대화형 유지 관리를 통해 데이터 일관성을 보장할 수 있습니다. . 이는 애플리케이션의 상호작용성을 향상시킬 뿐만 아니라 사용자 경험도 향상시킵니다.

추천

출처blog.csdn.net/qq_31463571/article/details/134843125