点赞功能这一块,通常建议用 ref 分别管理状态和数量:liked(布尔值)负责控制图标切换、按钮是否禁用等交互状态,likes(数字)用于记录当前总点赞数;当用户点击按钮后,再通过 toggleLike 同步更新 liked.value 和 likes.value;配合 transition 和动态 class,点赞图标的淡入淡出动画会更顺滑自然;至于数字变化,则可以借助 displayedLikes + setInterval 实现类似滚动递增的计数展示效果。

在 Vue 中使用 ref 处理点赞按钮的动画状态和数字递增,关键是把“是否已点赞”和“当前点赞数量”都定义为响应式变量,并在状态切换时触发相应逻辑,比如增减数字、切换动画类名,或者启动数字滚动动画。
定义两个 ref 变量:状态 + 数量
实现点赞功能时,通常会涉及两个核心响应式状态:
- liked:布尔值,表示用户当前是否已经点赞,常用于切换图标、颜色以及控制按钮禁用状态
- likes:数字,表示点赞总数,主要用于页面展示和数字递增动画
在 中可以这样定义:
import { ref } from 'vue'
const liked = ref(false)
const likes = ref(0)点击时同步更新状态与数字
在点击事件中,通常需要同时完成两件事:切换 liked 状态,并根据当前状态对 likes 做加减处理。需要注意的是,不能直接写 likes++,而是必须通过 .value 访问和修改:
const toggleLike = () => {
if (liked.value) {
likes.value--
} else {
likes.value++
}
liked.value = !liked.value
}这样一来,在模板中绑定 @click="toggleLike" 后,点赞按钮的状态和数量就能实现实时响应更新。
配合 transition 实现图标切换动画
如果想让点赞图标切换更有动效,可以结合 Vue 的 组件来实现。 本身依赖 class 名触发动画,而这些 class 名又可以根据 liked.value 动态切换:
CSS 动画部分通常只需要定义三组 class:
.fade-in-enter-active和.fade-out-lea ve-active:统一设置为transition: opacity .2s.fade-in-enter和.fade-out-lea ve-to:设置opacity: 0.fade-in-enter-to和.fade-out-lea ve:设置opacity: 1
让数字带滚动动画递增
如果希望 {{ likes }} 的变化不是瞬间跳动,而是像计数器一样平滑滚动递增,可以额外使用一个独立的 ref 来保存当前显示值,再配合 setInterval 让它逐步接近目标值:
const displayedLikes = ref(0)
const startCounting = (target) => {
const start = displayedLikes.value
const step = Math.ceil(Math.abs(target - start) / 30)
let current = start
const timer = setInterval(() => {
current += target > start ? step : -step
if ((target > start && current >= target) || (target < start && current <= target)) {
current = target
clearInterval(timer)
}
displayedLikes.value = current
}, 16)
}
// 切换时调用:
if (liked.value) {
startCounting(likes.value)
}
模板中直接显示 {{ displayedLikes }},就可以看到更平滑自然的点赞数字滚动效果。
