vue2的Mounted和vue3的onMounted,这两个钩子有何不同?

简介: vue2的Mounted和vue3的onMounted,这两个钩子有何不同?

vue2的Mounted和vue3的onMounted,这两个钩子有何不同?

vue2的Mount

vue3的onMounted

两个钩子的区别

`<script setup>` 中,onMounted的执行时机

vue3的`<script setup>` 中,onMounted的用法

vue2的Mount

mounted 是 Vue 2 中的一个生命周期钩子函数,它在组件挂载到 DOM 上之后被调用,常用于执行一些 DOM 操作或者发送网络请求等。

下面是关于 mounted 钩子的一些细节:

mounted 钩子是在组件实例被挂载到 DOM 上之后才被调用的,因此在该钩子中可以访问到组件的 DOM 元素。


mounted 钩子中的 this 指向的是组件实例本身,因此可以通过 this 访问组件的数据和方法。


mounted 钩子在组件的子组件被挂载之前被调用,因此如果需要在子组件中访问到父组件的数据,可以在 mounted 钩子中使用$nextTick 方法。


mounted 钩子只会被调用一次,因此如果需要在组件被重新渲染时执行一些操作,可以使用 watch 监听数据变化或者使用计算属性。


如果在 mounted 钩子中进行了一些异步操作,需要注意在组件销毁时取消这些操作,以避免内存泄漏。


下面是一个使用 mounted 钩子的小例子:

export default {
  mounted() {
    // 访问组件的 DOM 元素
    console.log(this.$el)
    // 发送网络请求
    axios.get('/api/data').then(response => {
      this.data = response.data
    })
    // 使用 $nextTick 方法访问父组件的数据
    this.$nextTick(() => {
      console.log(this.$parent.data)
    })
    // 监听数据变化
    this.$watch('data', () => {
      console.log('data changed')
    })
    // 在组件销毁时取消异步操作
    this.$once('hook:beforeDestroy', () => {
      this.cancelAsyncTask()
    })
  }
}

上面的代码,我们在 mounted 钩子中访问了组件的 DOM 元素、发送了网络请求、使用 $nextTick 方法访问了父组件的数据、监听了数据变化,并在组件销毁时取消了异步操作。

vue3的onMounted

在 Vue 3 中,mounted 钩子被重命名为 onMounted,它仍然是一个生命周期钩子函数,用于在组件挂载到 DOM 上之后执行一些操作。

下面是关于 onMounted 钩子的一些细节:


onMounted 钩子是通过 setup函数来使用的,它必须在组件实例创建之前调用,并返回一个对象,该对象包含组件实例中需要使用的数据、方法和生命周期钩子等。


onMounted 钩子中的函数会在组件挂载到 DOM 上之后执行,与 Vue 2 的 mounted 钩子相同,因此在该钩子中可以访问到组件的 DOM 元素。


在 setup 函数中,我们可以使用 ref 函数来创建一个响应式的变量,并将其初始化为 null,然后在 onMounted钩子中将其赋值为组件的 DOM 元素,从而访问到组件的 DOM 元素。


与 Vue 2 的 mounted 钩子不同,Vue 3 的 onMounted 钩子中的函数没有 this上下文,因此无法直接访问组件实例中的数据和方法。如果需要访问组件实例中的数据和方法,可以使用

getCurrentInstance 函数获取当前组件实例,并通过 ctx 参数来访问组件实例中的数据和方法。


onMounted 钩子只会被调用一次,因此如果需要在组件被重新渲染时执行一些操作,可以使用 watch 监听数据变化或者使用计算属性。


如果在 onMounted 钩子中进行了一些异步操作,需要注意在组件销毁时取消这些操作,以避免内存泄漏。


下面是一个使用 onMounted 钩子的小例子:



import { ref, onMounted, getCurrentInstance } from 'vue'
export default {
  setup() {
    const element = ref(null)
    const { ctx } = getCurrentInstance()
    onMounted(() => {
      // 访问组件的 DOM 元素
      element.value = ctx.$el
      // 发送网络请求
      axios.get('/api/data').then(response => {
        ctx.data = response.data
      })
      // 监听数据变化
      ctx.$watch('data', () => {
        console.log('data changed')
      })
      // 在组件销毁时取消异步操作
      ctx.$once('hook:beforeUnmount', () => {
        cancelAsyncTask()
      })
    })
    return { element }
  }
}

两个钩子的区别

Vue 2 的 mounted 和 Vue 3 的 onMounted 都是生命周期钩子函数,它们的作用都是在组件挂载到 DOM上之后执行一些操作。它们的主要区别在于使用方式和参数传递上。


在 Vue 2 中,mounted 钩子是在组件实例被挂载到 DOM 上之后立即调用的,它没有任何参数传递。我们可以在 mounted钩子中访问到组件的 DOM 元素,进行一些 DOM 操作或者发送网络请求等。


在 Vue 3 中,onMounted 钩子是通过 setup 函数来使用的。setup函数是在组件实例创建之前调用的,它必须返回一个对象,该对象包含组件实例中需要使用的数据、方法和生命周期钩子等。在 setup函数中,我们可以通过 onMounted 函数来注册 mounted 钩子。onMounted函数接受一个函数作为参数,该函数会在组件挂载到 DOM 上之后执行。与 Vue 2 的 mounted 钩子不同,onMounted钩子中的函数会接收到一个 ref 对象作为参数,该对象指向组件的 DOM 元素。


再以vue3的onMounted举个例子:

import { ref, onMounted } from 'vue'
export default {
  setup() {
    const element = ref(null)
    onMounted(() => {
      console.log(element.value) // 访问组件的 DOM 元素
    })
    return { element }
  }
}

在上面的代码中,我们首先使用 ref 函数创建了一个 element 变量,并将其初始化为 null。然后,我们使用 onMounted 函数来注册 mounted 钩子,该钩子会在组件挂载到 DOM 上之后执行。在 onMounted 函数中,我们访问了 element.value,这样就可以访问到组件的 DOM 元素了。最后,我们通过 return 语句将 element 变量暴露给组件实例使用。

<script setup> 中,onMounted的执行时机

⭐⭐⭐⭐⭐在 <script setup> 中使用 onMounted 时,它的执行时机是在组件实例创建后,模板渲染完成前。这意味着在 onMounted 中可以访问组件的 props、data 和 computed 等属性,但是不能访问模板中的 DOM 元素,因为它们还没有被渲染出来。


具体来说,<script setup> 中的代码会在以下情况下执行:


组件实例创建时,即 beforeCreate 和 created 生命周期之间;

组件的 props 和 data 初始化完成后;

组件的 template 编译成渲染函数之前。


因此,如果在 onMounted 中需要访问 DOM 元素,可以使用 nextTick 或 watchEffect 等方法来等待模板渲染完成后再执行相关操作。


vue3的<script setup> 中,onMounted的用法

⭐⭐⭐在 <script setup> 中,可以使用 defineExpose 函数来将组件内部的变量和函数暴露给组件的父组件。同时,我们可以使用 onMounted 函数来注册 mounted 钩子,该钩子会在组件挂载到 DOM 上之后执行。

小例子看一下:

<template>
  <div>{{ count }}</div>
</template>
<script setup>
import { ref, onMounted, defineExpose } from 'vue'
const count = ref(0)
onMounted(() => {
  console.log('张三')
})
defineExpose({
  count
})
</script>

在上面的代码中,我们使用 <script setup> 定义了一个组件,其中包含一个 count 变量和一个 onMounted 钩子。在 onMounted 钩子中,我们打印了张三。同时,我们使用 defineExpose 函数将 count 变量暴露给组件的父组件。在模板中,我们使用 {{ count }} 来显示 count 变量的值。


使用 <script setup> 和 onMounted 可以让我们更加方便地注册 mounted 钩子,并将组件内部的变量和函数暴露给组件的父组件,从而使得组件更加易于理解和维护。


小结:在onMounted中通常做以下事情:


发送网络请求,获取数据并更新组件的状态;

注册事件监听器,比如监听鼠标点击、滚动等事件;

初始化第三方库,比如图表库、地图库等;

执行一些需要在组件挂载后才能执行的操作,比如获取元素的尺寸、位置等。


需要注意的是,onMounted 中不应该包含会导致 DOM 重渲染的操作,比如修改组件的 props 或 data,因为这些操作会触发组件重新渲染,从而导致死循环或其他异常情况。如果需要修改组件的状态,应该在 setup 函数中使用 reactive 或 ref 来定义响应式数据,并在 template 中使用它们来渲染视图。


相关文章
|
23天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
126 64
|
23天前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
103 60
|
23天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
29 8
|
22天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
22 1
|
22天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
32 1
|
23天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
26天前
|
JavaScript 前端开发 API
从Vue 2到Vue 3的演进
从Vue 2到Vue 3的演进
39 0
|
26天前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
54 0
|
26天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
28天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
下一篇
DataWorks