Это потому, что свойство color
определено для самого компонента, а не для каждого объекта валюты. Все сгенерированные td
s будут относиться к одному и тому же свойству color
, которое вычисляется с использованием свойства price_change_percentage_1h_in_currency
для компонента, которое равно undefined
, потому что у компонента его нет.
Либо добавьте свойство color
для объектов валюты при их извлечении:
.then(response => {
response.data.forEach(item =>
item.color = item.price_change_percentage_1h_in_currency > 0 ? "inc" : "dec"
);
this.currencies = response.data;
})
Или, еще лучше, вычислите класс в шаблоне, добавьте его в tr
, чтобы вам не приходилось повторять это для каждого ребенка td
s:
<tr v-for="currency, index in currencies" :class='[ currency.price_change_percentage_1h_in_currency > 0 ? "inc" : "dec" ]'>
demo:
var prices = new Vue({
el: "#prices",
data: {
message: "Hello Vue!",
currencies: [],
},
computed: {
color() {
return this.price_change_percentage_1h_in_currency > 0 ? "inc" : "dec";
}
},
// Getting the Data DO NOT TOUCH! :)
mounted: function() {
axios.get("https://api.coingecko.com/api/v3/coins/markets?vs_currency=eur&order=market_cap_desc&per_page=100&page=1&sparkline=false&price_change_percentage=1h%2C%2024h%2C7d")
.then(response => {
this.currencies = response.data;
})
.catch(error => {
console.log(error);
});
},
})
.dec {
background-color: #ffaaaa;
}
.inc {
background-color:#aaffaa;
}
.as-console-wrapper {
height: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<table id="prices">
<tbody>
<tr v-for="currency, index in currencies" :class='[ currency.price_change_percentage_1h_in_currency > 0 ? "inc" : "dec" ]'>
<td v-html="index + 1"></td>
<td>{{currency.price_change_percentage_1h_in_currency.toFixed(2)}}%</td>
<td>{{currency.price_change_percentage_24h.toFixed(2)}}%</td>
<td>{{currency.price_change_percentage_7d_in_currency.toFixed(2)}}%</td>
</tbody>
</table>