Vue3 依據商品標籤給定不同的class

寫到這邊在想我要不要也來個30天挑戰!?

一般我們看到電商的網頁,除了大大的標題、價格以外,可能還會多一些小標籤。例如海外直送、免運費、新品上市等等,如果我們想將類型性質的標籤很偷懶的使用一個v-for就貼上去,但又想要給他們一些不同的css作區別,該怎麼實現呢?

使用框架:Vue3 Composition API

json檔案:item底下的tags:["優惠1","優惠2"]

 

 

<script>
const  getTagClass=(tag)=> {
      if (category === '優惠1') {
        return 'eventOne';
      } else if (category === '優惠2') {
        return 'eventTwo';
      } else if (category === '優惠3') {
        return 'eventThree';
      } else if (category === '優惠4') {
        return 'eventFour';
      } else {
        return ''; // 如果不匹配,則回傳空字串
      }
    }
 
};
</script>
<template>
  <div>
    <span
      v-for="tag in item.tags"
      :key="tag"
      :class="gettagsClass(tag)"
    >
      {{ tag}}
    </span>
  </div>
</template>

寫一下我踩雷的過程:

原來是打算用computed回傳一個class,後來發現需要有input的值才能判斷進行回傳,因此又改成function的形式。

<template>
  <div>
//原本的寫法
    <span
      v-for="tag in item.tags"
      :key="tag"
      :class="gettagsClass(item.tag)"
    >
      {{ tag}}
    </span>
  </div>
</template>
const categoryClasses = (tags) => {
  const classes = [];
  for (const tag of tags ) {
    if (tag=== '優惠1') {
      classes.push('eventOne');
    } else if (tag=== '優惠2') {
      classes.push('eventTwo');
    } else if (tag=== '優惠3') {
      classes.push('eventThree');
    } else if (tag=== '優惠4') {
      classes.push('eventFour');
    }
  }
  return classes;
};

但不管return的是字串或是array,在使用條件式的情況下,會一直添加class。如果用return或是break,那只要第一個tag情況滿足後來的就不會執行。

例如tags:["優惠1","優惠2"]

  • 最後才return的情形

<span class="eventOne eventTwo">

  • 滿足條件就return的情形

<span class="eventOne">

 

之後發現function裡面放的應該是單一元素而不是item.tag,同時在滿足一個情況底下就可以return

後來改來改去的終於懂了,覺得不記錄起來有點可惜。

 

Related post

J J
JAVASCRIPT

使用vue3 自動判定日期

情境:我的專案有活動紀錄,格式為json,本來的網頁非常的土法煉鋼,還沒到來的活動日期就在上方,過期的活動在下方。有一天我突然懶惰了(?)希望可以自動抓取今天日期判斷是否過期 使用框架:vue 3…

J J
JAVASCRIPT

vue3 computed, method

我們在學習vue的時候最常用到的就是computed,跟method這兩種語法,那麼這兩種的差異在哪裏?又是什麼時候適用呢? 首先,這篇文章會以vue3的寫法為基礎,也就是composition API的寫法。對於一開始就接觸的我,覺得這樣的寫法反而滿親民(?)的。…