在 Vue 应用中,定时器(如 setInterval
或 setTimeout
)如果不正确清理可能会导致内存泄漏和性能问题。以下是几种优雅停止定时器的方法:
export default {
data() {
return {
timer: null,
counter: 0
}
},
mounted() {
// 启动定时器
this.timer = setInterval(() => {
this.counter++
console.log('Counter:', this.counter)
}, 1000)
},
beforeDestroy() {
// 组件销毁前清除定时器
if (this.timer) {
clearInterval(this.timer)
this.timer = null
}
}
}
import { onMounted, onUnmounted, ref } from 'vue'
export default {
setup() {
const counter = ref(0)
let timer = null
onMounted(() => {
timer = setInterval(() => {
counter.value++
console.log('Counter:', counter.value)
}, 1000)
})
onUnmounted(() => {
if (timer) {
clearInterval(timer)
timer = null
}
})
return { counter }
}
}
// useInterval.js
import { onUnmounted } from 'vue'
export function useInterval(callback, delay) {
let intervalId = null
const start = () => {
stop()
intervalId = setInterval(callback, delay)
}
const stop = () => {
if (intervalId) {
clearInterval(intervalId)
intervalId = null
}
}
onUnmounted(stop)
return { start, stop }
}
// 在组件中使用
import { useInterval } from './useInterval'
export default {
setup() {
const { start, stop } = useInterval(() => {
console.log('Interval running')
}, 1000)
// 手动启动
start()
return { stop }
}
}
考虑使用专门处理定时器的库,如 vue-use
中的 useIntervalFn
:
import { useIntervalFn } from '@vueuse/core'
export default {
setup() {
const { pause, resume } = useIntervalFn(() => {
console.log('Interval running')
}, 1000)
return { pause, resume }
}
}
requestAnimationFrame
通常比 setInterval
更合适通过以上方法,可以确保 Vue 应用中的定时器得到正确管理,避免资源浪费和潜在的内存泄漏问题。