Vue组件之Tooltip的示例代码
前言
本文主要Alert组件的大致框架,提供少量可配置选项。旨在大致提供思路
tooltip
常用于展示鼠标hover时的提示信息。
模板结构
前言
本文主要Alert组件的大致框架,提供少量可配置选项。旨在大致提供思路
tooltip
常用于展示鼠标hover时的提示信息。
模板结构
大致结构DOM结构一个div包含箭头及气泡内容。
v-bind中可选tooltip位置,是否禁用,及显示隐藏
slot差值供自定义默认接收content内容
script
importEventListenerfrom'../utils/EventListener.js'; exportdefault{ props:{ //需要监听的事件 trigger:{ type:String, default:'click' }, effect:{ type:String, default:'fadein' }, title:{ type:String }, //toolTip消息提示 content:{ type:String }, header:{ type:Boolean, default:true }, placement:{ type:String } }, data(){ return{ //通过计算所得气泡位置 position:{ top:0, left:0 }, show:true }; }, watch:{ show:function(val){ if(val){ constpopover=this.$refs.popover; consttriger=this.$refs.trigger.children[0]; //通过placement计算出位子 switch(this.placement){ case'top': this.position.left=triger.offsetLeft-popover.offsetWidth/2+triger.offsetWidth/2; this.position.top=triger.offsetTop-popover.offsetHeight; break; case'left': this.position.left=triger.offsetLeft-popover.offsetWidth; this.position.top=triger.offsetTop+triger.offsetHeight/2-popover.offsetHeight/2; break; case'right': this.position.left=triger.offsetLeft+triger.offsetWidth; this.position.top=triger.offsetTop+triger.offsetHeight/2-popover.offsetHeight/2; break; case'bottom': this.position.left=triger.offsetLeft-popover.offsetWidth/2+triger.offsetWidth/2; this.position.top=triger.offsetTop+triger.offsetHeight; break; default: console.log('Wrongplacementprop'); } popover.style.top=this.position.top+'px'; popover.style.left=this.position.left+'px'; } } }, methods:{ toggle(){ this.show=!this.show; } }, mounted(){ if(!this.$refs.popover)returnconsole.error("Couldn'tfindpopoverrefinyourcomponentthatusespopoverMixin."); //获取监听对象 consttriger=this.$refs.trigger.children[0]; //根据trigger监听特定事件 if(this.trigger==='hover'){ this._mouseenterEvent=EventListener.listen(triger,'mouseenter',()=>{ this.show=true; }); this._mouseleaveEvent=EventListener.listen(triger,'mouseleave',()=>{ this.show=false; }); }elseif(this.trigger==='focus'){ this._focusEvent=EventListener.listen(triger,'focus',()=>{ this.show=true; }); this._blurEvent=EventListener.listen(triger,'blur',()=>{ this.show=false; }); }else{ this._clickEvent=EventListener.listen(triger,'click',this.toggle); } this.show=!this.show; }, //在组件销毁前移除监听,释放内存 beforeDestroy(){ if(this._blurEvent){ this._blurEvent.remove(); this._focusEvent.remove(); } if(this._mouseenterEvent){ this._mouseenterEvent.remove(); this._mouseleaveEvent.remove(); } if(this._clickEvent)this._clickEvent.remove(); } };
//EventListener.js constEventListener={ /** *ListentoDOMeventsduringthebubblephase. * *@param{DOMEventTarget}targetDOMelementtoregisterlisteneron. *@param{string}eventTypeEventtype,e.g.'click'or'mouseover'. *@param{function}callbackCallbackfunction. *@return{object}Objectwitha`remove`method. */ listen(target,eventType,callback){ if(target.addEventListener){ target.addEventListener(eventType,callback,false); return{ remove(){ target.removeEventListener(eventType,callback,false); } }; }elseif(target.attachEvent){ target.attachEvent('on'+eventType,callback); return{ remove(){ target.detachEvent('on'+eventType,callback); } }; } } }; exportdefaultEventListener;
封装的事件监听
使用
使用content属性来决定hover时的提示信息。由placement属性决定展示效果:placement属性值为:方向-对齐位置;四个方向:top、left、right、bottom。trigger属性用于设置触发tooltip的方式,默认为hover。
鼠标移动到我上面试试 点我试试
content内容分发
设置一个名为content的slot。
鼠标移动到我上面试试 我是内容分发的conent。
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
content | 显示的内容,也可以通过 slot#content 传入DOM | String | — | — |
placement | Tooltip的出现位置 | String | top/right/bottom/left | top |
trigger | tooltip触发方式 | String | — | hover |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。