VUE基础(二)


Vue的生命周期

Vue总共有11个生命周期,下文只介绍8个生命周期

根据官网给的图可以大致将Vue的生命周期分为四个阶段:初始化阶段、挂载阶段、更新阶段、销毁阶段。而每个阶段又可以分为前、后两个阶段。

vue生命周期

初始化阶段

beforeCreate() 钩子可以让我们在初始化之前进行一些操作。在这个阶段,数据还没有被代理到我们创建的实例中,所以此时我们无法获取data里的数据。

created() 钩子可以让我们在初始化完成时进行一些操作。在这个阶段,数据完成了代理,此时我们可以获取 data中的数据。

const vm = new Vue({
	el:'#app',
    data(){
        return {
            msg:'asuhe'
        }
    },
    beforeCreate(){
        console.log(msg); //此时数据还未被代理无法获取msg属性的值,输出undefined
    },
    created(){
        console.log(msg); //数据已经被代理,输出asuhe
    }
})

挂载阶段

beforeMount()钩子可以让我们在DOM实际渲染到页面前进行一些操作,这时挂载点的数据已经被渲染好了,但还没有实际插入页面,我们无法获取到DOM节点。

mounted()钩子可以让我们的在DOM实际渲染到页面后进行一些操作,**此时DOM节点已经挂载,我们可以获取到DOM节点。**通常这时我们会向服务器发送请求获得数据、挂载事件等等

<div id="app">
    <p ref="pp"></p>
</div>

const vm = new Vue({
	el:'#app',
    data(){
        return {}
    },
    beforMount(){
        console.log(this.$refs.pp) //undefined
    },
    mounted(){
        console.log(this.$refs.pp) //<p ref="pp"></p>
    }
})

更新阶段

当数据更新的时候,data配置项里的数据是马上更新的,但页面上的数据并不是能马上更新。所以有beforeUpdate()和updated()这两个钩子供我们在页面数据更新前后进行操作。

const vm = new Vue({
	el:'#app',
    data(){
        return {
            isOk:true
        }
    },
    
    beforUpdate(){
        console.log(this.$refs.pp) //输出空
    },
    updated(){
        console.log(this.$refs.pp) //<p ref="pp"></p>
    }
})

销毁阶段

<div id="app">
    <p ref="pp" v-show="isShow">{{isShow?'小香香':'明日香'}}</p>
	<button @click="destroy">点击销毁实例</button>
</div>
const vm = new Vue({
    el:'#app',
    data(){
        return {
            isShow:true
        }
    },
    methods: {
        destroy(){
            this.$destroy(); //这里触发两个销毁阶段的钩子,同步回调
            //最后执行
            console.log('正在清理');
        }
    },
    mounted(){
        this.timer = setInterval(()=>{
            this.isShow = !this.isShow;
        },2000)
    },            
    //销毁阶段的两个钩子
    beforeDestroy() {
        //销毁阶段进行清理工作
        clearInterval(this.timer);
        this.timer = null;
        console.log('销毁了定时器');  
    },
    destroyed(){
        console.log('销毁完毕');
    }
})
//点击销毁按钮后输出顺序是: 销毁了定时器 销毁完毕 正在清理

自定义指令

自定义指令分为定义全局指令和局部指令,全局自定义指令在任何一个Vue实例中都可以使用,而局部自定义指令只能在特定的Vue实例中使用

全局自定义指令

定义全局指令

参数: 1、指令名称(不包含v- 只能是全小写) 2、回调函数

(参数 1使用这个指令的那个节点,2这个指令使用的表达式的值以及表达式的集合)

Vue.directive('upper',function(node,bindings){
    // console.log(node,bindings)
    node.textContent = bindings.value.toUpperCase();
})

局部自定义指令

const vm = new Vue({
    el:'#app',
    directives:{
        upper(node,bindings){
            
        }
    }
})

自定义过滤器

Vue.filter('timeFormat',function(value,format='YYYY-MM-DD hh:mm:ss'){
    return moment(value).format(format)
})
const vm = new Vue({
    el:'#app',
    data(){
        return {
            timeNow: Date.now()
        }
    }
})