vm.$destroy()

作用:完全销毁一个实例。清理 vm 与其它实例的连接,解绑 vm 的全部指令及事件监听器。

触发: beforeDestroydestroyed 的钩子。


实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>常用的生命周期钩子</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="root">
    <h3 :style="{opacity}">你好</h3>
    <button @click="stop">不要闪烁了</button>
</div>

</body>

<script type="text/javascript">
    new Vue({
        el: '#root',
        data: {
            opacity: 1
        },
        methods: {
            stop() {
                // 销毁 Vue实例
                this.$destroy()
            }
        },
        // Vue 完成模板的解析并把初始的真实的DOM元素放入页面后(挂载完毕)调用 mounted
        mounted() {
            this.timer = setInterval(() => {
                this.opacity -= 0.01
                if (this.opacity <= 0) this.opacity = 1
            }, 16)
        },
        // 在 Vue实例 销毁之前被调用,一般做收尾工作
        beforeDestroy() {
            clearInterval(this.timer)
        }
    })
</script>
</html>


一个小细节

关于这段 解绑 vm 的全部指令及事件监视器

此处的事件:指的是自定义事件,原生 DOM 事件依然有效


举例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>

<div id="root">
    <h2>n = {{n}}</h2>
    <button @click="add">n + 1</button>
    <br><br>
    <button @click="stop">销毁</button>
</div>


</body>

<script type="text/javascript">
    const vm = new Vue({
        el: '#root',
        data: {
            n: 0
        },
        methods: {
            add() {
                alert('触发 add')
                this.n += 1
            },
            stop() {
                // 销毁 Vue实例
                this.$destroy()
            }
        }
    })
</script>

</html>

运行结果


可以看到

销毁前:可以通过触发 add 正常使 n 值发生变化

销毁后:可以触发 add 但是,n 值不能正常发生变化

因此:可以发现销毁后会使 自定义事件失效,但原生的 DOM 事件依然有效



posted @ 2022-04-22 11:21  春暖花开鸟  阅读(520)  评论(0编辑  收藏  举报