vue实现自定义组件挂载原型上

 更新时间:2022年08月09日 10:26:39   作者:Mosowe  
这篇文章主要介绍了vue实现自定义组件挂载原型上方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

自定义组件挂载原型上

以elementUI二次分装dialog举例

PageDialog.vue

<!-- 页面提示弹框 -->
<template>
    <el-dialog
      :visible.sync="show"
      class="page-dialog-wrapper"
      custom-class="page-dialog-component"
      :width="width"
      :append-to-body="true"
      :show-close="false"
      :close-on-click-modal="false">
      <div class="container">
        <div class="title">
          <slot name='title-icon'>
            <i
              :class="titleIcon"
              v-if="titleIcon">
            </i>
          </slot>
          {{title}}
          <i
            class="el-icon-close close-btn"
            @click="close"
            v-if="showClose">
          </i>
        </div>
        <div class="content">
          <slot>
            <div class="text" v-html="message"></div>
          </slot>
          <div class="btns" v-if="showConfirm || showCancel">
            <el-button
              class="btn cancel"
              @click="close"
              v-if="showCancel">
              {{cancelText}}
            </el-button>
            <el-button
              class="btn"
              @click="confirm"
              v-if="showConfirm">
              {{confirmText}}
            </el-button>
          </div>
        </div>
      </div>
    </el-dialog>
</template>
<script>
/**
 * slot:
 *  default:提示文本区域,默认
 *  title-icon:标题前面的icon
 * function:
 *  confirm:确认按钮点击
 *  close:取消及关闭按钮点击
 */
export default {
  name: 'PageDialogComponent',
  components: {},
  props: {
    show: { // 隐藏显示
      type: Boolean,
      default: false,
    },
    width: { // 宽度
      type: String,
      default: '600px',
    },
    title: { // 标题
      type: String,
      default: '提示',
    },
    titleIcon: { // 标题icon
      type: String,
      default: '',
    },
    showCancel: { // 是否显示取消按钮
      type: Boolean,
      default: false,
    },
    cancelText: { // 取消按钮文本
      type: String,
      default: '取消',
    },
    showConfirm: { // 是否显示确认按钮
      type: Boolean,
      default: true,
    },
    confirmText: { // 确认按钮文本
      type: String,
      default: '确定',
    },
    message: { // 提示内容
      type: String,
      default: '这里是提示语',
    },
    showClose: { // 是否显示关闭按钮
      type: Boolean,
      default: true,
    },
  },
  methods: {
    // 确定
    confirm() {
      this.$emit('confirm');
    },
    // 关闭
    close() {
      this.$emit('close');
    },
  },
};
</script>
<style lang='less' scoped>
// 样式区
</style>

同目录新建index.js

import vue from 'vue';
// 这里就是我们刚刚创建的那个静态组件
import pageDialog from './PageDialog.vue';
// 返回一个 扩展实例构造器
const DialogConstructor = vue.extend(pageDialog);
// 定义弹出组件的函数
function showDialog(options) {
  return new Promise((resolve, reject) => {
    const dialogDom = new DialogConstructor({
      el: document.createElement('div'),
    });
    dialogDom.width = options.width || dialogDom.width;
    dialogDom.title = options.title || dialogDom.title;
    dialogDom.titleIcon = options.titleIcon || dialogDom.titleIcon;
    dialogDom.showCancel = options.showCancel || dialogDom.showCancel;
    dialogDom.cancelText = options.cancelText || dialogDom.cancelText;
    dialogDom.showConfirm = options.showConfirm || dialogDom.showConfirm;
    dialogDom.confirmText = options.confirmText || dialogDom.confirmText;
    dialogDom.message = options.message || dialogDom.message;
    dialogDom.showClose = options.showClose || dialogDom.showClose;
    dialogDom.show = true;
    document.body.appendChild(dialogDom.$el);
    dialogDom.confirm = function () { // 确定按钮
      resolve();
      dialogDom.show = false;
    };
    dialogDom.close = function () { // 取消按钮
      reject();
      dialogDom.show = false;
    };
  });
}
// 注册为全局组件的函数
function registryDialog() {
  // 将组件注册到 vue 的 原型链里去,
  // 这样就可以在所有 vue 的实例里面使用 this.$pageDialog()
  vue.prototype.$pageDialog = showDialog;
}
export default registryDialog;

main.js中引入

import pageDialog from '../components/page-dialog/index';
Vue.use(pageDialog)

可以html组件使用

    <!-- 删除前提示 -->
    <page-dialog
    :show="showDialog"
    showCancel
    message="确认删除已选产品?"
    @confirm="deleteChoose"
    @close="showDialog = false"/>

或者在js中使用

        this.$pageDialog({
          message: '审核后的订单有部分发生变化,确定按调整后订单支付?',
          showCancel: true,
          cancelText: '我在想想',
        }).then(() => {
        // 搞事情
        }).catch(() => {
        // 搞事情
        });

在原型上挂载方法和组件

挂在方法,在main.js中

Vue.prototype.langs = function lang(en, id, zh) {
  const L = this.language
  switch (L) {
    case 'en':
      return en || ''
    case 'id':
      return id || ''
    case 'zh':
      return zh || ''
  }
}

使用:this.langs()

注意:

1、如当前页面中的方法与原型方法名字一致,则会覆盖原型的方法

2、如果原型方法太多写在main.js中会赘余,所以一般在另外创建一个js文件,这个js文件都是全部写原型的方法,然后引入到main.js当中,然后把它放在这个位置

new Vue({
  el: '#app',
  router,
  store,
  test, // 比如这个就是js文件,放到vue上面
  components: { App },
  template: '<App/>'
})

挂载组件

import testA from '@/A'
Vue.component('testA ', testA )

使用:<testA></testA>或者<test-a><test-a/> 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • 一篇文章看懂Vue组合式API

    一篇文章看懂Vue组合式API

    众所周知组合式API是一系列API的集合,使我们可以使用函数而不是声明选项的方式书写Vue组件,这篇文章主要给大家介绍了关于Vue组合式API的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • vue打印功能实现的两种方法总结

    vue打印功能实现的两种方法总结

    在项目中,有时需要打印页面的表格,所以下面这篇文章主要给大家介绍了关于vue打印功能实现的两种方法,以及批量打印的完整代码,需要的朋友可以参考下
    2021-06-06
  • vue中使用keep-alive动态删除已缓存组件方式

    vue中使用keep-alive动态删除已缓存组件方式

    这篇文章主要介绍了vue中使用keep-alive动态删除已缓存组件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • vue实现关键字高亮效果的示例代码

    vue实现关键字高亮效果的示例代码

    这篇文章主要为大家详细介绍了如何使用vue实现关键字高亮效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • 浅谈vue中改elementUI默认样式引发的static与assets的区别

    浅谈vue中改elementUI默认样式引发的static与assets的区别

    下面小编就为大家分享一篇浅谈vue中改elementUI默认样式引发的static 与assets的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • vue实现移动端原生小球滑块

    vue实现移动端原生小球滑块

    这篇文章主要为大家详细介绍了vue实现移动端原生小球滑块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Vue项目保持element组件同行,设置组件不自动换行问题

    Vue项目保持element组件同行,设置组件不自动换行问题

    这篇文章主要介绍了Vue项目保持element组件同行,设置组件不自动换行问题。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • vue3 diff 算法示例

    vue3 diff 算法示例

    这篇文章主要为大家介绍了vue3 diff 的算法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 解决Element ui导航栏选中背景色刷新消失的问题

    解决Element ui导航栏选中背景色刷新消失的问题

    这篇文章主要介绍了解决Element ui导航栏选中背景色刷新消失的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 详解Vue用cmd创建项目

    详解Vue用cmd创建项目

    在本篇内容里小编给大家整理了关于Vue用cmd创建项目的方法讲解,有兴趣的朋友们跟着学习下。
    2019-02-02

最新评论