当前位置:首页 > 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 支持保存看板状态

    vue实现看板

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

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

    vue实现看板

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

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

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

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

相关文章

vue实现安全免登录

vue实现安全免登录

Vue 实现安全免登录的方案 免登录功能通常通过持久化认证状态(如 Token)实现,但需兼顾安全性。以下是基于 Vue 的常见实现方案: 基于 Token 的免登录 登录成功后存储 Token…

vue实现一个tab栏

vue实现一个tab栏

Vue 实现 Tab 栏 基础实现(选项式 API) <template> <div class="tab-container"> <div class="t…

vue实现发表

vue实现发表

Vue 实现发表功能 在 Vue 中实现发表功能通常涉及表单处理、数据绑定和网络请求。以下是实现步骤和代码示例: 表单设计与数据绑定 创建一个表单用于输入发表内容,使用 v-model 进行数据双向…

vue实现付款

vue实现付款

Vue 实现付款功能 在 Vue 中实现付款功能通常需要集成第三方支付网关(如支付宝、微信支付、Stripe 等)。以下是常见的实现方法: 集成支付宝/微信支付 安装必要的依赖(如 axios 用于…

vue实现拖放

vue实现拖放

Vue 实现拖放功能 Vue 中实现拖放功能通常可以通过 HTML5 的原生拖放 API 或第三方库(如 vuedraggable)来实现。以下是两种方法的详细说明。 使用 HTML5 原生拖放 A…

vue实现图库

vue实现图库

Vue 实现图库的基本方法 使用 Vue 实现图库功能可以通过多种方式完成,以下是一些常见的方法和实现步骤。 使用 Vue 和第三方库(如 Vue Gallery) 安装 vue-gallery 或…