通过vue.extend实现一个弹窗组件

本文将介绍如何利用Vue.js的vue.extend方法来创建一个弹窗组件,并详细讲解了从编写基础弹窗组件,到构建灵活使用的弹窗函数,最后在实际组件中调用并应用的过程。

1.首先编写需要被继承的弹窗组件

<template>
  <div v-if="show" ref="modal" class="ek-modal_wrap">
    <div class="ek-modal-content">
      <div class="modal-title-wrap">
        <div class="modal-title">{
  
  { title }}</div>
        <slot name="description"></slot>
      </div>
      <div class="modal-button">
        <a v-if="confirmVisible" class="contral-btn confirm-btn" href="javascript:;" @click="confirm">{
  
  {
          confirmText
        }}</a>
        <a v-if="cancleVisible" class="contral-btn cancle-btn" href="javascript:;" @click="cancle">{
  
  { cancleText }}</a>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      show: true,
      title: '', // 标题
      confirmText: '确定', // 确认文字
      confirmVisible: true, // 是否展示确认按钮
      onConfirm: () => { // 确认执行函
### 动态创建组件的方式 在 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、付费专栏及课程。

余额充值