Vue3中组件的挂载及调用

10 篇文章 0 订阅
1 篇文章 0 订阅

在Vue2.X中,我们通过Vue.prototype.$dialog = dialog的方式挂载组件,
并使用this.$xxx的形式通过函数调用组件,如this.$dialog({})

而在Vue3.X中,组合式API没有this,不过新增了globalProperties属性,代替了Vue.prototype

查看Vue3.X官方文档(https://www.vue3js.cn/docs/zh/api/application-config.html#globalproperties

// 之前(Vue 2.x)
Vue.prototype.$http = () => {}

// 之后(Vue 3.x)
const app = Vue.createApp({})
app.config.globalProperties.$http = () => {}

下面我们通过一个示例看看Vue3中如何实现组件的挂载及调用:

此处,我们在myDialog上增加install属性,并进行全局注册与挂载,再将其暴露出去

// dialog.js
myDialog.install = app => {
	// 全局注册
	app.component('myDialog', dialogConstructor)
	// 两种全局挂载方法
	app.config.globalProperties.$dialog = myDialog
	// app.provide('myDialog', myDialog)
}

export default myDialog

全局引入

在main.js中,我们将其导入,并通过app.use(),系统会自动调用其install方法

// main.js
import { createApp } from 'vue'
import App from './App.vue'
import myDialog from './packages/dialog/index.js'
const app = createApp(App)
// 此处注意app.mount需要放置最后,否则app.use无法执行
app.use(myDialog)
app.mount('#app')

在需要调用的vue文件中,我们通过 getCurrentInstance 获取ctx,getCurrentInstance 能帮助我们获取实例上下文,此处相当于Vue2.X中的this

// 需要调用组件的vue文件
import { getCurrentInstance } from 'vue'
setup() {
	const {ctx } = getCurrentInstance();
	ctx.$dialog({
		id:'my-dialog',
		title: "提示",
		content: "恭喜获得XXX代金券"
	})
	......
}

注意:ctx用于生产模式进行调试,打包后可能出现问题,此处建议改为proxy,即

// 需要调用组件的vue文件
import { getCurrentInstance } from 'vue'
setup() {
	const {proxy } = getCurrentInstance();
	proxy.$dialog({
		id:'my-dialog',
		title: "提示",
		content: "恭喜获得XXX代金券"
	})
	......
}

此外,我们还可以使用第二种方式 Provide / Inject
点击查看(https://www.vue3js.cn/docs/zh/api/application-api.html#provide

import { inject } from 'vue';
setup() {
	const myDialog = inject('myDialog')
	myDialog({
		id:'my-dialog',
		title: "提示",
		content: "恭喜获得XXX代金券"
	})
}

局部引入

若只想在局部组件中调用,我们也可以使用标签或函数两种调用模式,据实际需求使用

标签调用:

<Dialog title="hello" @click="test" :visible="true" @ok-btn-click="test" :closeOnClickModal="false" content="Trist"></Dialog>

<script>
import Dialog from './packages/dialog/index.js'
export default {
	components: {
		Dialog 
	}
}
</script>

//或者	setup语法糖可省略大量代码
<script setup>
import Dialog from './packages/dialog/index.js'
</script>

函数调用:

import Dialog from './packages/dialog/index.js'
export default {
	setup() {
		Dialog({
			id:'my-dialog',
			title: "提示",
			content: "恭喜获得XXX代金券"
		})
	}
}
</script>

//或者	setup语法糖可省略大量代码
<script setup>
import Dialog from './packages/dialog/index.js'
Dialog({
	id:'my-dialog',
	title: "提示",
	content: "恭喜获得XXX代金券"
})
</script>
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue,当父组件需要在挂载调用组件的方法,我们可以通过以下步骤来实现: 1. 在子组件,通过defineExpose方法将需要调用的方法进行导出。例如,我们可以将clearAllErrors方法导出给父组件使用: ``` defineExpose({ clearAllErrors }) ``` 2. 在父组件,通过ref引用子组件,并在父组件挂载时访问子组件实例。例如,我们可以在父组件模板使用ref绑定子组件: ``` <ChildComponent ref="childRef"></ChildComponent> ``` 3. 在父组件的mounted钩子函数,通过访问子组件实例来调用组件的方法。例如,我们可以通过this.$refs.childRef来获取子组件实例,并调用其clearAllErrors方法: ``` mounted() { this.$refs.childRef.clearAllErrors(); } ``` 需要注意的是,如果在Vue使用了TypeScript,我们需要在子组件的定义时使用InstanceType<typeof 子组件>的形式来声明子组件的实例类型。但是,这种方式可能会在npm run build的时候报错。因此,需要注意在使用TypeScript时,检查并解决该报错。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [关于Vue3+ts父组件调用组件方法](https://blog.csdn.net/xuefeng11111/article/details/123117807)[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_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值