当前位置: 首页 > article >正文

使用Vue.extend( ) 模仿 elementui 创建一个类似 message 消息提示框

提示:记录工作中遇到的需求及解决办法

文章目录

  • 前言
  • 一、目录结构
  • 二、代码
      • 1. 创建 m-Toast.vue 文件
      • 2. 创建 global.js 文件
      • 3. 在 main.js 文件中导入 global.js 文件
      • 4. 在 App.vue 文件中使用 全局方法创建的 组件


前言

在此之前一直不明白Vue.extend( )干什么用的,如何使用,看了一些视频,再结合vue文档,浅浅的理解了一些,以及一些简单的应用,如有不对请指出。
我将使用脚手架生成一个vue2项目来解释。


提示:以下是本篇文章正文内容,下面案例可供参考

一、目录结构

在这里插入图片描述

二、代码

1. 创建 m-Toast.vue 文件

<template>
	<div class="message">
		<div class="text">{{ text }}</div>
	</div>
</template> 
<script>
export default {
	name: 'm-Toast',
	props: {
		text: {
			type: String,
			default: ''
		},
	},
	mounted () {
		this.timer = setTimeout(() => {
			this.$destroy()
			clearTimeout(this.timer);
		}, 2000)
	},
	destroyed () {
		clearTimeout(this.timer);
		document.body.removeChild(this.$el)
	},
	methods: {

	},
}
</script>
<style scoped>
.message {
	min-width: 380px;
	background-color: #f0f9eb;
	color: #67c23a;
	position: fixed;
	padding: 15px 15px 15px 20px;
	top: 20px;
	left: 50%;
	z-index: 2022;
	font-size: 14px;
	transform: translate(-50%, 0);
}

.text {
	overflow: hidden;
	align-items: center;
}
</style>

2. 创建 global.js 文件

import Vue from "vue";
import Toast from "./components/m-Toast.vue";

/** 创建 Toast对应的Vue子类(构造器)
 * 结合vue文档 和 视频,
 * extends 的参数可以通过导入一个写好的组件
 * 或者 是函数 ,例如: 
 * {
 *	template: '<div class="message">
 *								<div class="text">{{ text }}</div>
 *							</div>',
 *	data: function () {
 *		return {
 *			text: '测试',
 *		}
 *	}
 * }
 * 下面我选择通过导入组件的方法,因为方便使用样式,结构更明了
 */
let ToastSubclass = Vue.extend(Toast)

// 全局挂载到原型上方便调用
Vue.prototype.$toast = function (text) {
	// 创建实例
	let ToastConstructor = new ToastSubclass({
		// 就是在调用组件的时候,给组件传递属性值
		propsData: {
			text
		}
	});

	/** 挂载(渲染组件)
	 * 使用 $mount() 但不传挂载点,返回一个完整的 Vue 组件实例
	 */
	ToastConstructor.$mount()

	// 把渲染后的真实DOM插入到BODY中即可
	document.body.appendChild(ToastConstructor.$el)
}

3. 在 main.js 文件中导入 global.js 文件

import Vue from 'vue'
import App from './App.vue'
// 导入 global.js 文件
import './global.js'

Vue.config.productionTip = false

new Vue({
	render: h => h(App),
}).$mount('#app')

4. 在 App.vue 文件中使用 全局方法创建的 组件

<template>
	<div id="app">
		<button @click="config">按钮</button>
	</div>
</template>

<script>

export default {
	name: 'App',
	data () {
		return {
			count: 0
		}
	},
	mounted () {

	},
	methods: {
		config () {
			this.$toast(`测试${this.count++}`)
		}
	}
}
</script>

<style></style>


http://www.kler.cn/news/325607.html

相关文章:

  • AI大模型之旅-最强开源文生图工具Stable Diffusion WebUI 教程
  • Safari 浏览器中的 <audio> 标签的控件无效 - 解决方法
  • linux信号 | 学习信号三步走 | 全解析信号的产生方式
  • 数据结构双链表和循环链表
  • 高级主题:接口性能测试与压力测试
  • 0基础跟德姆(dom)一起学AI 数据处理和统计分析08-日期类型处理,Matplotlib介绍
  • 事务的四大特性(ACID)
  • 直接用Bash发送HTTP请求 —— 筑梦之路
  • 【代码随想录Day27】贪心算法Part01
  • C#基于SkiaSharp实现印章管理(10)
  • 【Linux的内存管理】
  • zy81_C#中在窗体中实现坐标变换
  • 基于SSM的“银发在线教育云平台”的设计与实现(源码+数据库+文档)
  • Race Karts Pack 全管线 卡丁车赛车模型素材
  • CSS 中的@media print 是干什么用的?
  • Spark_UDF处理缺失值或空值
  • node实现大文件切片上传的方法
  • R整理数据技巧
  • 解决sortablejs+el-table表格内限制回撤和拖拽回撤失败问题
  • Redis string类型hash类型
  • 在pycharm中怎样调试HTML网页程序
  • B-树(不是B减树)原理剖析(1)
  • 有些硬盘录像机接入视频汇聚平台EasyCVR后通道不显示/显示不全,该如何处理?
  • Qt 学习第十一天:QTableWidget 的使用
  • 启动hadoop集群出现there is no HDFS_NAMENODE_USER defined.Aborting operation
  • 基于HTML、CSS和JavaScript的滚动数字显示效果,类似于老式计数器或电子表上的数字滚动效果
  • JAVA并发编程高级——JDK 新增的原子操作类 LongAdder
  • 渗透测试实战—教育攻防演练信息收集
  • Bugku 渗透测试1
  • 03. 前端面试题之ts : typescript 的数据类型有哪些?