解决vue自定义全局消息框组件问题


Posted in Javascript onNovember 22, 2019

1.发现问题

在进行移动端适配的时候,为了在各个型号的设备上能够更好的提现结构排版,决定采用rem布局。采用rem布局的时候html的字体font-size是有一个标准的。我这边用的是750px的设计稿,就采用1rem = 100px。 

在使用的过程中会用到一些第三方UI组件,而第三方UI组件是以px单位为标准的。

使用时发现:本来应该细长的提示语句变得很大!

解决vue自定义全局消息框组件问题

最后发现可能是因为这个icon是继承了html设定的font-size,尝试加一些样式上去还是无效。(如果rem布局上有直接更改第三方组件样式成功的小伙伴欢迎告诉我哟!)

2.解决问题

有一种方法是可以可以用 px2rem-loader 插件可以将第三方ui库的px转换成rem单位,我们在写样式的时候用px,这个插件会帮我们转换为rem单位。(因为暂时只是一个提示框遇到这样的问题,不想大费周章,所以决定暂时不用,以后再用吧嘿嘿!)

自己写小组件,在网上冲浪了一会,选了几个小demo实现可以了下,确实比较好!(采用这个方法!)

3.自定义全局消息组件

大概效果有点模仿 element-ui 中的提示样式,反正最后效果图如下:

解决vue自定义全局消息框组件问题

解决vue自定义全局消息框组件问题

解决vue自定义全局消息框组件问题

解决vue自定义全局消息框组件问题

vue-cli3中component下新建message文件夹,里面再建如下:

解决vue自定义全局消息框组件问题

Message.vue源代码如下:

<template>
 <transition name="fade"> <!--这个是动画的过渡效果-->
 <div class="message" :class="type" v-if="visible">
  <div class="content">
  <i class="icon-type iconfont" :class="'icon-'+type"></i>
  {{content}}
  <i v-if="hasClose" class="btn-close iconfont icon-close" @click="visible=false"></i>
  </div>
 </div>
 </transition>
</template>
 
<script>
export default {
 name: 'Message.vue',
 data () {
 return {
  content: '',
  time: 3000,
  visible: false,
  type: 'info', // 'info','warning','error','success'
  hasClose: false 
 }
 },
 mounted () {
 this.close()
 },
 methods: {
 close () {
  window.setTimeout(() => {
  this.visible = false
  }, this.time)
 }
 }
}
</script>
 
<style scoped lang="scss">
 /* 动画效果 淡入淡出 */
 .fade-enter-active, .fade-leave-active{
 transition: all 0.5s ease;
 }
 .fade-enter, .fade-leave-active{
 opacity: 0;
 }
 /* 不同的提示语的样式 */
 .info, .icon-info{
 background-color: #DDDDDD;/*#f0f9eb*/
 color: #909399;
 }
 .success, .icon-success{
 background-color:#f0f9eb;
 color: #67C23A;
 }
 .warning, .icon-warning{
 background-color: #fdf6ec;
 color: #e6a23c;
 }
 .error, .icon-error{
 background-color: #fef0f0;
 color: #f56c6c;
 }
 .message {
 position: fixed;
 left: 50%;
 top: 10%;
 transform: translate(-50%, -50%);
 width:300px;
 height:30px;
 line-height: 30px;
 font-size: 16px;
 padding: 10px;
 border-radius: 5px;
 .content{
  width:100%;
  height:100%;
  text-align:left;
  .icon-type{
  margin:0 10px 0 30px;
  }
  .btn-close{
  font-size:20px;
  margin:0 0 0 70px;
  color:#ccc;
  }
 }
 }
 
</style>

index.js源代码如下:

给Vue添加$my_message方法,判断参数,使用 $mount() 给组件手动挂载参数,然后将组件插入页面中

import Vue from 'vue'
import Message from './Message.vue'
 
const MessageBox = Vue.extend(Message)
 
Message.install = function (options, type) {
 if (options === undefined || options === null) {
 options = {
  content: ''
 }
 } else if (typeof options === 'string' || typeof options === 'number') {
 options = {
  content: options
 }
 if (type !== undefined && options !== null) {
  options.type = type
 }
 }
 
 let instance = new MessageBox({
 data: options
 }).$mount()
 
 document.body.appendChild(instance.$el)
 
 Vue.nextTick(() => {
 instance.visible = true
 })
}
 
export default Message

main.js中:

// 在main.js里面全局引入 自定义的全局消息框组件
import Message from './components/message'
Vue.prototype.$my_message = Message.install

解决vue自定义全局消息框组件问题

页面中调用:

this.$my_message('你这个大笨猪吼吼吼!');
this.$my_message('你这个大笨猪吼吼吼!','success');
this.$my_message({
 content:'服务器连接失败!', // 弹出的文字内容
 time:5000,     // 弹出后多久消失
 type:'success',   // 弹出的消息类型
 hasClose:true,   // 让按钮可以被使用,默认按钮是false不可以使用的
 
});

4.注意事项

本Demo中弹出的提示语句中的小图标是iconfont里面的。

总结

以上所述是小编给大家介绍的解决vue自定义全局消息框组件问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
getElementByIdx_x js自定义getElementById函数
Jan 24 Javascript
一样的table?不一样的table(可编辑状态table)
Sep 19 Javascript
javascript检测页面是否缩放的小例子
May 16 Javascript
JS增加行复制行删除行的实现代码
Nov 09 Javascript
javascript实现base64 md5 sha1 密码加密
Sep 09 Javascript
JQuery解析XML数据的几个简单实例
May 18 Javascript
简单实现jQuery进度条轮播实例代码
Jun 20 Javascript
微信小程序picker组件下拉框选择input输入框的实例
Sep 20 Javascript
webpack+react+antd脚手架优化的方法
Apr 02 Javascript
angular2 ng2-file-upload上传示例代码
Aug 23 Javascript
js实现简单的打印表格
Jan 15 Javascript
JS倒计时两种实现方式代码实例
Jul 27 Javascript
JavaScript实现省市联动效果
Nov 22 #Javascript
Vue混入mixins滚动触底的方法
Nov 22 #Javascript
超简单的微信小程序轮播图
Nov 22 #Javascript
微信小程序实现Swiper轮播图效果
Nov 22 #Javascript
Js代码中的span拼接问题解决
Nov 22 #Javascript
微信小程序商品详情页底部弹出框
Nov 22 #Javascript
小程序实现图片预览裁剪插件
Nov 22 #Javascript
You might like
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
js 创建书签小工具之理论
2011/02/25 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
jqueryMobile使用示例分享
2016/01/12 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
2016/09/19 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
使用vue如何构建一个自动建站项目
2018/02/05 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
python装饰器使用方法实例
2013/11/21 Python
深入解析神经网络从原理到实现
2019/07/26 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
Django 返回json数据的实现示例
2020/03/05 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
python实现mean-shift聚类算法
2020/06/10 Python
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
英国家庭和商业健身器材购物网站:Fitness Options
2018/07/05 全球购物
情人节活动策划方案
2014/02/27 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
交警失职检讨书
2015/01/26 职场文书
培训心得体会怎么写
2016/01/25 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
Java版 单机五子棋
2022/05/04 Java/Android