纯原生实现弹出层 @于志程

前言 : 因为在做项目时候需要用到了一些效果 所以封装成了一个插件

简单看下效果

GIF.gif

我是用原生js 创建了一个构造函数

  • 用到的都是底层的方法 也是为了练习一下
  • 这个组件的知识点有以下几点
    1. 首先需要了解Vue.use() 都做了什么?
    2. 导出对象时候 install 是做什么用的?

往下看

/**
 * @param {Object} temp 弹出层配置对象
 * @param {String} temp.icon 弹出层样式图标
 * @param {SuperString} temp.csstext 弹出层内设样式
 * @param {String} temp.text 弹出层字体文字
 * @param {String} temp.w 弹出层宽度
 * @param {String} temp.h  弹出层高度
 * @param {String} temp.class  弹出层c3动画类名
 * @return {Object} 弹出层 实例化一个弹出层对象
 * */

function Popup(temp) {
    this.w = temp.w || '1.4rem';
    this.h = temp.h || '1.4rem';
    this.c = temp.c;
    this.text = temp.text;
    this.icon = temp.icon;
    this.class = temp.class;
    this.csstext = temp.csstext;
}
Popup.prototype.style = function () {
    this.div = document.createElement('div');
    this.div2 = document.createElement('div');
    this.div2.style.cssText = 'height:100%;width:100%;position:absolute;top:0;z-index:10000;'
    this.div.id = 'showicon'
    this.iconfont = document.createElement('i');
    this.iconfont.style.cssText = `font-size:.65rem;color:${this.c}`
    this.span = document.createElement('span');
    this.span.innerText = this.text;
    this.span.style.cssText = 'font-size:.16rem'
    this.iconfont.className = `iconfont ${this.icon}`
    this.div.classList.add(this.class || 'Popping')
    this.div.style.cssText = this.csstext || `height:${this.h};width:${this.w};
    background:black;
    position:fixed;
    z-index:10000;
    top:0;
    color:${this.c};
    font-size:.14rem;
    display:flex;
    flex-direction: column;
    text-align: center;
    justify-content: space-between;
    padding-top:.2rem;
    padding-bottom:.2rem;
    border-radius:.08rem;
    top:0;
    left:0;
    right:0;
    bottom:0;
    margin: auto auto;
    opction:0.6;
    transfrom:all;
    `;
}
Popup.prototype.handle = function () {
    this.div.appendChild(this.iconfont)
    this.div.appendChild(this.span)
    this.div2.appendChild(this.div)
    if (document.getElementById('showicon') === null) {
        document.body.appendChild(this.div2)
        setTimeout(() => {
            document.body.removeChild(this.div2)
        }, 3000);
    } else {
        return
    }
}
export default Popup
我只是定义了一个方法 然后导出
import popup from './VDfunc/popup'

const poputexample = function (opction) {
    const obj = new popup(opction)
    obj.style()
    obj.handle()
    return obj
}





export default {
    popup: poputexample,
    install(Vue) {
        Vue.prototype.$Popup = poputexample;
    }
};
写的略有简陋
  • 用的是纯原生的方法创建一个div
  • 然后为这个div加上属性方法
  • 然后内容什么的也插入到这个div 当中
  • 最后把这个div插入到dom根节点当中
  • 首先我给这个div加了一个id `
  • 当节点中有这个div的时候 让他不触发这个方法
  • 没有的时候 再 插入到dom当中
  • 最后 把这个方法导出
  • 现在main.js 当中 引入这个文件
  • 然后再在Vue实例当中 把这个方法挂在到实例上
  • 这样的话你就可以直接在任何子组件当中调用
  • 调用方法就是 this.$Popup
  • 当然 this后面的这个方法名是可以自己定义的 相当于就是一个变量
然后 样式的话 我是写了一个公用的 c3动画样式文件
.Popping{
   animation: popping 3s forwards; 
}

@keyframes popping{
    0%{
     opacity: 0;
    }
    33%{
     opacity: 1;
    }
    66%{
     opacity: 1;
    }
    100%{
     opacity: 0;
    }
}
  • 这只是其中一个方法
  • 因为移动端的话对于有些属性支持不是特别的好
  • (比如轮播图时候用定位移动的方法的话 回有卡顿之类的)
  • 所以相对效果来说 c3动画是不错的选择 兼容性也不错
  • 所以我定义了一个公共文件来存放方法
  • 这样以后需要用到的话 直接写在公共文件里面
  • 调用的话 直接加上class名称就可以了

最后来看这个

  • 因为不在全局引入的话 你每次使用的话 需要在当前组件引入
  • 然后 还需要new一个对象出来 所以相对来说 不那么方便
  • 也是为了减少代码的堆积
  • 所以推荐在全局引入
import Vue from 'vue'
import popup from './services/VDfunc/popup'
Vue.use(popup)

这样就可以直接来使用了

接下来咱们来看使用方法

   this.$Popup({
        c: "rgba(245,245,245)",
        icon: "icon-wz",
        text: "添加成功"
      });
  • 使用方法为this.方法名 然后 ({})的形式调用
  • 因为有默认参数 你可以不写参数 直接实例
  • 也可以传进去你想要的效果
  • 想要的参数
  • 想到的内容 等等···
  • 传参达到了不同的效果内容

-----

我的调用参数写在这里

/**
 * @param {Object} temp 弹出层配置对象
 * @param {String} temp.icon 弹出层样式图标
 * @param {SuperString} temp.csstext 弹出层内设样式
 * @param {String} temp.text 弹出层字体文字
 * @param {String} temp.w 弹出层宽度
 * @param {String} temp.h  弹出层高度
 * @param {String} temp.class  弹出层c3动画类名
 * @return {Object} 弹出层 实例化一个弹出层对象
 * */

接下来讲一下 需要记住 掌握的知识点

问题

相信很多人在用Vue使用别人的组件时, 会用到Vue.use() 。 例如:Vue.use(VueRouter)Vue.use(element) 但是用axios 时 , 就不需要用到Vue.use(axios) , 就能直接使用 。 那这是为什么呢

答案

因为axios 没有install 。 什么意思呢?看一下我上面的代码 你就会发现 我的代码上 导出的时候 写了一个install。 就是因为有了这个 所以我们引入的时候 就需要用到Vue.use()

export default {
    popup: Popup,
    install(Vue) {
        Vue.prototype.$Popup = Popup;
    }
};

也就是上面这个 因为 用到了 install 所以 如果你不用Vue.use() 的话 她不能使用 也就是说 他会报错

Vue.js的插件应该暴露一个 install 方法。这个方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象:

也就是说 这个方法的作用就是可以用来添加一些功能入:

  • 添加全局方法
  • 添加全局属性
  • 添加全局资源
  • 注入组件选项
  • 添加实例方法

看累了吗!!去看看@一片精华面试题前端常见面试题(十)@郝晨光

结言

感谢您的查阅,本文由@程程程整理并总结,代码冗余或者有错误的地方望不吝赐教;菜鸟一枚,请多关照

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • ## 框架和库的区别?> 框架(framework):一套完整的软件设计架构和**解决方案**。> > 库(lib...
    Rui_bdad阅读 2,907评论 1 4
  • vue-cli搭建项目 确保安装了node与npm 再目标文件夹下打开终端 执行cnpm i vue-cli -g...
    Akiko_秋子阅读 3,240评论 1 22
  • 基本用法 一、vuejs简介 是一个构建用户界面的框架 是一个轻量级的MVVM(Model-View-ViewMo...
    深度剖析JavaScript阅读 18,250评论 0 8
  • _________________________________________________________...
    fastwe阅读 1,372评论 0 0
  • 33、JS中的本地存储 把一些信息存储在当前浏览器指定域下的某一个地方(存储到物理硬盘中)1、不能跨浏览器传输:在...
    萌妹撒阅读 2,083评论 0 2