当前位置:首页 > VUE

vue实现看板

2026-01-07 20:27:44VUE

Vue 实现看板功能

使用 Vue 实现看板功能可以通过组件化开发、状态管理和拖拽库结合完成。以下是一个完整的实现方案:

基础项目结构

src/
├── components/
│   ├── KanbanBoard.vue      # 看板容器
│   ├── KanbanColumn.vue     # 看板列
│   └── KanbanCard.vue       # 看板卡片
├── store/                   # 状态管理
│   └── index.js             
└── App.vue

状态管理(Vuex)

// store/index.js
export default new Vuex.Store({
  state: {
    columns: [
      {
        id: 1,
        title: "待处理",
        cards: [
          { id: 1, content: "任务1" },
          { id: 2, content: "任务2" }
        ]
      },
      {
        id: 2,
        title: "进行中",
        cards: []
      }
    ]
  },
  mutations: {
    MOVE_CARD(state, { fromColumn, toColumn, cardIndex }) {
      const card = state.columns[fromColumn].cards.splice(cardIndex, 1)[0]
      state.columns[toColumn].cards.push(card)
    }
  }
})

拖拽功能实现

安装拖拽库:

npm install vuedraggable
<!-- KanbanColumn.vue -->
<template>
  <div class="column">
    <h3>{{ column.title }}</h3>
    <draggable 
      v-model="column.cards"
      group="cards"
      @end="onDragEnd"
    >
      <KanbanCard 
        v-for="card in column.cards"
        :key="card.id"
        :card="card"
      />
    </draggable>
  </div>
</template>

<script>
import draggable from 'vuedraggable'
export default {
  props: ['column'],
  components: { draggable },
  methods: {
    onDragEnd(event) {
      this.$emit('card-moved', {
        fromIndex: event.oldIndex,
        toIndex: event.newIndex
      })
    }
  }
}
</script>

看板主组件

<!-- KanbanBoard.vue -->
<template>
  <div class="kanban-board">
    <KanbanColumn
      v-for="(column, index) in columns"
      :key="column.id"
      :column="column"
      @card-moved="handleCardMove(index, $event)"
    />
  </div>
</template>

<script>
import { mapState } from 'vuex'
export default {
  computed: {
    ...mapState(['columns'])
  },
  methods: {
    handleCardMove(columnIndex, event) {
      this.$store.commit('MOVE_CARD', {
        fromColumn: columnIndex,
        toColumn: event.newIndex >= 0 ? columnIndex : null,
        cardIndex: event.fromIndex
      })
    }
  }
}
</script>

<style scoped>
.kanban-board {
  display: flex;
  gap: 20px;
  padding: 20px;
}
.column {
  background: #f0f0f0;
  padding: 15px;
  border-radius: 5px;
  min-width: 250px;
}
</style>

卡片组件

<!-- KanbanCard.vue -->
<template>
  <div class="card">
    {{ card.content }}
  </div>
</template>

<script>
export default {
  props: ['card']
}
</script>

<style scoped>
.card {
  background: white;
  padding: 10px;
  margin: 5px 0;
  border-radius: 3px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
</style>

功能扩展建议

  1. 持久化存储
    添加 localStorage 或 IndexedDB 支持保存看板状态

  2. API 集成
    通过 axios 连接后端 API 实现数据同步

  3. 卡片详情
    添加点击卡片显示详细信息的模态框功能

  4. 多用户协作
    集成 WebSocket 实现实时协作更新

  5. 筛选排序
    在列头添加筛选和排序功能按钮

这个实现方案使用了 Vue 的响应式特性配合 Vuex 进行状态管理,通过 vuedraggable 实现拖拽功能,组件结构清晰易于扩展。根据实际需求可以调整样式和交互细节。

vue实现看板

标签: 看板vue
分享给朋友:

相关文章

vue实现生成二维码

vue实现生成二维码

使用qrcode.vue库生成二维码 安装qrcode.vue库: npm install qrcode.vue --save 在Vue组件中使用: <template> &l…

vue实现删除

vue实现删除

Vue 实现删除功能的方法 在 Vue 中实现删除功能通常涉及以下几个步骤: 数据绑定与列表渲染 使用 v-for 指令渲染列表数据,并为每个项绑定唯一标识符(如 id)。例如: <ul…

vue实现pie

vue实现pie

Vue 实现饼图 在 Vue 中实现饼图通常可以通过第三方图表库(如 ECharts、Chart.js 或 Highcharts)来完成。以下是使用 ECharts 和 Chart.js 的两种常见方…

vue实现返回

vue实现返回

返回按钮功能实现 在Vue中实现返回功能通常有两种方式:使用浏览器历史记录的history.back()或结合Vue Router进行编程式导航。以下是具体实现方法: 使用浏览器API met…

vue实现oauth

vue实现oauth

Vue 实现 OAuth 的步骤 安装必要的依赖 确保项目中安装了 axios 和 vue-router。OAuth 通常需要发送 HTTP 请求和处理路由跳转。 npm install axio…

vue原理实现

vue原理实现

Vue 原理实现的核心机制 Vue.js 的核心原理基于响应式系统、虚拟 DOM 和模板编译。以下是其核心实现机制的分解: 响应式系统 Vue 使用 Object.defineProperty(V…