在根目录下新建 plugins 目录,
并创建v-counter.js文件
// plugins/v-counter.js
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.directive('counter', {
updated(el, binding) {
console.log('updated', el, binding)
el.cur = binding.oldValue
el.targetNum = binding.value
el.timer = setInterval(el.jump, 50)
},
beforeMount(el, binding) {
el.jump = () => {
let step = Math.ceil((el.targetNum - el.cur) / 5)
el.cur = Math.round(el.cur + step)
if (Math.abs(el.targetNum - el.cur) < 1) {
el.innerText = el.targetNum
clearInterval(el.timer)
return
}
el.innerText = el.cur
}
},
mounted(el, binding) {
el.cur = 0
el.targetNum = Number(binding.value)
el.timer = setInterval(el.jump, 50)
el.innerText = el.cur
},
unmounted(el) {
el.jump = null
clearInterval(el.timer)
}
})
})
在页面上使用
<h4 v-counter="courseNum"></h4>