# Vue 的生命周期
Vue 总共有 11 个生命周期,下文只介绍 8 个生命周期
根据官网给的图可以大致将 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"><!--swig0--></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() | |
} | |
} | |
}) |