Skip to content

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

例如:

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

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

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

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

例如:

vue
<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 这个方法确实是可以获取到组件实例的,如图:

image-20221201165728100

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

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

image-20221201165743709

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

image-20221201165753660

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

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