当前位置:首页 > VUE

vue选座如何实现

2026-02-25 04:43:41VUE

Vue 选座功能实现方法

数据结构设计

选座功能的核心是座位数据的组织。通常使用二维数组或对象数组表示座位布局,例如:

seats: [
  { row: 'A', col: 1, status: 'available' }, // 可用
  { row: 'A', col: 2, status: 'selected' },  // 已选
  { row: 'B', col: 1, status: 'occupied' }   // 已占用
]

或影院式布局:

rows: [
  {
    name: 'A',
    cols: [
      { number: 1, type: 'standard', status: 'available' },
      { number: 2, type: 'vip', status: 'occupied' }
    ]
  }
]

可视化渲染

使用 v-for 循环渲染座位,通过动态 class 绑定不同状态样式:

<div v-for="row in rows" :key="row.name" class="seat-row">
  <div 
    v-for="col in row.cols" 
    :key="col.number"
    :class="['seat', col.status, col.type]"
    @click="selectSeat(row, col)"
  >
    {{ col.number }}
  </div>
</div>

CSS 示例:

.seat {
  width: 30px;
  height: 30px;
  margin: 5px;
  cursor: pointer;
}
.available { background-color: #ccc; }
.selected { background-color: #4CAF50; }
.occupied { background-color: #f44336; }
.vip { border: 2px solid gold; }

交互逻辑

实现座位选择/取消的点击事件:

methods: {
  selectSeat(row, col) {
    if (col.status === 'occupied') return;

    col.status = col.status === 'selected' 
      ? 'available' 
      : 'selected';

    this.updateSelectedSeats();
  },
  updateSelectedSeats() {
    this.selectedSeats = this.rows.flatMap(row => 
      row.cols.filter(col => col.status === 'selected')
    );
  }
}

进阶功能

  1. 连选限制:限制必须选择相邻座位

    validateAdjacent(selectedSeats) {
    const rows = new Set(selectedSeats.map(s => s.row));
    const cols = selectedSeats.map(s => s.col).sort();
    return cols.every((col, i) => i === 0 || col === cols[i-1] + 1);
    }
  2. 座位类型差异:不同座位类型显示不同价格

    computed: {
    totalPrice() {
     return this.selectedSeats.reduce((sum, seat) => 
       sum + (seat.type === 'vip' ? 50 : 30), 0);
    }
    }
  3. 屏幕标识:添加影院屏幕标识

    <div class="screen">SCREEN</div>
    <style>
    .screen {
    width: 80%;
    height: 20px;
    margin: 0 auto 30px;
    background: linear-gradient(to top, #555, #999);
    box-shadow: 0 0 10px rgba(0,0,0,0.5);
    }
    </style>

数据持久化

提交选座数据到后端:

vue选座如何实现

async confirmSelection() {
  const res = await axios.post('/api/book', {
    seats: this.selectedSeats,
    sessionId: this.sessionId
  });
  if (res.data.success) {
    this.$router.push('/payment');
  }
}

注意事项

  • 使用 Vuex 管理复杂状态时,建议将座位数据存储在 store 中
  • 移动端适配需要增加触摸事件和响应式布局
  • 性能优化:大量座位渲染时建议使用虚拟滚动技术
  • 可访问性:为座位添加 ARIA 标签和键盘导航支持

标签: 如何实现vue
分享给朋友:

相关文章

vue实现继承语法糖

vue实现继承语法糖

在Vue中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const Bas…

vue请求实现进度条

vue请求实现进度条

实现请求进度条的方法 在Vue中实现请求进度条可以通过多种方式完成,常见的有使用第三方库如axios结合nprogress或自定义进度条组件。以下是几种实现方法: 使用axios和nprogress…

vue实现逻辑

vue实现逻辑

Vue 实现逻辑的核心概念 Vue.js 是一个渐进式 JavaScript 框架,其核心逻辑围绕数据驱动和组件化开发。通过响应式系统、虚拟 DOM 和组件生命周期等机制,Vue 实现了高效的前端开发…

vue实现webapp

vue实现webapp

Vue 实现 WebApp 的基本步骤 环境准备 确保已安装 Node.js 和 npm/yarn。通过 Vue CLI 或 Vite 创建项目: npm install -g @vue/cli v…

vue实现mui

vue实现mui

使用 Vue 实现 MUI(Material-UI)风格的界面 Vue 本身不直接提供 MUI(Material Design)组件,但可以通过集成第三方库或手动实现来达到类似效果。以下是几种常见方法…

vue实现addclass

vue实现addclass

Vue 实现动态添加 class 的方法 在 Vue 中动态添加 class 可以通过多种方式实现,以下是常见的几种方法: 使用对象语法 通过绑定一个对象到 :class,可以动态切换 class…