如何利用 Vue 的生命周期钩子进行初始化和清理操作?

news/2025/2/22 6:24:19
一、初始化操作的核心钩子

1. created(选项式API)

export default {
  data() {
    return { user: null };
  },
  created() {
    // 适合初始化数据、发起非DOM操作请求
    this.fetchUser();
  },
  methods: {
    async fetchUser() {
      const response = await fetch('/api/user');
      this.user = await response.json();
    }
  }
};

2. onMounted(组合式API)

import { onMounted, ref } from 'vue';

export default {
  setup() {
    const count = ref(0);
    const element = ref(null);

    onMounted(() => {
      // DOM已挂载,可安全操作
      element.value = document.getElementById('counter');
      element.value.addEventListener('click', increment);
    });

    function increment() {
      count.value++;
    }

    // 必须返回响应式数据
    return { count };
  }
};
二、清理操作的核心钩子

1. beforeUnmount(组合式API)

import { onBeforeUnmount } from 'vue';

export default {
  setup() {
    let timer = null;

    onBeforeUnmount(() => {
      // 组件销毁前清理资源
      clearInterval(timer);
      timer = null;
    });

    // 其他逻辑...
  }
};

2. unmounted(选项式API)

export default {
  data() {
    return { socket: null };
  },
  created() {
    this.socket = new WebSocket('ws://example.com');
  },
  unmounted() {
    // 确保WebSocket连接关闭
    if (this.socket) {
      this.socket.close();
    }
  }
};
三、组合式API与选项式API的生命周期映射
阶段选项式API组合式API
初始化createdsetup
挂载前beforeMountonBeforeMount
挂载后mountedonMounted
更新前beforeUpdateonBeforeUpdate
更新后updatedonUpdated
销毁前beforeDestroy/unmountedonBeforeUnmount/onUnmounted
销毁后destroyed已被移除
四、日常开发建议

1. 数据请求策略

// 推荐:created中发起请求,避免阻塞渲染
created() {
  this.loadData();
},
methods: {
  async loadData() {
    try {
      this.data = await fetchData();
    } catch (error) {
      console.error('数据加载失败:', error);
    }
  }
}

2. DOM操作规范

// 错误示例:在created中操作未挂载的DOM
created() {
  this.$refs.container.style.color = 'red'; // this.$refs为null
}

// 正确示例:在mounted中操作
mounted() {
  this.$refs.container.style.color = 'red';
}

3. 资源清理守则

// 必须成对出现:添加/移除事件监听
mounted() {
  window.addEventListener('resize', this.handleResize);
},
beforeUnmount() {
  window.removeEventListener('resize', this.handleResize);
}
五、实战注意事项

1. 父子组件生命周期顺序

父 beforeMount -> 子 beforeMount -> 子 mounted -> 父 mounted
父 beforeUnmount -> 子 beforeUnmount -> 子 unmounted -> 父 unmounted

2. 异步操作处理

// 错误示例:未处理异步清理
onMounted(() => {
  this.timer = setInterval(() => {}, 1000);
});

// 正确示例:使用异步清理
onMounted(async () => {
  const data = await longRunningTask();
  this.data = data;
  this.cleanup = () => clearInterval(this.timer);
});

onBeforeUnmount(() => {
  if (this.cleanup) this.cleanup();
});

3. 服务端渲染(SSR)兼容

// 避免在beforeMount中执行DOM操作
onBeforeMount(() => {
  if (typeof window !== 'undefined') {
    // 仅在客户端执行
    this.initChart();
  }
});
六、典型错误案例分析

1. 忘记清理定时器

mounted() {
  this.timer = setInterval(() => {}, 1000); // ❌ 未清理
}

2. 在beforeDestroy中执行复杂计算

beforeDestroy() {
  // ❌ 阻塞销毁流程
  this.heavyComputation();
}
七、最佳实践总结
  1. 初始化顺序:created(数据)→ mounted(DOM)
  2. 清理原则:谁创建谁销毁,成对出现
  3. 性能优化:避免在mounted中进行重计算
  4. 错误边界:使用errorCaptured钩子捕获子组件错误
  5. 状态管理:结合Vuex/Pinia时,优先在created中初始化状态

通过合理运用生命周期钩子,开发者可以实现组件生命周期的精细控制。在实际开发中,建议结合TypeScript的类型系统增强生命周期钩子的类型安全,并利用Vue Devtools进行生命周期调试。


http://www.niftyadmin.cn/n/5861782.html

相关文章

什么容错性以及Spark Streaming如何保证容错性

一、容错性的定义 容错性是指一个系统在发生故障或崩溃时,能够继续运行并提供一定服务的能力。在网络或系统中,这通常涉及到物理组件损坏或软件失败时系统的持续运行能力。容错系统的关键特性包括负载平衡、集群、冗余、复制和故障转移等。 二、Spark …

win10把c盘docker虚拟硬盘映射迁移到别的磁盘

c盘空间本身就比较小、如果安装了docker服务后,安装的时候没选择其他硬盘,虚拟磁盘也在c盘会占用很大的空间,像我的就三十多个G,把它迁移到其他磁盘一下子节约几十G 1、先输入下面命令查看 docker 状态 wsl -l -v 2、如果没有停止…

oracle怎么创建定时任务

在Oracle中创建定时任务,可以使用DBMS_SCHEDULER包,以下是创建定时任务的详细步骤: 1. 创建作业 需要创建一个作业,用于执行定时任务,作业是一组SQL语句或PL/SQL代码,可以定期执行。 BEGINDBMS_SCHEDULE…

从DeepSeek大爆发看AI革命困局:大模型如何突破算力囚笼与信任危机?

目录 从DeepSeek大爆发看AI革命困局:大模型如何突破算力囚笼与信任危机? 小瓜有话说——为什么想写这篇博文 一、算力军备竞赛下的临时繁荣 1、技术奇点的陷阱 2、行业困境 二、三类企业的生存实验 1. 守旧派的黄昏:参数崇拜者的绝击 …

pycharm将当前项目上传到github

要将当前项目从 PyCharm 上传到 GitHub,你可以按照以下步骤操作: 1. 创建一个 GitHub 仓库 登录到 GitHub。点击右上角的 按钮,然后选择 New repository。填写仓库名称、描述等信息,点击 Create repository。 2. 在 PyCharm 中…

C++ 设计模式-备忘录模式

游戏存档实现&#xff0c;包括撤销/重做、持久化存储、版本控制和内存管理 #include <iostream> #include <memory> #include <deque> #include <stack> #include <chrono> #include <fstream> #include <sstream> #include <ct…

WPF 中显示图形的方式深度解析

一、引言 Windows Presentation Foundation(WPF)凭借其强大的图形渲染能力,为开发者打造美观、交互性强的桌面应用程序提供了有力支持。在 WPF 里,有多种显示图形的方式,每种方式都有独特的用途和特点。本文将详细介绍 DrawingImage、Shape、Image、GeometryDrawing、Dra…

汽车智能制造企业数字化转型SAP解决方案总结

一、项目实施概述 项目阶段划分&#xff1a; 蓝图设计阶段主数据管理方案各模块蓝图设计方案下一阶段工作计划 关键里程碑&#xff1a; 2022年6月6日&#xff1a;项目启动会2022年12月1日&#xff1a;系统上线 二、总体目标 通过SAP实施&#xff0c;构建研产供销协同、业财一…