问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Uniapp 生命周期钩子destroyed 详解

创作时间:
作者:
@小白创作中心

Uniapp 生命周期钩子destroyed 详解

引用
1
来源
1.
https://www.pweb123.com/frame/uniapp/1095.html

在Uniapp开发中,合理管理组件生命周期对于防止内存泄漏、事件堆积和资源未释放等问题至关重要。本文将详细介绍Uniapp中的destroyed生命周期钩子,包括其执行时机、基本用法、实际应用场景以及注意事项与最佳实践。

什么是 destroyed 钩子

destroyed 是 Vue.js(以及基于 Vue 的 Uniapp)组件生命周期中的一个重要钩子函数,它会在 Vue/Uniapp 实例被销毁后调用。在 Uniapp 中,这个生命周期函数同样适用,当页面或组件被卸载时触发。

destroyed 的执行时机

destroyed 钩子在以下情况下会被调用:

  1. 页面导航离开时:当用户从当前页面跳转到其他页面(非 tabbar 页面)
  2. 组件被移除时:当父组件动态移除了某个子组件
  3. 手动销毁实例时:通过调用 this.$destroy()

需要注意的是:

  • tabbar切换不会触发页面的 destroyed
  • navigateBack返回时会触发前一个页面的 created,但不会立即销毁当前页

基本用法示例

export default {
data() {
return {
timer: null
}
},
created() {
//创建一个定时器
this.timer = setInterval(() => {
console.log('定时器运行中...')
},1000)
},
destroyed() {
//清除定时器避免内存泄漏
if(this.timer) {
clearInterval(this.timer)
this.timer = null;
console.log('定时器已清除')
}
console.log('组件/页面已被销毁')
}
}

实际应用场景

  1. 清理工作
destroyed() {
//取消事件监听
uni.$off('someEvent', this.handleEvent);
//清除地图实例
if(this.map) {
this.map.destroy();
this.map = null;
}
}
  1. 数据保存到全局或缓存
destoryed() {
//将表单数据保存到全局store或缓存
if(this.formData) {
uni.setStorageSync('draftForm',this.formData);
}
//或者使用vuex
this.$store.commit('saveTempData',this.tempData);
}
  1. WebSocket连接关闭
destoryed(){
if(this.socket && this.socket.readyState === WebSocket.OPEN){
this.socket.close();
console.log("WebSocket连接已关闭");
}
}

注意事项与最佳实践

  1. 与 beforeDestroy的区别
  • beforeDestroy:实例销毁之前调用,此时实例仍然完全可用(适合做清理前的准备工作)
  • destoryed:实例销毁后调用,所有绑定和监听都会被移除,子实例也都被销毁
  1. 移动端特殊考虑

在Uniapp的移动端环境中:

  • Android物理返回键会触发destoryed而iOS滑动返回默认不会(可通过配置改变)
  • APP进入后台不会触发,destory只在实际卸载时发生
  1. 性能优化建议

对于可能频繁创建销毁的组件:

  • destory时要彻底释放大对象引用(null赋值)
  • WebGL/Canvas等资源要手动释放
  1. 常见错误处理
destoryd(){
try{
this.clearAllIntervals();
}catch(e){
console.error("清理失败:",e);
}
},
methods:{
clearAllIntervals(){
let lastId = setInterval(()=>{},9999);
for(let i=lastId;i>=0;i--){
clearInterval(i);
}
}
}
  1. 调试技巧

可以在控制台输出查看是否发生内存泄漏:

//在入口文件添加

Vue.config.devtools=true;
Vue.config.debug=true;
Vue.config.productionTip=false;

总结

合理使用 destoryd生命周期能有效防止:

✓内存泄漏 ✓事件堆积 ✓资源未释放等问题。在Uniapp开发中,特别是需要管理原生资源的场景(如地图、音视频),做好销毁处理尤为重要。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号