如果动态变量为真则绑定类 [all in v-for]

Posted

技术标签:

【中文标题】如果动态变量为真则绑定类 [all in v-for]【英文标题】:Bind class if a dynamic variable is true [all in v-for] 【发布时间】:2020-06-11 09:00:01 【问题描述】:

对不起我的代码,但我是 Vue 的新手。

我有 5 个像这样的跨度项目 [跨度:class]

              <span class="bars">
                <span class="bar" :class=" selected1: isActive[0] "></span>
                <span class="bar" :class=" selected2: isActive[1] "></span>
                <span class="bar" :class=" selected3: isActive[2] "></span>
                <span class="bar" :class=" selected4: isActive[3] "></span>
                <span class="bar" :class=" selected5: isActive[4] "></span>
              </span>

这些匹配到 5 个灰色圆圈。类“selected1, selected, ...”用 5 种不同的颜色填充圆圈。 "isActive" 是一个包含 5 个布尔变量 [false, false, false, false, false] 的数组。 为了更改这些布尔变量的语句,我使用了一个每次从 Firebase 获取数据时都会触发的函数。

  data() 
    return 
      isActive: [], // boolean array
      ricettario: [] // array of firebase data
    ;
  ,

所以当 isActive[0] 为真时,span 被填满,当 isActive1 为真时,span 被填满,等等......

我使用的函数名为“setDiff”,它从 Firebase 数据库中挑选数据并将其放入 switch 语句中。

// Firebase get data
created() 
    db.collection("ricettarioFirebase")
      .get()
      .then(snapshot => 
        snapshot.forEach(doc => 
          let ricetta = doc.data();
          ricetta.data = dayjs(ricetta.data) // time
            .locale("it") // time
            .format("D MMMM YYYY"); // time
            this.setDiff(ricetta.diff); // diff = "molto facile || facile || ..."
          this.ricettario.push(ricetta); // push data to ricettario[]
        );
      );
  


// Function that change isActive[]
  methods: 
    setDiff(diff) 
      switch (diff) 
        case "molto facile":
          i = 1;
          for (j = 0; j < i; j++) 
            this.isActive[j] = true; // only one filled span
          
          break;
        case "facile":
          i = 2;
          for (j = 0; j < i; j++) 
            this.isActive[j] = true; // 2 filled span
          
          break;
        case "medio":
          i = 3;
          for (j = 0; j < i; j++) 
            this.isActive[j] = true; // 3 filled span
          
          break;
        case "difficile":
          i = 4;
          for (j = 0; j < i; j++) 
            this.isActive[j] = true; // 4 filled span
          
          break;
        case "molto difficile":
          i = 5;
          for (j = 0; j < i; j++) 
            this.isActive[j] = true; // 5 filled span
          
          break;
      
    
  

问题在于 DOM 只接收最后一条语句,因此使用 v-for 创建的每张卡片都具有相同的跨度颜色。我想拥有不同填充跨度的卡。 下图显示了问题。 problem

【问题讨论】:

每个 selected1, selected2, .. 是不同的颜色吗? 你的for循环非常重复,我会把它放在方法的末尾。所以你的switch 语句只设置i 的值。另外,我会将isActive 的值重置为false,然后再将其中一些设置为true。使用console.log 检查i 的值是否真的是它应该在方法结束时的值。 @RobertB。是的!问题解决了,谢谢大家! 【参考方案1】:

你有一个全局变量isActive[]

您正在从数据库中获取一组对象。

然后您为每个检索到的对象调用setDiff(someString)。 每次调用该函数时,实际上都会覆盖上一次调用设置的值。

您可以将isActive 设为二维数组(例如isActive[item.id][0])或将isActive 附加到ricetta,然后再将其推送到ricettario 数组

ricetta.isActive = this.setDiff(ricetta.diff); // remember to return isActive from setDiff function
ricettario.push(ricetta)

对于这个问题,您甚至可以使用简单的 CSS 和来自ricetta.diff 的 :class

https://codepen.io/szkuwa/pen/JjdNYov

【讨论】:

非常感谢!我使用了你的“CSS child”技术。就这样,我切掉了switch语句和函数。一切正常:-)

以上是关于如果动态变量为真则绑定类 [all in v-for]的主要内容,如果未能解决你的问题,请参考以下文章

三元运算符,如果为真则返回检查条件的快捷方式?

内置函数

如何遍历帧号,如果为真则忽略该帧号?

Swift - Alamofire Post,如果为真则更改图像

动画绝对定位的div,但如果条件为真则停止?

基础知识回顾——面向对象编程