Vue 正确封装可复用组件

本次封装的组件以 toast 组件为例

以前使用移动端 ui 插件时,通过一句代码比如 ** $.toast(‘ 需要显示的内容 ’)**,从而在页面上展示这段文字,并在一定时间后消失。

现在我们也尝试自己封装 toast 组件。

准备工作:vue-cli 脚手架工程

先看一下涉及到的文件目录截图:

**
**

这次的封装主要涉及的文件是 Toast.vue   toast.js  Hello.vue,主要思路如下:

① Toast.vue 是我们要使用的 toast 组件;

② toast.js 里面用 **Vue.extend()** 扩展一个组件构造器,然后通过实例化组件构造器,就可创造出可复用的组件。

     最后在 toast.js 里面导出函数 myToast,函数 myToast 里面的逻辑在代码里面有解释;

③ Hello.vue 里调用函数,显示组件。

Toast.vue 代码:

<template>
	<div class="toast"  v-if="isShow">
		<div class="toast-div">{{ text }}</div>
	</div>
</template>

<script>
export default{
	data(){
		return {
			text:'内容',
			isShow:true,
			duration:1500
		}
	}
}
</script>

<style>
*{
	margin: 0;
	padding: 0;
}
.toast{
  	position: fixed;
  	left: 50%;
   transform: translate(-50%, 0);
   margin-top: 5rem;
   background: #000000;
   line-height: 0.7rem;
	color: #FFFFFF;
	padding: 0 0.2rem;
	border-radius: 0.2rem;
}
</style>

Toast.js 代码:

import Vue from 'vue'; 
import Toast from '@/components/Toast';     //引入组件
let ToastConstructor  = Vue.extend(Toast) // 返回一个“扩展实例构造器”
 
let myToast = ()=>{
	let toastDom = new ToastConstructor({
		el:document.createElement('div')    //将toast组件挂载到新创建的div上
	})
	document.body.appendChild( toastDom.$el )   //把toast组件的dom添加到body里
}
export default myToast;

Hello.vue 代码:

<template>
  <div class="hello">
    <button @click="showToast">按钮</button>
  </div>
</template>
 
<script>
import Vue from 'vue';
import toast from './js/toast';        //引入toast函数
Vue.prototype.$toast = toast;          //给Vue对象添加$toast方法
export default {
  name: 'hello',
  data () {
    return {
      
    }
  },
  methods:{
  	showToast(){
  		this.$toast();              //现在就可以调用了
  	}
  }
}
</script>

通过以上步骤,离真正的 toast 效果还是有区别的,我们要达到的效果是让显示的内容在一段时间后消失,那么,得从 toast.js 里面修改,得重新写 myToast 函数,给他设置两个传入参数,一个是显示的内容,一个是显示的时间。

toast.js 修改后的代码如下:

import Vue from 'vue'; 
import Toast from '@/components/Toast';     //引入组件
let ToastConstructor  = Vue.extend(Toast) // 返回一个“扩展实例构造器”
 
let myToast = (text,duration)=>{
	let toastDom = new ToastConstructor({
		el:document.createElement('div')    //将toast组件挂载到新创建的div上
	})
	document.body.appendChild( toastDom.$el )   //把toast组件的dom添加到body里
	
    toastDom.text = text;
    toastDom.duration = duration;
 
    // 在指定 duration 之后让 toast消失
    setTimeout(()=>{
        toastDom.isShow = false;  
    }, toastDom.duration);
}
export default myToast;

那么,现在我们在 Hello.vue 中调用的时候就应该是这样了:this.$toast(‘新内容’,2000);我们的组 toast 组件可以正常使用了!