返回顶部
首页 > 资讯 > 前端开发 > JavaScript >详解Vue全局组件的挂载之实现弹窗组件
  • 797
分享到

详解Vue全局组件的挂载之实现弹窗组件

Vue组件挂载 弹窗Vue组件挂载Vue弹窗组件Vue 弹窗 2022-11-13 19:11:31 797人浏览 安东尼
摘要

目录Vue组件挂载类型组件挂载代码示例1.vue.extend()方法2.render函数挂载vue组件挂载类型 vue中组件的挂载分为两种类型: vue.extend() rend

vue组件挂载类型

vue中组件的挂载分为两种类型:

vue.extend()

render函数

组件挂载代码示例

1.vue.extend()方法

此处实现一个弹窗组件,包含确定取消按钮

msgBox.vue文件:(此处样式可自行修改)

<template>
  <div v-if="showMsgBox" class="mag-box">
      <transition enter-active-class="animated bounceInDown" leave-active-class="animated bounceOutUp">
        <div class="mask-div">
          <div class="msg-tip">
            <div class="msg-title">
              <p>提示</p>
            </div>
            <div class="msg-content">
              {{ msgTip }}
            </div>
            <div class="msg-btn-group flex-end">
              <div v-show="msgType === 1" class="msg-btn cancle-btn" @click="cancleMsg">
                <p>取消</p>
              </div>
              <div v-show="msgType < 2" class="msg-btn confirm-btn" @click="confirmMsg">
                <p>确定</p>
              </div>
            </div>
          </div>
        </div>
      </transition>
    </div>

</template>

<script>
export default {
  name: 'MsgBox',
  data() {
    return {
      msgTip: '',
      showMsgBox: false,
      msgType: '', // 0 只显示确定  1 确定 取消  2 都不显示  3整个组件不显示
      success: '',
      cancle: ''
    }
  },
  methods: {
    open({ msgTip, msgType = 1, success, cancle }) {
      this.showMsgBox = true
      this.msgType = msgType
      this.msgTip = msgTip
      this.success = success
      this.cancle = cancle
    },
    confirmMsg() {
      this.showMsgBox = false
      this.success()
      // 组件关闭后销毁该组件
      this.remove()
    },
    cancleMsg() {
      this.showMsgBox = false
      this.cancle()
      this.remove()
    }
  }
}
</script>
<style scoped lang="less">
    .mask-div {
        position: fixed;
        width: 100%;
        height: 100%;
        z-index: 5000;
        left: 0;
        right: 0;
        top: 0;
        bottom: 0;
        background: rgba(32,42,59,0.5);
    }
    .msg-tip {
        width:378px;
        height:145px;
        box-shadow:0 3px 6px rgba(0,0,0,0.16);
        background: #ffffff;
        border-radius:4px;
        position: absolute;
        left: 0;
        right: 0;
        top: 0;
        bottom: 0;
        margin: auto;
        z-index: 9999;
    }
    .msg-title {
        width: 100%;
        height:36px;
        background-color:#1f95ee;
        border-radius:4px 4px 0 0;
        p {
            color: #ffffff;
            font-size: 16px;
            line-height: 36px;
            text-align: center;
        }
    }
    .msg-content {
        padding: 20px;
        width: 100%;
        box-sizing: border-box;
        font-size: 14px;
    }
    .msg-btn-group {
        position: absolute;
        bottom: 20px;
        right: 20px;
        .msg-btn {
            padding: 6px 10px;
            cursor: pointer;
            border-radius: 4px;
            p {
                font-size: 12px;
                border-radius: 4px;
            }
        }
        .cancle-btn {
            background: #fff;
            border: 1px solid #dcdfe6;
            color: #606266;
        }
        .confirm-btn {
            color: #fff;
            background-color: #409eff;
            border-color: #409eff;
            margin-left: 10px;
        }
    }
</style>

msgBox.js文件:

// 导入msgBox的vue文件
import msgBox from './msgBox'

const msgBox = {
  install: function(Vue) {
    // 组件注册
    const Msg = Vue.extend(msgBox)
    const msg = new Msg()

    // 挂载
    // 此处展示了两个盒子,是因为vue.extend方法挂载会覆盖原有的dom元素,销毁后便无法再次挂载
    document.body.innerhtml += '<div id="msg"><div id="msg"></div></div>'
    msg.$mount('#msg')
    // 全局注册
    Vue.prototype.$msgBoxInfo = function(options) {
    // 打开弹窗触发的方法
      msg.open(options)
      // 弹窗关闭后销毁组件
      msg.remove = function() {
        const msgDom = document.getElementById('msg')
        document.body.removeChild(msgDom)
        msg.$destroy()
      }
      return msg
    }
  }
}
export default msgBox

main.js文件内引入使用:

// 此处根据实际路径引入
import msgBoxfrom './msgBox'
Vue.use(msgBox)

调用方式:

this.$msgBoxInfo({
          msgTip: '这是新的msgbox',
          success: () => {
            alert('成功状态的msgbox')
          },
          cancle:() => {
            alert('取消状态的msgbox')
          }
        })

vue.extend()中的data是一个函数并且返回一个对象;且会覆盖被挂载的dom元素;

同时也需要注意install方法能够开发新的插件并且注册全局组件。并且用install注册的组件,在main.js文件内引用的时候,需要使用Vue.use()进行全局声明。

2.render函数挂载

notice.vue文件(此处弹窗比较粗糙,样式自行修改)

<template>
  <div class="box">
    <h3>{{ title }}</h3>
    <div class="box-content">{{ message }}</div>
  </div>
</template>
<script>
export default {
  name: 'Notice',
  props: {
    title: {
      type: String,
      default: ''
    },
    message: {
      type: String,
      default: ''
    },
    duration: {
      type: Number,
      default: 1000
    }
  },
  data() {
    return {
      iShow: false
    }
  },
  methods: {
    show() {
      this.iShow = true
      setTimeout(this.hide, this.duration)
    },
    hide() {
      this.iShow = false
      this.remove()
    }
  }
}
</script>
<style scoped>
    .box {
        position: fixed;
        width: 300px;
        top: 100px;
        right: 0;
        text-align: center;
        pointer-events: none;
        background-color: #fff;
        border: grey 3px solid;
        box-sizing: border-box;
    }
    .box-content {
        width: 200px;
        margin: 10px auto;
        font-size: 14px;
        padding: 8px 16px;
        background: #fff;
        border-radius: 3px;
        margin-bottom: 8px;
    }
</style>

notice.js文件

import Vue from 'vue'
function notice(Component, props) {
  const vm = new Vue({
    render: h => h(Component, { props })
  }).$mount()
  document.body.appendChild(vm.$el)
  const comp = vm.$children[0]
  // 需要对挂载的组件进行删除
  comp.remove = function() {
    document.body.removeChild(vm.$el)
    vm.$destroy()
  }
  return comp
}
export default notice

main.js文件引入:

import create from './notice'
Vue.prototype.$create = create

方法调用:

import Notice from '../Notice'
// 此处的notice组件需要引入
this.$create(Notice, {
            title: '自己封装弹窗',
            message: '你好,这是自己写的弹窗',
            duration: 1000
          }).show()

render函数作用:是vue通过js渲染dom结构的函数createElement,可以简写为h;这个函数会生成一个虚拟dom节点,render函数得到这个dom节点函数之后,返回给mount函数,渲染为真实的dom节点,并挂载到根节点上。

以上就是详解Vue全局组件的挂载之实现弹窗组件的详细内容,更多关于Vue组件挂载 弹窗的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解Vue全局组件的挂载之实现弹窗组件

本文链接: https://lsjlt.com/news/171036.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解Vue全局组件的挂载之实现弹窗组件
    目录vue组件挂载类型组件挂载代码示例1.vue.extend()方法2.render函数挂载vue组件挂载类型 vue中组件的挂载分为两种类型: vue.extend() rend...
    99+
    2022-11-13
    Vue组件挂载 弹窗 Vue组件挂载 Vue弹窗组件 Vue 弹窗
  • vue全局挂载如何实现APP全局弹窗
    本篇内容主要讲解“vue全局挂载如何实现APP全局弹窗”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue全局挂载如何实现APP全局弹窗”吧!需求背景app端对接网页端的客服系统,在用户实现网页...
    99+
    2023-06-30
  • react实现全局组件确认弹窗
    本例基于react实现了一个简单的确认弹窗,可以让我们在项目中根据需要随时调用 创建全局modal组件 此处我将弹窗模态框独立出来,用户可以通过传入组件或Element来填充模态框的...
    99+
    2024-04-02
  • vue extend+promise封装全局弹窗组件
    本文实例为大家分享了vue extend+promise封装全局弹窗组件的具体代码,供大家参考,具体内容如下 因为项目没有引入第三方UI库,所以所有的公共组件都需要自己封装现在需要一...
    99+
    2024-04-02
  • vue全局挂载实现APP全局弹窗的示例代码
    目录需求背景需求分析代码展示需求背景 app端对接网页端的客服系统,在用户实现网页客户系统发起询问时,app不论在哪个页面都需要弹窗提示 需求分析 这个需求分为两步,一个是负责双向...
    99+
    2024-04-02
  • Vue3组件挂载之创建组件实例详解
    目录前情提要mountComponent创建组件实例总结前情提要 上文我们讲解了执行createApp(App).mount('#root')中的mount函数,我们...
    99+
    2022-11-13
    Vue3 组件挂载创建实例 Vue3 组件挂载
  • Vue弹窗组件的实现方法
    本文实例为大家分享了Vue弹窗组件的实现具体代码,供大家参考,具体内容如下 弹窗组件包含内容: 弹窗遮罩层内容层的实现(涉及slot、props、$on、$emit) 实现步骤: 1...
    99+
    2024-04-02
  • 解析Vue全局组件和局部组件
    Vue中组件分为两种: 全局组件 局部组件接下来我们看看两种组件的区别:一、使用范围:全局组件使用范围:可以在页面中任何位置使用局部组件使用范围:只能在定义它的el中使用,不能再其他位置使用,否则就无法生效二、定义组件的方法:全局组件:可以...
    99+
    2023-06-02
  • vue自定义全局组件实现弹框案例
    本文实例为大家分享了vue自定义全局组件实现弹框案例的具体代码,供大家参考,具体内容如下 说明:本案例是封装的一个弹框页面,因为只想要一个遮罩,内容自定义。因为ElementUI上已...
    99+
    2024-04-02
  • Vue实现全局的toast组件方式
    目录Vue全局的toast组件1.创建toast组件2.创建toast.js文件3.安装并使用 vue自定义toast组件使用总结Vue全局的toast组件 1.创建toa...
    99+
    2023-03-06
    Vue全局的toast组件 Vue全局 Vue toast组件
  • Vue如何实现全局的toast组件
    这篇文章主要介绍“Vue如何实现全局的toast组件”,在日常操作中,相信很多人在Vue如何实现全局的toast组件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue如何实现全局的toast组件”的疑惑有所...
    99+
    2023-07-05
  • React实现动效弹窗组件
    我们在写一些 UI 组件时,若不考虑动效,就很容易实现,主要就是有无的切换(类似于 Vue 中的 v-if 属性)或者可见性的切换(类似于 Vue 中的 v-show 属性)。 1...
    99+
    2024-04-02
  • vue中的slot封装组件弹窗怎么实现
    这篇文章主要介绍了vue中的slot封装组件弹窗怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue中的slot封装组件弹窗怎么实现文章都会有所收获,下面我们一起来看看吧。slot封装组件弹窗<t...
    99+
    2023-06-30
  • vue中怎么实现一个toast弹窗组件
    本篇文章给大家分享的是有关vue中怎么实现一个toast弹窗组件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先,我们来分析一下弹窗组件的特...
    99+
    2024-04-02
  • Vue基于Element-ui实现表格弹窗组件
    本文实例为大家分享了Vue基于Element-ui实现表格弹窗组件的具体代码,供大家参考,具体内容如下 效果图 使用方式 acTable1 () {   this.$modalTa...
    99+
    2024-04-02
  • Vue之组件详解
    <body> <div id="root"> <h2>{{name}}</h2> ...
    99+
    2024-04-02
  • vue中的slot封装组件弹窗
    目录slot封装组件弹窗vue组件slot入门---弹窗组件插槽的基础使用弹窗组件slot封装组件弹窗 <template>   <el-dialog :title...
    99+
    2024-04-02
  • vue如何实现全局组件注册
    这篇文章主要为大家展示了“vue如何实现全局组件注册”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何实现全局组件注册”这篇文章吧。全局组件注册1 一般情...
    99+
    2024-04-02
  • vue全局组件和局部组件的写法介绍
    目录全局组件和局部组件写法全局组件引入写法局部组件引入写法vue全局/局部组件全局组件和局部组件写法 vue组件有两种,一种是全局组件,一种是局部组件。整个项目经常用到的用全局写法,...
    99+
    2024-04-02
  • uniapp中全局页面挂载组件(小程序)
    uniapp中页面全局挂载组件 首先我说的方法不是全局引入注册使用的时候把标签放在页面中 所需库 vue-inset-loader 步骤: 1.首先需要把uniapp项目 初始化 npm init 下载所需库 npm i vue-inset...
    99+
    2023-08-17
    uni-app 小程序 javascript
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作