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

Vue2的mounted和Vue3的onMounted都是生命周期钩子,用于组件挂载后的操作,如DOM操作和网络请求。Vue2的mounted在组件实例中直接使用,有this上下文;Vue3的onMounted在setup函数内使用,无this上下文,需通过getCurrentInstance访问组件实例。在<scriptsetup>中,onMounted在模板渲染前执行,不能直接访问DOM,需配合nextTick或watchEffect。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 }
  }
}

两个钩子的区别

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

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

  3. 在 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 中可以访问组件的 propsdatacomputed 等属性,但是不能访问模板中的 DOM 元素,因为它们还没有被渲染出来。

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

组件实例创建时,即 beforeCreate 和 created 生命周期之间;
组件的 props 和 data 初始化完成后;
组件的 template 编译成渲染函数之前。

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


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 重渲染的操作,比如修改组件的 propsdata,因为这些操作会触发组件重新渲染,从而导致死循环或其他异常情况。如果需要修改组件的状态,应该在 setup 函数中使用 reactiveref 来定义响应式数据,并在 template 中使用它们来渲染视图。


Vue3中,onMounted是一个生命周期钩子函数,它在组件挂载到DOM之后执行。在这个钩子函数中,你可以执行一些需要在组件渲染之前完成的操作。对于引用中的PostList组件来说,onMounted钩子函数可以用来在组件渲染之前执行一些代码。比如,在onMounted钩子函数中可以执行一些初始化数据的操作,或者发送请求获取数据等。一般来说,onMounted钩子函数适合用来处理一些与DOM相关的操作,因为在这个钩子函数执行时,组件已经被挂载到DOM上了,可以确保DOM元素已经存在。 举个例子,如果你想在PostList组件挂载到DOM之后弹出一个提示框,你可以在onMounted钩子函数中使用alert方法来实现。引用中的代码示例中已经给出了一个onMounted钩子函数的使用示例。你可以在onMounted钩子函数中写入你希望在组件挂载之后执行的代码。 需要注意的是,在Vue3中,onMounted钩子函数是通过import { onMounted } from "vue"来导入的。在使用之前,你需要先导入onMounted方法。 总之,Vue3onMounted钩子函数可以让你在组件挂载到DOM之后执行一些代码,是一个非常有用的生命周期函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vue3-生命周期钩子函数](https://blog.csdn.net/menghuannvxia/article/details/126127079)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [解决vue页面DOM操作不生效的问题](https://download.csdn.net/download/weixin_38549721/13198458)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猫娃来啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值