Vue组件教程之Toast(Vue.extend 方式)详解


Posted in Javascript onJanuary 27, 2019

一、效果图

Vue组件教程之Toast(Vue.extend 方式)详解

二、说明

这类提示框组件我们通常都会直接在 JS 代码中进行调用。像下面这样:

this.$toast('别点啦,到头啦!')

但看到网上大多数还是通过 component 方式实现的,这样的话我们在使用的时候还要在 DOM 中放置一个组件元素,然后通过一个变量来控制它的显示隐藏,这样使用起来非常的不方便。那么有什么方法可以不用在 DOM 中手动放置组件元素就可以直接调用呢?答案就是 Vue.extend。通过 Vue.extend 方式实现的组件,需要两个文件,一个是 .vue 文件,另外一个就是管理 .vue 的 .js 文件。具体代码如下:

三、代码

Toast.vue 文件代码

<template>
 <div class="toast" v-show="visible">
 {{ message }}
 </div>
</template>

<script>
export default {
 name: 'toast',
 data () {
 return {
  message: '', // 消息文字
  duration: 3000, // 显示时长,毫秒
  closed: false, // 用来判断消息框是否关闭
  timer: null, // 计时器
  visible: false // 是否显示
 }
 },
 mounted () {
 this.startTimer()
 },
 watch: {
 closed (newVal) {
  if (newVal) {
  this.visible = false
  this.destroyElement()
  }
 }
 },
 methods: {
 destroyElement () {
  this.$destroy()
  this.$el.parentNode.removeChild(this.$el)
 },
 startTimer () {
  this.timer = setTimeout(() => {
  if (!this.closed) {
   this.closed = true
   clearTimeout(this.timer)
  }
  }, this.duration)
 }
 }
}
</script>

<style lang="scss" scoped>
.toast {
 position: fixed;
 bottom: 15vh;
 left: 28vw;
 min-width: 40vw;
 max-width: 100vw;
 font-size: 26px;
 text-align: center;
 padding: 10px 2vw;
 border-radius: 40px;
 background-color: rgba(0, 0, 0 , 0.6);
 color: rgb(223, 219, 219);
 letter-spacing: 3px;
}
</style>

Toast.js 文件代码

import Vue from 'vue'
import Toast from '@/components/layer/Toast.vue'

let ToastConstructor = Vue.extend(Toast) // 构造函数
let instance // 实例对象
let seed = 1 // 计数

const ToastDialog = (options = {}) => {
 if (typeof options === 'string') {
 options = {
  message: options
 }
 }
 let id = `toast_${seed++}`
 instance = new ToastConstructor({
 data: options
 })
 instance.id = id
 instance.vm = instance.$mount()
 document.body.appendChild(instance.vm.$el)
 instance.vm.visible = true
 instance.dom = instance.vm.$el
 instance.dom.style.zIndex = 999 + seed
 return instance.vm
}

export default ToastDialog

四、使用

首先在 main.js 中引入 Toast.js 并挂载到vue原型上,如下图:

Vue组件教程之Toast(Vue.extend 方式)详解

其次,在代码中使用

this.$toast('别点啦,到头啦!')

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
window.onload和$(function(){})的区别介绍
Oct 30 Javascript
js获取select标签的值且兼容IE与firefox
Dec 30 Javascript
javascript模拟post提交隐藏地址栏的参数
Sep 03 Javascript
JSONP之我见
Mar 24 Javascript
JavaScript中判断两个字符串是否相等的方法
Jul 07 Javascript
详解JavaScript UTC时间转换方法
Jan 07 Javascript
JavaScript事件详细讲解
Jun 27 Javascript
基于Vuejs和Element的注册插件的编写方法
Jul 03 Javascript
动态加载权限管理模块中的Vue组件
Jan 16 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
Jan 22 Javascript
vue使用vuex实现首页导航切换不同路由的方法
May 08 Javascript
原生js实现html手机端城市列表索引选择城市
Jun 24 Javascript
JavaScript变量提升和严格模式实例分析
Jan 27 #Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
Jan 27 #Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
Jan 27 #Javascript
原生JS检测CSS3动画是否结束的方法详解
Jan 27 #Javascript
原生JS实现的跳一跳小游戏完整实例
Jan 27 #Javascript
nuxt中使用路由守卫的方法步骤
Jan 27 #Javascript
vue-cli构建vue项目的步骤详解
Jan 27 #Javascript
You might like
php学习笔记之面向对象编程
2012/12/29 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
2016/10/25 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
jquery实现excel导出的方法
2013/04/04 Javascript
javascript验证只能输入数字和一个小数点示例
2013/10/21 Javascript
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
Ionic2开发环境搭建教程
2020/08/20 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
使用webpack3.0配置webpack-dev-server教程
2018/05/29 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
Vue 第三方字体图标引入 Font Awesome的方法
2018/09/28 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
2018/12/23 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
Python实现的十进制小数与二进制小数相互转换功能
2017/10/12 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
北美Newegg打造的全球尖货海购平台:tt海购
2018/09/28 全球购物
亚布力滑雪场导游词
2015/02/09 职场文书
银行先进个人总结
2015/02/15 职场文书
安全生产先进个人总结
2015/02/15 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android
Win10此设备不支持接收Miracast无法投影的解决方法
2022/07/07 数码科技