vue.js 生命周期

人盡茶涼 提交于 2019-12-04 04:43:41

image

1.mounted:模版初次渲染完成后执行

当模版初次渲染成功后会自动执行这个函数,可以用来请求数据或者初始化某个插件

<p v-show="isShow">生命周期</p>
<script>
    new Vue({
        el:"#app",
        data:{},
        mounted() {
            console.log('mounted')
        }
    })
</script>

2.updated 页面更新时触发

当页面发生改变时,该页面所在的组件就会触发updated

// 父组件
<template>
  <div id="app">
    <h1>{{msg}}</h1>
    <!-- 当content发生变化时,父组件和组件的updated函数都会触发 -->
    <Hello :content="content" />
    <button @click="test">点我</button>
  </div>
</template>
// 子组件
<template>
    <div id="hello">
        <--name是子组件私有的数据-->
        <h3>{{name}}</h3>
        <--content就是通过props接收的数据-->
        <h3>{{content}}</h3>
    </div>
</template>

上面的例子中,如果修改子组件的name,只会触发子组件的updated。
而修改父组件的content,父组件和子组件的updated都会触发(父组件绑定了content到子组件中标签中,而子组件将content绑定到了h3标签中,两者的页面都对这个数据进行了绑定绑定)

3.beforeDestroy/destroyed:vue实例销毁执行的钩子函数

<div id="app">
    <p>{{msg}}</p>
    <button @click="destroyVM">点我销毁实例</button>
</div>
var vm = new Vue({
    el: "#app",
    data: {
        msg: "销毁实例"
    },
    beforeDestroy() {
        alert('实例将要被销毁')
        //可以在这个函数里面清除实例中的定时器
    },
    destroyed() {
        alert('实例被销毁了')
    },
    methods: {
        destroyVM() {
            //销毁实例的方法
            this.$destroy();
        }
    }
})

实例被销毁后界面仍然存在,只是vm已经不能渲染界面了

4. $nextTick(callback)

作用:将回调延迟到DOM 更新循环之后执行
实际运用场景:有些插件需要在页面渲染完毕之后对页面进行初始化操作,而有时候页面渲染是基于ajax异步获取的数据,因为无法得知数据何时获取回来,也无法得知数据渲染到页面所用的时间,所以无法得知页面何时渲染完毕,初始化函数就难以在合适的时机执行(例如swipe插件的初始化操作)
解决办法1:ajax获取数据成功后会将数据保存到本地数据中(data或者vuex),使用watch监听这个数据的变化,触发对应的回调方法,再使用setTimeout()延迟运行页面初始化的方法
解决办法2:前面的与方法一类似,监听数据的变化,但是不使用延时定时器,而使用$nextTick(cb)。它表示页面更新之后再执行$nextTick(cb)里面的回调函数,只要将插件的初始化方法写在回到函数中即可。

实例:使用watch监听content,点击按钮,通过延时定时器模拟ajax数据,并修改content的值

<body>
    <div id="app">
        <p>{{msg}}</p>
        <button @click="getMsg">点我模拟ajax数据</button>
    </div>
</body>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            msg: "我是默认的数据",
            sendTime:null,
            receiveTime:null,
            renderTime:null
        },
        methods: {
            getMsg() {
                //返回 1970 年 1 月 1 日至今的毫秒数
                this.sendTime = new Date().getTime()
                //使用延时定时器模拟ajax
                setTimeout(() => {
                    console.log('开始发起请求的时间 ' + this.sendTime)
                    this.msg = "数据被延时修改了"
                },1000)
            }
        },
        watch:{
            msg:function(){
                this.receiveTime = new Date().getTime()
                var delay = this.receiveTime-this.sendTime
                console.log('接收到数据用时 ' + delay + 'ms')
                this.$nextTick(function(){
                    this.renderTime = new Date().getTime()
                    var delay = this.renderTime-this.receiveTime
                    console.log('页面渲染用时 ' + delay + 'ms')
                    console.log('现在可以在此执行初始化函数')
                })
            }
        }
    })
</script>

点击按钮运行:

开始发起请求的时间 1573393003970
接收到数据用时 1003ms
页面渲染用时 2ms
现在可以在此执行初始化函数
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!