javascript - Vue中根据数据更改表格单元格的背景

标签 javascript vue.js google-cloud-firestore

我目前正在尝试更改 vue 项目中表格中某些单元格的颜色。我在文档和其他一些在线资源上阅读了有关类和样式绑定(bind)的信息,但我无法获得我想要的工作。

我有一个表格,其中填充了来自 firestore 的数据,我想根据这些数据更改某些单元格的颜色。第一个单元格是显示人员“等级”的单元格,如果此人的等级为“金星”,我想给 .gold-star 类,.silver -star 如果是“Silver Star”,.bronze-star 如果是“Bronze Star”。

第二个单元格将显示此人的总分,此单元格将基于一系列基于此人等级及其总分的条件,例如,如果此人等级为“青铜星”,则此人有 >50 点,我想将类 .change-rank 添加到总单元格中,以便我知道是时候更改了。不知道我说清楚没有。

到目前为止,这是我的表格组件的代码(我对其进行了一些修改以使其更易于阅读)。

<template>
  <div>
    <v-snackbar v-model="snackbar">
      <span>Player Added!</span>
      <v-btn color="blue" text @click="snackbar = false">Close</v-btn>
    </v-snackbar>
    <h3 class="font-weight-medium text-center pa-3 ma-3 display-1">Member List</h3>
    <template v-if="isMember || isAdmin">
      <v-simple-table fixed-header height="70vh">
        <template v-slot:default>
          <thead>
            <tr>
              <th class="text-left title">Name</th>
              <th class="text-left title">Rank</th>
              <th class="text-left title">Total</th>
            </tr>
          </thead>
          <tbody>
            <tr v-for="(member, index) in members" :key="index">
              <td>
                {{member.name}}
              </td>
              <td>{{member.rank}}</td>
              <td>{{member.total}}</td>
            </tr>
          </tbody>
        </template>
</v-simple-table>
</template>

</div>
</template>

<script>
  import {
    db,
    fv,
    tstp
  } from "../data/firebaseInit";
  import firebase from "firebase/app";
  import Popup from "../components/Popup";
  export default {
    components: {
      Popup
    },
    data() {
      return {
        isAdmin: false,
        isMember: false,
        snackbar: false,
        members: []
      };
    },
    created() {
      this.fetchDb();
    },
    methods: {
      fetchDb() {
        db.collection("members")
          .orderBy("name")
          .onSnapshot(snap => {
            const members = [];
            snap.forEach(doc => {
              let newPlayer = doc.data();
              newPlayer.id = doc.id;
              members.push(newPlayer);
            });
            this.members = members;
          });
      }
    }
  };
</script>

<style scoped>
  h3 {
    text-decoration: underline;
    color: #37474f;
  }

  .gold-star {
    background-color: #ffee58;
  }

  .silver-star {
    background-color: #BDBDBD;
  }

  .bronze-star {
    background-color: #cd7f32;
  }

  .change-rank {
    background-color: #00C853;
  }
</style>

最佳答案

您需要做的就是有条件地为循环中的每个元素分配一个类:

<tr 
  v-for="(member, index) in members" 
  :key="index" 
  :class="{
    'gold-star': member.rank === 'Gold star',
    'silver-star': member.rank === 'Silver star',
    'bronze-star': member.rank === 'Bronze star',
  }"
>
...

对积分做同样的事情:'change-rank': member.total > 50

您还可以将此代码移至方法 并使您的 HTML 更简洁:

<tr 
  v-for="(member, index) in members" 
  :key="index" 
  :class="getTableClasses(member)"
>

...

methods: {
  getTableClasses(member) { 
   let color = member.rank.toLowerCase().replace(' ', '-')
   let changeRank = member.total > 50 ? 'change-rank' : ''
   return `${color} ${changeRank}`
  }
}

关于javascript - Vue中根据数据更改表格单元格的背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59356246/

相关文章:

Swift Firestore 搜索用户

vue.js - 为什么 Vue Dev Tools 中的数据没有更新?

android - 如何检查某个数据是否已经存在于firestore中

javascript - 谷歌自定义搜索引擎 : result page in a div of other page?

javascript - 在 javascript 中进行嵌套的 Promise 调用

vue.js - 如何修复 Vue 3 模板编译错误 : v-model value must be a valid JavaScript member expression?

vue.js - 在 Vuetify 字段中隐藏密码字符

android - 在 Flutter 和 native 代码中使用 Firestore 的缓存行为

javascript - 旋转后,在正确位置绘制图像

javascript - 组件不更新 Prop 更新