下边只是对vue文档 + 自己理解的记录,加深印象。
程序化的事件侦听器
假如一个页面开启计时器时,当且患页面时,需要清楚它,因为setInterval时全局的,之前做法是:
data() {
return {
timer:null
}
},
mounted() {
this.setTime()
},
beforeDestroy() {
clearInterval(this.timer)
},
methods: {
setTime() {
this.timer = setInterval(() => {
console.log('计时器执行了')
}, 1000)
}
}
上边做法不光在实例上挂载了timer,而且在独立的钩子函数中去清除计时器,这使得我们比较难于程序化地清理我们建立的所有东西。
vue 给我们提供了另一种很优雅的写法, 通过一个程序化的侦听器解决这两个问题:
mounted() {
this.setTime()
},
methods: {
setTime() {
let timer = setInterval(() => {
console.log('计时器执行了')
}, 1000)
//
this.$once('hook:beforeDestroy', () => {
clearInterval(timer)
console.log('计时器销毁了')
})
}
}
这样写法,使代码更加完整,独立。
vm.$forceUpdate()
迫使Vue实例重新渲染。
注意:注意它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件。
额外知识点:数据的重新渲染,都会触发 beforeUpdate 钩子函数。
我们可以利用这个api实现:向数据添加任何值,都会导致页面的重新渲染,当然这种操作不建议使用,除非迫不得已!
<template>
<div class="home">
{{JSON.stringify(componentsList)}}
<button @click="btn">click</button>
</div>
</template>
<script>
export default {
data() {
return {
componentsList: ['com', 'comOne', 'comTwo']
}
},
methods: {
btn() {
this.componentsList[3] = 1
this.$forceUpdate()
}
}
}
</script>