关于Vue3获取当前组件实例的 getCurrentInstance 方法的补充

简介: 上一篇文章:快速使用Vue3最新的15个常用API,我向大家介绍了关于Vue3常用的15个API的使用详情,帮助大家快速上手Vue3,也很高兴收到大家的支持,同样也有一些人提出了疑问,尤其是对于 「如何获取当前组件实例」 这个问题的讨论最为激烈,这里我们就对其进行一些补充

在Vue2的各个组件中,我们频繁地使用 this ,即获取当前组件实例,是因为每个组件的数据变量、方法都要通过组件实例去获取。


例如:


<script>
export default {
  name: 'App',
  data: {
    return {
      name: '前端印象',
      age: 22
    }
  },
  methods: {
    increase() {
      this.age += 1
    }
  },
  mounted() {
    this.increase()
  }  
}
</script>


在上面这段代码中很清晰的看到,首先在 data 中声明了两个响应式数据,分别为 nameage;同时定义了一个方法 increase,该方法是将 age 的值 +1;在当前组件挂载后,调用 increase 方法


无论是获取数据 age,还是获取方法 increase,我们都是从 this,即当前组件实例中获取的


而到了Vue3,大部分甚至可以说全部的关键代码都集中写在了 setup 函数内,并且在该函数内是无法通过 this 获取到当前组件实例的,那是因为所有的变量、方法都可以直接使用


例如:


<script>
import {ref, onMounted} from 'vue'
export default {
  name: 'App',
  setup() {
    const name = ref('前端印象')
    const age = ref(22)
    function increase() {
      age.value += 1
    }
    onMounted(() => {
      increase()
    })
    return {name, age}
  }
}
</script>


这段代码与上一段代码功能一模一样,但从始至终都没有通过组件实例去获取数据变量或方法,这无疑减少了很多的重复代码,例如多次使用 this,想必Vue3的初衷也不需要我们去获取当前组件实例


但是上一篇文章讲到的 getCurrentInstance 这个方法确实是可以获取到组件实例的,如图


568967b47d8b55ccee78f90b11ed5085.png


但这只有在 development,即开发环境下才能获取到当前组件的实例,换句话说就是这个方法只是在开发环境下用于调试使用的;


那么在生产环境下是什么样的呢?我们把项目打包一下,并打印一下看看,如图所示:


a528153b425f04081ef7ad1522ecc2c8.png


很明显,在 ctx 中根本没有看到当前组件实例的影子,而只有一个 _,我们点进去看看里边是什么,如图所示


865cfa0b9f90319c50dac4d0e4969460.jpg


通过不断的点击,我们发现 _ 里面是无限循环的 getCurrentInstance 方法的返回结果,所以说该方法的返回结果在开发环境和生产环境下还是有所区别的


那么,问题又来了,Vue3我们到底如何去获取组件实例呢?这里我想说哈,都这样了,还获取啥组件实例啊,不信我给你捋一遍


1. 获取数据


Vue2:


<script>
export default {
  name: 'App',
  data: {
   return {
      name: '前端印象',
      age: 22
   }
  },
  mounted() {
   console.log(this.name)
   console.log(this.age)
  }  
}
</script>


Vue3:


<script>
import {ref} from 'vue'
export default {
  name: 'App',
  setup() {
    const name = ref('前端印象')
    const age = ref(22)
    console.log(name.value)
    console.log(age.value)
    return {name, age}
  }
}
</script>


2. 使用方法


Vue2:


<script>
export default {
  name: 'App',
  methods: {
    show() {
      console.log('show方法被调用')
    }
  },
  mounted() {
    this.show()
  }  
}
</script>


Vue3:


<script>
import {onMounted} from 'vue'
export default {
  name: 'App',
  setup() {
    function show() {
      console.log('show方法被调用')
    }
    onMounted(() => {
      show()
    })
  }
}
</script>


3. 获取当前组件根元素


Vue2:


<template>
  <div id="app" ref="root">
   <p class="child"></p>
  </div>
</template>
<script>
export default {
  name: 'App',
  mounted() {
    const el = this.$refs.root
    console.log(el)
  }  
}
</script>


Vue3:


<template>
  <div id="app" ref="root">
   <p class="child"></p>
  </div>
</template>
<script>
import {ref, onMounted} from 'vue'
export default {
  name: 'App',
  setup() {
    const root = ref(null)
    onMounted(() => {
      console.log(root.value)
    })
  }
}
</script>


4. 子组件向父组件通信


Vue2:


<script>
export default {
  name: 'App',
  methods: {
    change() {
      this.$emit('valueChange', 3)
    }
  } 
}
</script>


Vue3:


<script>
export default {
  name: 'App',
  setup(props, context) {
    function change() {
      context.emit('valueChange', 3)
    }
  }
}
</script>


5. 获取Vuex对象


Vue2:


<script>
export default {
  name: 'App',
  mounted() {
    console.log(this.$store.state.name)
    this.$store.commit('show')
  } 
}
</script>


Vue3:


<script>
import {onMounted} from 'vue'
import {useStore} from 'vuex'
export default {
  name: 'App',
  setup(props, context) {
    const store = useStore()
    onMounted(() => {
      console.log(store.name)
      store.commit('show')
    })
  }
}
</script>


「总结」


大家不要依赖 getCurrentInstance 方法去获取组件实例来完成一些主要功能,否则在项目打包后,一定会报错的。

相关文章
|
5月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
514 2
|
8月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
980 0
|
8月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
4月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
430 137
|
10月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
1216 4
|
9月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
1261 78
|
10月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
7月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
569 1
|
7月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
394 0
|
8月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
598 17