解决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 相关文章推荐
在IE下:float属性会影响offsetTop的取值
Dec 22 Javascript
JavaScript判断变量是否为undefined的两种写法区别
Dec 04 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
Jun 03 Javascript
js实现图片上传并正常显示
Dec 19 Javascript
JavaScript数据存储 Cookie篇
Jul 02 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
Mar 05 Javascript
node实现基于token的身份验证
Apr 09 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
May 15 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
May 07 Javascript
vue项目打包后怎样优雅的解决跨域
May 26 Javascript
浅谈JS for循环中使用break和continue的区别
Jul 21 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
Aug 31 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
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
php实现的常见排序算法汇总
2014/09/08 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
Angular.js跨controller实现参数传递的两种方法
2017/02/20 Javascript
JavaScript面向对象精要(下部)
2017/09/12 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
Python 的 Socket 编程
2015/03/24 Python
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
浅谈django中的认证与登录
2016/10/31 Python
python 借助numpy保存数据为csv格式的实现方法
2018/07/04 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
python3 kubernetes api的使用示例
2021/01/12 Python
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
2019年c语言经典面试题目
2016/08/17 面试题
工作中个人的自我评价
2013/12/31 职场文书
高中生职业规划范文
2014/03/09 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
见习报告的格式
2014/11/04 职场文书
初中团委工作总结
2015/08/13 职场文书
创业计划书之书店
2019/09/10 职场文书
pytorch中的 .view()函数的用法介绍
2022/03/17 Python
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技
MYSQL如何查看操作日志详解
2022/05/30 MySQL