广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue使用Vue.extend创建全局toast组件实例
  • 477
分享到

vue使用Vue.extend创建全局toast组件实例

vue使用Vue.extendVue.extend创建全局Vue.extend toast组件 2023-03-06 08:03:35 477人浏览 安东尼
摘要

目录Vue.extend创建全局toast组件关于vue.extend的理解应用基本概念官网基本示例应用总结Vue.extend创建全局toast组件 src -> compo

Vue.extend创建全局toast组件

src -> components -> Toast -> toast.vue

<template>
  <transition name="fades">
    <div class="ErrORMes"  v-if="show">{{txt}}</div>
  </transition>
</template>
 
<script>
export default {
  name: 'Toast',
  data () {
    return {
      txt: '',
      show: false
    }
  }
}
</script>
<style lang="less" scoped>
.fades-enter-active, .fades-leave-active {
  transition: opacity 0.5s;
}
.fades-enter, .fades-leave-active {
  opacity: 0;
}

.Errormes {
  position: fixed;
  top: 40%;
  left: 50%;
  -WEBkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
  padding: 20px 30px;
  background: rgba(0, 0, 0, 0.8);
  border-radius: 16px;
  color: #fff;
  font-size: 28px;
  z-index: 999999;
  max-width: 80%;
  height: auto;
  line-height: 60px;
  text-align: center;
}
</style>

src -> components -> Toast -> index.js

import Toast from './toast.vue'
 
const toast = {}
toast.install = (vue) => {
  const ToastClass = vue.extend(Toast)
  const instance = new ToastClass()
  instance.$mount(document.createElement('div'))
  document.body.appendChild(instance.$el)
 
  let t = null
  const ToastMain = {
    show (msg, seconds = 2000) {
      if (t) clearTimeout(t)
      instance.txt = msg
      instance.show = true
      t = setTimeout(() => {
        instance.show = false
      }, seconds)
    }
  }
  vue.prototype.$toast = ToastMain
}
 
export default toast

main.js

import Vue from 'vue'
import App from './App.vue'
import toast from '@/components/Toast/index'
 
Vue.use(toast)

使用

$toast.show(message)

关于vue.extend的理解应用

基本概念

Vue.extend( options )

使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。

一般,我们会用 Vue.extend 接收一个组件对象来创建一个构造器,再利用创建的构造器 new 一个实例,并将这个实例挂载到一个元素上。

官网基本示例

<div id="mount-point"></div>
// 创建构造器
var Profile = Vue.extend({
  template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',
  data: function () {
    return {
      firstName: 'Walter',
      lastName: 'White',
      alias: 'Heisenberg'
    }
  }
})
// 创建 Profile 实例,并挂载到一个元素上。
new Profile().$mount('#mount-point')

data 选项是特例,需要注意 - 在 Vue.extend() 中它必须是函数

结果如下:

<p>Walter White aka Heisenberg</p>

应用

Vue.extend 属于 Vue 的全局 api,在实际业务开发中我们很少使用,因为相比常用的 Vue.component 写法使用 extend 步骤要更加繁琐一些。

但是在一些独立组件开发场景中,例如要实现一个类似于 window.alert() 提示组件,要求像调用 JS 函数一样调用它,这时候 Vue.extend + $mount 这对组合就是我们需要去关注的。

1、vue $mount 和 el的区别说明

在应用之前我们先了解一下2个东西 —— $mount 和 el,两者在使用效果上没有任何区别,都是为了将实例化后的vue挂载到指定的dom元素中。

如果在实例化vue的时候指定el,则该vue将会渲染在此el对应的dom中,反之,若没有指定el,则vue实例会处于一种“未挂载”的状态,此时可以通过$mount来手动执行挂载。

注:如果$mount没有提供参数,模板将被渲染为文档之外的的元素,并且你必须使用原生DOM API把它插入文档中。

var MyComponent = Vue.extend({
 template: '<div>Hello!</div>'
})
 
// 创建并挂载到 #app (会替换 #app)
new MyComponent().$mount('#app')
 
// 同上
new MyComponent({ el: '#app' })
 
// 或者,在文档之外渲染并且随后挂载
var component = new MyComponent().$mount()
document.getElementById('app').appendChild(component.$el)

2、Vue.extend实现Loading插件($mount)

<div id="root">
    <button @click="showLoading">显示Loading</button>
</div>
function Loading(msg) {
        // 创建构造器
        const Loading = Vue.extend({
          template: '<div id="loading-msg">{{ msg }}</div>',
          props: {
            msg: {
              type: String,
              default: '加载中'
            }
          },
          name: 'Loading'
        })
 
        // 创建挂载div
        const div = document.createElement('div')
        div.setAttribute('id', 'loading-div')
        document.body.append(div)
 
        // 创建实例并挂载到一个元素上
        new Loading().$mount('#loading-div')
 
        // 返回一个移除元素的function
        return () => {
          document.body.removeChild(document.getElementById('loading-div'))
        }
}
 
// 挂载到vue实例上
Vue.prototype.$loading = Loading
 
 new Vue({
     el: '#root',
     methods: {
        showLoading() {
            const hide = this.$loading('正在加载,请稍等...')
            setTimeout(() => {
              hide()
            }, 1500)
        }
     }
})

3、Vue.extend实现信息弹窗插件(el)

新建一个popBox.vue

<template>
  <div id="confirm" v-if='flag'>
    <div class="contents" >
      <div class="content-top">{{ text.title }}</div>
      <div class="content-center">{{ text.msg }}</div>
      <div class="content-bottom">
        <button @click='show' class="left">{{ text.btn.ok }}</button>
        <button @click='hide' class="right">{{ text.btn.no }}</button>
      </div>
    </div>
  </div>
</template>
 
<script>
 
export default {
  data () {
    return {
      flag: true,
      text: {
          title:'标题',
          msg: '这是一个信息弹出框组件',
          btn: {
              ok: '确定',
              no: '取消'
          }
      }
    }
  },
 
  methods: {
    show (){
      this.flag = false;
    },
 
    hide() {
      this.flag = false;
    }
  }
}
 
</script>

新建一个popBox.js

import Vue from 'vue'
import PopBox from './popBox.vue'
 
// Vue.extend返回一个实例创建的构造器,但实例构造器需要进行挂载到页面中
let popBox = Vue.extend(PopBox)   
 
popBox.install = (vue, text) => {
      
        // 在body中动态创建一个div元素,之后此div将会替换成整个vue文件的内容
        // 此时的popBoxDom通俗讲就是相当于是整个组件对象,通过对象调用属性的方法来进行组件中数据的使用
        let popBoxDom = new popBox({
            el: document.createElement('div')
        })
 
        
        // 可以通过$el属性来访问创建的组件实例
        document.body.appendChild(popBoxDom.$el)
 
   
        // 将需要传入的文本内容传给组件实例
        popBoxDom.text = text;
 
        // 返回一个promise,进行异步操作,成功时返回,失败时返回
        return new Promise((res, rej) => {     
            popBoxDom.show = () => {   
                res()   //正确时返回的操作
                popBoxDom.flag = false;
            }
 
            popBoxDom.hide = ()=>{
                rej()   //失败时返回的操作
                popBoxDom.flag = false;
            }
        }
 
        vue.prototype.$popBox = popBox    
    })
}
 
// 将逻辑函数进行导出和暴露
export default popBox

页面使用

import PopBox from './popBox.js'
 
Vue.use(popBOx);
 
 
this.$popBox({
      title:'标题',
      msg:'内容',
      btn:{ ok:'确定', no:'取消'}
}).then(()=>{
      console.log('ok')
}).catch(()=>{
      console.log('no')
})

其他

import toastCom from "./Toast";
 
const toast = {};
toast.install = vue => {
 const ToastCon = vue.extend(toastCom);
 const ins = new ToastCon();
 ins.$mount(document.createElement("div"));
 document.body.appendChild(ins.$el);
 console.log(ins.toast)
 vue.prototype.$toast = ins.toast;
};
 
 
 
const globalComponent = {
 install: function(Vue) {
   Vue.use(toast);
 }
};
 
export default globalComponent;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: vue使用Vue.extend创建全局toast组件实例

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue使用Vue.extend创建全局toast组件实例
    目录Vue.extend创建全局toast组件关于vue.extend的理解应用基本概念官网基本示例应用总结Vue.extend创建全局toast组件 src -> compo...
    99+
    2023-03-06
    vue使用Vue.extend Vue.extend创建全局 Vue.extend toast组件
  • vue怎么使用Vue.extend创建全局toast组件
    本篇内容主要讲解“vue怎么使用Vue.extend创建全局toast组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue怎么使用Vue.extend创建全局toast组件”吧!Vue.ex...
    99+
    2023-07-05
  • Vue封装全局toast组件的完整实例
    目录前言 一. 借助 vue-cli 1. 定义 Toast 组件2. 在 main.js 里面配置3. 在其他组件内使用二、不借助 vue-cli 1. 注册 toast 组件2....
    99+
    2022-11-12
  • 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
  • 怎么用Vue封装全局toast组件
    本篇内容介绍了“怎么用Vue封装全局toast组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一. 借助...
    99+
    2022-10-19
  • Vue封装全局toast组件的应用
    这篇文章主要介绍“Vue封装全局toast组件的应用”,在日常操作中,相信很多人在Vue封装全局toast组件的应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue封装全局toast组件的应用”的疑惑有所...
    99+
    2023-06-20
  • vue全局提示插件开发toast怎么使用
    本篇内容介绍了“vue全局提示插件开发toast怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!插件插件通常用来为 Vue&...
    99+
    2023-07-04
  • Vue中如何使用全局组件和局部组件
    Vue中如何使用全局组件和局部组件,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。组件 (Component) 是 Vue.js...
    99+
    2022-10-19
  • vue自定义全局组件实现弹框案例
    本文实例为大家分享了vue自定义全局组件实现弹框案例的具体代码,供大家参考,具体内容如下 说明:本案例是封装的一个弹框页面,因为只想要一个遮罩,内容自定义。因为ElementUI上已...
    99+
    2022-11-13
  • Vue组件如何创建使用
    这篇文章主要介绍“Vue组件如何创建使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue组件如何创建使用”文章能帮助大家解决问题。一、组件组件是vue的重要的特征之一,可以扩展html的功能,也...
    99+
    2023-07-05
  • 如何使用vue实现一个toast弹窗组件
    本篇内容介绍了“如何使用vue实现一个toast弹窗组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,我们来分析一下弹窗组件的特性(需...
    99+
    2023-07-04
  • 如何使用use注册Vue全局组件和全局指令
    这篇文章主要介绍如何使用use注册Vue全局组件和全局指令,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Vue中的组件和指令分为局部组件、局部指令和全局组件、全局指令。对于注册有一定...
    99+
    2022-10-19
  • Vue使用extend动态创建组件的实现
    目录什么是extend方法?如何使用extend方法?动态创建组件总结Vue.js是一个流行的JavaScript框架,它提供了许多功能来帮助我们构建交互式Web应用程序。其中之一是...
    99+
    2023-05-16
    Vue extend动态创建组件 Vue extend动态组件
  • 怎么在vue组件中使用全局变量
    在vue组件中使用全局变量的方法:1.新建vue.js项目;2.使用export方法定义全局变量;3.使用Vue.prototype方法挂载全局变量;4.使用this调用全局变量;具体步骤如下:首先,在vue-cli中创建一个vue.js项...
    99+
    2022-10-16
  • vue中使用svg封装全局消息提示组件
    本文实例为大家分享了vue中使用svg封装全局消息提示组件的具体代码,供大家参考,具体内容如下 先看效果图 一、首先安装下载需要用到的svg相关依赖 npm install sv...
    99+
    2022-11-13
  • 如何使用FileReader创建Vue文件阅读器组件
    这篇文章主要介绍“如何使用FileReader创建Vue文件阅读器组件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用FileReader创建Vue文件阅读器组件”文章能帮助大家解决问题。Fi...
    99+
    2023-07-04
  • C++ 使用 new 创建二维数组实例
    目录1. 直接创建2. 借助指针数组3. 借助 std::vector1. 直接创建 C++ 使用 new 创建二维数组最直接的方法就是 new T[M][N]。返回的指针...
    99+
    2023-01-12
    c++用new创建二维数组 C++使用new语句生成二维数组 c++ new二维数组
  • Vue组件的自定义事件和全局事件总线怎么使用
    这篇“Vue组件的自定义事件和全局事件总线怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue组件的自定义事件和全局...
    99+
    2023-07-05
  • vue中怎么使用svg封装全局消息提示组件
    本文小编为大家详细介绍“vue中怎么使用svg封装全局消息提示组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue中怎么使用svg封装全局消息提示组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。先看效果图...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作