Vue.extend()实现this.$toast()

参考 https://juejin.im/post/5ca20e426fb9a05e42555d1d,这位大神写的是移动端常用的toast组件。

为啥用?
一般写组件,写完第一步的组件代码,直接在需要使用组件的地方import。
但是有些组件需要在各个地方都有使用,这时候频繁在各个页面引入就不大合适了。

怎么用?实操如下:

一、先写组件

  <!-- toast.vue -->
<template>
  <div>
    <p>我是你的{{name}}组件呀</p>
  </div>
</template>

<script>
export default {
  name: "toast",
  data(){
    return{
      name:'默认'
    }
  },
  mounted() {
    setTimeout(() => {
        // 移除组件的方法
        this.$destroy(true);//销毁组件
        this.$el.parentNode.removeChild(this.$el);//在父元素中移除dom元素
      }, 3000);
  },
}
</script>

<style lang="scss" scoped>
</style>

跟平时写组件代码一样

二、同目录下写个js

// toast.js
import Vue from "vue"; // 引入 Vue 是因为要用到 Vue.extend() 这个方法
import toast from "./toast.vue"; // 引入组件

let toastConstructor = Vue.extend(toast);  //创建构造器
let instance;
const Toast = function (options = {}) {
    instance = new toastConstructor ({
       data: options
    }).$mount(); // 创建实例
    document.body.appendChild(instance.$el); // 将元素挂载到 body 下
};
export default Toast;

暴露一个函数Toast

三、main.js引入

import Toast from './components/toast/Toast.js'
Vue.prototype.$toast= Toast;

在main.js引入,并在原型上定义(这个用法很普遍,一些 依赖于Vue/有使用install 的组件代码可以用vue.use()使用,但是其他的js,需要用到Vue.prototype,将其加入vue原型,能够在项目中使用this.$name调用)

四、使用

this.$toast({
  name:'诶嘿搞定'
})

使用过程中发现,toast组件中,无法使用vuex的数据,但是可以传入vuex中的数据。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • vue-cli搭建项目 确保安装了node与npm 再目标文件夹下打开终端 执行cnpm i vue-cli -g...
    Akiko_秋子阅读 3,281评论 1 22
  • 一、 组件component 1. 什么是组件? 组件(Component)是 Vue.js 最强大的功能之一。组...
    饥人谷_Leonardo阅读 2,029评论 0 18
  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,187评论 0 1
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    王喂马_阅读 6,488评论 1 77
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    你猜_3214阅读 11,201评论 0 118