Vue.extend与$mount的联系使用以及一类应用场景

本文介绍如何使用Vue.extend与$mount将复杂HTML内容替换为Vue组件,提高代码可维护性。

使用场景

这里先说一种可能的应用场景,看看你是怎么解决的

比如在你的项目中,不得不使用一个api,其中他的一些函数一些属性接收的参数只能是一个html如下,而这时你恰巧需要丰富这个html的内容,而且内容很多且不同,css很丰富,甚至里面有大量的逻辑需要写可能还要调一些接口,想要这时最好用一个组件来代替他,而不是在这里写,在这里写是一种灾难,那么怎么办?

   XXXX.setHTML(`<p>行政区域: ${address}</p>`)

这里他只接收html,用组件放在这里是没有用的,那我们怎么才能把这里面的东西替换成一个组件呢?

使用Vue.extend与$mount

为了解决这个问题,我们引入了vue.extend与$mount,当然他们可能有更多的使用场景,目前我只遇到这个。
extend是用来创建一个组件构造器,他可以接收一个组件来当做他的一个参数,返回的是这个组件的一个构造器,
$mount是用来挂载元素的
有了这两个东西,我们能不能用extend来生成一个组件构造器,然后在使用的地方实例化一个组件,然后挂载到上面的元素上呢,这当然可以。

具体操作就是如下所示

import Vue from 'vue'

//我想要塞进去的一个组件,该组件负责展示一下点的详细信息
import detail from '@/views/Detail.vue' 
// 利用vue.extend 生成一个该组件的构造器
const detailItem = Vue.extend(detail) 
//这里必须有一个唯一ID
XXXX.setHTML(`<div id='datail'></div>`)
// new一个实例,将生成的组件挂载到上面的dom上,相当于用组件把上面那个dom替换了
new detailItem ().$mount('#detail')

### 动态创建组件的方式 在 Vue 中,`Vue.extend` 是一种用于动态创建组件的机制,允许开发者在运行时基于现有组件或配置对象生成新的组件构造函数。通过 `Vue.extend` 创建的组件实例可以挂载到 DOM 中,实现按需渲染和动态加载的需求。此方法特别适用于需要通过逻辑判断动态创建和渲染组件的场景,例如弹窗组件、提示组件等[^2]。 ### 使用 `Vue.extend` 创建组件的步骤 1. **定义组件模板或组件对象** 可以是一个 `.vue` 文件导入的组件,也可以是直接通过 `template` 定义的字符串模板。 2. **调用 `Vue.extend` 方法** 传入组件配置对象,生成组件的构造函数。 3. **实例化组件并挂载到 DOM** 使用 `new` 关键字创建组件实例,并通过 `$mount` 方法将其挂载到指定的 DOM 节点。 ### 示例代码 以下是一个使用 `Vue.extend` 动态创建组件的完整示例: ```javascript // 定义一个简单的 Toast 组件 const Toast = { template: `<div class="toast">{{ message }}</div>`, props: ['message'] }; // 使用 Vue.extend 创建组件构造函数 const ToastConstructor = Vue.extend(Toast); // 创建组件实例并挂载 const toastInstance = new ToastConstructor({ propsData: { message: '这是一个提示信息' } }); // 挂载到 DOM toastInstance.$mount(); document.body.appendChild(toastInstance.$el); ``` 上述代码中,首先定义了一个简单的 `Toast` 组件,使用 `Vue.extend` 创建其构造函数,然后通过实例化构造函数并传入 `propsData` 来设置组件的属性值。最后调用 `$mount` 方法将组件挂载到页面上,并将其 DOM 节点添加到 `document.body` 中[^4]。 ### 插件化使用场景 `Vue.extend` 也可以用于开发插件,例如封装一个全局的 `$toast` 方法,使得在任意组件中都可以通过 `this.$toast` 调用并显示提示信息。以下是插件实现的示例: ```javascript // plugin.js import Toast from './toast.vue'; export default { install(Vue, options) { Vue.prototype.$toast = function (message) { const Constructor = Vue.extend(Toast); const instance = new Constructor(); instance.$slots.default = message; instance.$mount(); document.body.appendChild(instance.$el); }; } }; ``` 在 `main.js` 中引入并注册插件: ```javascript import Vue from 'vue'; import plugin from './plugin'; Vue.use(plugin); new Vue({ render: h => h(App) }).$mount('#app'); ``` 在组件中使用: ```javascript this.$toast('登录成功'); ``` 该插件通过 `Vue.extend` 动态创建组件实例,并将其挂载到页面上,实现了全局提示功能[^4]。 ### 注意事项 - `Vue.extend` 生成的组件构造函数继承自 Vue 的基础组件类,因此可以使用 `$props`、`$listeners`、生命周期钩子等特性。 - 在 Vue 3 中,`Vue.extend` 已被废弃,推荐使用 `defineComponent` 和组合式 API 实现类似功能。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值