首先明确在Vue3的setup函数里的情况
在Vue3中,setup函数是一个新的组件选项,它主要用于替代Vue2中的一些基于选项对象的配置方式,比如data、computed、methods等,但这里要注意哦,在setup函数内部,是没办法直接像在Vue2组件实例里那样使用this关键字来获取组件实例的。
为啥呢?因为setup函数在组件初始化阶段就被调用了,它的执行上下文和传统的基于this的组件实例上下文不太一样,它更像是一个独立的函数环境,主要是用来返回一些供模板使用或者给其他模块导入的属性和方法。
那如果真的想获取类似Vue2中this能获取到的一些信息怎么办呢?
其实呀,Vue3给我们提供了一些替代的办法来达到类似的效果呢。
(一)获取组件实例的props和attrs
如果想获取传入组件的props和attrs(也就是非props的属性),在setup函数里可以通过参数来获取哦,setup函数接收两个参数,第一个参数就是props,这里面就包含了父组件传递给当前组件的所有props数据啦,你可以直接像使用普通对象属性一样去使用里面的内容。
比如有个组件接收一个名为message的props:
<template>
<div>{{ message }}</div>
</template>
<script>
import { defineComponent } from 'vue';
export default defineComponent({
props: {
message: String
},
setup(props) {
// 这里就可以直接使用props.message啦
console.log(props.message);
return {
// 也可以把它返回出去供模板使用哦
message: props.message
};
}
});
</script>而对于attrs,在Vue3里可以通过引入getCurrentInstance这个函数来获取,不过要注意哦,这个函数获取到的实例信息相对来说是比较底层的,在生产环境使用时要谨慎呢,尽量只在确实需要的情况下用。
示例如下:
<template>
<div>{{ customAttr }}</div>
</template>
<script>
import { defineComponent, getCurrentInstance } from 'vue';
export default defineComponent({
setup() {
const instance = getCurrentInstance();
if (instance) {
const { attrs } = instance;
// 这里就可以获取到非props的属性啦
console.log(attrs.customAttr);
return {
customAttr: attrs.customAttr
};
}
return {};
}
});
</script>(二)获取组件实例的上下文相关信息(比如emit等)
要是想在setup函数里触发一个自定义事件,就像在Vue2里通过this.$emit来做的那样,在Vue3里同样可以通过引入getCurrentInstance函数来获取到组件实例,然后从实例上拿到emit方法来触发事件哦。
比如有个组件要触发一个名为customEvent的自定义事件:
<template>
<button @click="handleClick">点击触发事件</button>
</template>
<script>
import { defineComponent, getCurrentInstance } from 'vue';
export default defineComponent({
setup() {
const instance = getCurrentInstance();
if (instance) {
const { emit } = instance;
const handleClick = () => {
// 这里就可以触发自定义事件啦
emit('customEvent', '传递一些数据哦');
};
return {
handleClick
};
}
return {};
}
});
</script>总结一下啦
在Vue3的setup函数里虽然不能像Vue2那样直接用this来获取组件实例相关的一切信息,但通过合理利用传入的props参数以及引入getCurrentInstance函数来获取attrs、emit等相关内容,也完全可以满足我们在组件开发过程中对类似功能的需求呀,所以呀,只要熟悉了这些新的方式,在Vue3的开发中也能很顺畅地实现各种功能呢。


网友回答文明上网理性发言 已有0人参与
发表评论: