Было бы проще инкапсулировать это в компоненте, потому что Vue управляется данными, и теперь вам действительно нужно погрузиться в DOM и манипулировать цветом стрелки для конкретной стрелки, когда ваш счетчик больше 0.
Я изменил и упростил ваш пример кода.Первое, что вы хотите сделать, это не иметь отдельные свойства votes
и voteCount
, потому что они просто одно и то же.Вы хотите получить начальные голоса от бэкэнда через опору статьи и обновить его с помощью своего звонка XHR.
Я смоделировал быстрый пример, который я не проверял, но это должно заставить вас двигаться в правильном направлении..
Пример:
<upvote-arrow :article="{{ $article }}"></upvote-arrow>
Компонент:
<template>
<div>
<a class="arrow" :class="{ active: hasVotes }" @click="vote"></a>
<div class="points">{{ votes }}</div>
</div>
</template>
<script>
export default {
data(){
return{
votes: this.article.votes
}
},
props: {
article: {
required: true,
type: Object
}
},
computed: {
hasVotes() {
return this.votes > 0;
}
},
methods:{
vote(){
axios.post('/article/vote/' + this.article.id)
.then(function (response) {
this.votes = response.count;
});
}
}
}
</script>
<style lang="scss" scoped>
.active {
border-color: transparent transparent #1267dc transparent;
}
</style>
Класс active
будет применен к привязке с вычисляемым свойством, если у вас более 1голос.С этим стилем привязки вы можете изменить цвет стрелки.
Также лучше менять голоса только тогда, когда вызов XHR действительно успешен, потому что он может потерпеть неудачу по какой-то причине, а правильное состояние неотражено в этом случае.Просто обновите голосование ответом бэкэнда.