You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vue.js中条件性开闭标签?Bootstrap视频分组需求

解决Vue中每3个视频用Bootstrap Row包裹的问题

嘿,我明白你遇到的困扰了——想用Vue实现每3个视频套一个Bootstrap的row标签,但直接用条件渲染尝试控制标签开闭时,反而把包含视频的子标签给隐藏了。其实核心问题在于Vue的模板逻辑是数据驱动的,不能像原生JS那样手动去“开闭”单个标签,我们得换个思路:先把视频数据分组,再基于分组后的数据来渲染模板就完美解决了!

具体实现步骤

1. 对视频数据进行分组(计算属性处理)

首先,我们需要把你的视频数组转换成每3个元素为一组的二维数组。这一步可以用Vue的计算属性来完成,自动响应数据变化:

<script setup>
import { ref, computed } from 'vue'

// 假设你的视频数据是这个数组
const videos = ref([
  { id: 1, url: 'video1.mp4', title: '视频1' },
  { id: 2, url: 'video2.mp4', title: '视频2' },
  { id: 3, url: 'video3.mp4', title: '视频3' },
  { id: 4, url: 'video4.mp4', title: '视频4' },
  { id: 5, url: 'video5.mp4', title: '视频5' },
])

// 计算属性:将视频数组按每3个一组拆分
const groupedVideos = computed(() => {
  const groups = []
  // 遍历原数组,每3个元素分一组
  for (let i = 0; i < videos.value.length; i += 3) {
    groups.push(videos.value.slice(i, i + 3))
  }
  return groups
})
</script>

2. 基于分组数据渲染模板

接下来在模板里,先循环分组后的数组,每个组对应一个Bootstrap的row;然后在每个row里面循环该组的视频,用col标签包裹每个视频:

<template>
  <div class="container">
    <!-- 循环每组视频,生成一个row -->
    <div class="row g-3" v-for="(videoGroup, index) in groupedVideos" :key="index">
      <!-- 循环组内的每个视频,生成col -->
      <div class="col-md-4" v-for="video in videoGroup" :key="video.id">
        <div class="card h-100">
          <video controls class="card-img-top">
            <source :src="video.url" type="video/mp4">
            你的浏览器不支持视频播放
          </video>
          <div class="card-body">
            <h5 class="card-title">{{ video.title }}</h5>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

为什么这个方案可行?

Vue的模板是基于数据结构生成的,我们不需要手动控制row标签的“开”和“闭”——每个row直接对应一组3个视频的数据,当数据分组完成后,模板会自动为每个组生成完整的row包裹结构,完美契合Bootstrap的布局逻辑,也不会出现子标签被隐藏的问题。

内容的提问来源于stack exchange,提问作者ben.IT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:13:42