如何使用 Vue.js 在 CSS 网格中显示项目

Posted

技术标签:

【中文标题】如何使用 Vue.js 在 CSS 网格中显示项目【英文标题】:How to display items in a CSS grid with Vue.js 【发布时间】:2021-02-06 09:12:04 【问题描述】:

我有一个汽车清单如下:

<script>

const sampleCars = [
  
    id: 1,
    name: 'Cressida',
    model: 'XXC',
    manufacturer: 'Toyota',
    price: '$10,000',
    inEditMode: false 
  ,
  
    id: 2,
    name: 'Corolla',
    model: 'ZD-2',
    manufacturer: 'Toyota',
    price: '$12,000',
    inEditMode: false 
  ,
  
    id: 3,
    name: 'Condor',
    model: '27-9',
    manufacturer: 'Mazda',
    price: '$8,000',
    inEditMode: false 
  
]

export default 
  data() 
    return 
      cars: sampleCars
    
  



</script>

<style>
.grid 
  display: grid;
  grid-template-columns: repeat(5, auto);
  gap: 10px;


</style>

我想在 5 列的 CSS 网格中显示项目。

如果我使用如下 vue 代码:

<template>
  <div >
    <div class="grid">
      <div>Name</div>
      <div>Model</div>
      <div>Manufacturer</div>
      <div>Price</div>
      <div>buttons</div>      
    </div>
    <div v-for="car in cars" :key="car.id" class="grid">
      <div>car.name</div>  // "child div"
      <div>car.model</div>
      <div>car.manufacturer</div>
      <div>car.price</div>
      <div>buttons</div>
    </div>
  </div>
</template>

这段代码的问题是每个项目都显示在自己的网格中。 (因此未对齐,如下图所示)。使用 v-for 所有汽车属性成为根 div 的子级。所以基本上我希望所有“子 div”成为一个 CSS 网格 div 的根。我怎样才能做到这一点?

使用 VueJS 2

【问题讨论】:

好吧,你为每一行分配了网格类,所以每一行都是它自己的网格。有很多关于如何使用 CSS 网格创建表格的资源,你应该看看一些。 【参考方案1】:

在一个网格中制作表格标题,在另一个网格中制作表格行:

Vue.config.devtools = false;
Vue.config.productionTip = false;
const sampleCars = [
    id: 1,
    name: 'Cressida',
    model: 'XXC',
    manufacturer: 'Toyota',
    price: '$10,000',
    inEditMode: false
  ,
  
    id: 2,
    name: 'Corolla',
    model: 'ZD-2',
    manufacturer: 'Toyota',
    price: '$12,000',
    inEditMode: false
  ,
  
    id: 3,
    name: 'Condor',
    model: '27-9',
    manufacturer: 'Mazda',
    price: '$8,000',
    inEditMode: false
  
]

new Vue(
  el: '#app',

  data() 
    return 
      cars: sampleCars
    
  
)
.grid 
  display: grid;
  grid-template-columns: repeat(5, minmax(92px,1fr));
  gap: 10px;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>


<div id="app" class="container">

  <div>
    <div class="grid">
      <div>Name</div>
      <div>Model</div>
      <div>Manufacturer</div>
      <div>Price</div>
      <div>buttons</div>
    </div>
    <div v-for="car in cars" :key="car.id">
      <div class="grid">
        <div>car.name</div>
        <div>car.model</div>
        <div>car.manufacturer</div>
        <div>car.price</div>
        <div>buttons</div>
      </div>
    </div>
  </div>
</div>

【讨论】:

是的,这就是我要找的,但是对我不起作用。在编译错误消息中它说“迭代中的元素期望具有'v-bind:key'”。而且,我不能将 :key 与模板元素一起使用“'【参考方案2】:

我发现的最佳解决方案是使用来自 https://github.com/Thunberg087/vue-fragment 的 Vue-Fragment

v-for 循环中的子元素最终将位于根级别:

<template>
  <div >
    <div class="grid">
      <div>Name</div>
      <div>Model</div>
      <div>Manufacturer</div>
      <div>Price</div>
      <div>buttons</div>  

      <fragment v-for="car in cars" :key="car.id"  >
        <div>car.name</div>
        <div>car.model</div>
        <div>car.manufacturer</div>
        <div>car.price</div>
        <div>buttons</div>
      </fragment>     
    </div>   

  </div>
</template>

另请参阅这个 SO 问题:Is there something like React.Fragment in Vue?

【讨论】:

以上是关于如何使用 Vue.js 在 CSS 网格中显示项目的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 css 或 js 根据 vue.js 中的条件在打印页面中设置不显示?

如何在 Laravel TailwindCss Vue Js 项目中添加和使用本地自定义字体?

如何使用 Vuetify 网格系统循环显示卡片组件?

如何在 Vue.js 中使用 CSS 对齐表头和内容?

如何在 vue.js 欢迎组件中使用引导程序而不是尾风 CSS

Vue.js 如何在组件中定义(覆盖)css 样式?