Uniapp全局消息提示以及其组件的实现方法

目录
  • 一、前言
  • 二、实现
    • 1.短轮询请求-App.vue中
    • 2.全局消息提示组件
      • (1)定义一个GlobalMessage.vue组件
      • (2)新建GlobalMessage.js
      • (3)main.js中
    • 3.小程序中如何实现
    • 4.vue-inset-loader的使用
      • (1)安装
      • (2)vue.config.js注入loader
      • (3)pages.json配置文件中添加insetLoader
  • 三、总结

一、前言

最近有项目需求我们能够在H5及小程序中全局实时刷新消息,并且在全局做一个消息提示,提示组件也需要自定义样式,首先实时消息的刷新无非有两种,一种是短轮询,一种是长轮询。
所谓短轮询,其实就是前端使用定时器,在一定间隔时间内向后端发起请求,并且后端需要对轮询请求做优化。
长轮询则是将消息请求发送到后端后,请求挂起,等待后端有新消息返回后,再重新发起消息请求,实则是一个websocket通信,鉴于项目上线时间以及成本,最后选择短轮询方式,且全局消息提示在App.vue中进行。

二、实现

1.短轮询请求-App.vue中

   async created(){
	const _this=this
	setInterval(async ()=>{
             const res=await _this.$ajax({
                url:`/api/notice/status`
              })
             if(res.data.code===200){
		const value=res.data.data.hasNew
		_this.$store.commit({type: 'changeNew', value})
              }
         },6000)
    }

2.全局消息提示组件

消息请求后需要有一个全局的自定义组件来展示消息,但是遇到一个问题,那就是在Unipp中, 虽然App.vue是uni-app的主组件,所有页面都是在App.vue下进行切换的,是页面入口文件。但App.vue本身不是页面,这里不能编写视图元素。这个文件的作用包括:调用应用生命周期函数、配置全局样式、配置全局的存储globalData。也就是App.vue中只能进行js以及css的编写,而不能挂载视图元素,那么是否可以在js中像使用this.$message一样使用组件呢,我想到了Vue中使用vue.prototype.$message挂载全局组件的方式。

(1)定义一个GlobalMessage.vue组件

自定义一个消息提示组件,text将会是我们传入的提示消息参数

<template>
	<div class='message-container'>
		全局消息提示 {{text}}
	</div>
</template>

<script>
</script>

<style lang="scss" scoped>
	.message-container{
		position: fixed;
		top: 10%;
		z-index: 2000;
		left: 10%;
		width: 200px;
		height: 200px;
		background-color: red;
	}
</style>

(2)新建GlobalMessage.js

将自定义组件引入,vue.extend可以使用基础的Vue构造器,创建一个子类,参数是一个包含组件的对象。对象示例如下:

{
template:'',
data(){
    return {
        属性
    }
  }
}

但此时创建的并非组件实例,需要通过new 方式创建组件实例,参数包括创建的组件Dom节点,组件内部属性。然后使用document.body.appendChild将组件渲染到body中,此时我们已经可以调用此方法,将自定义组件挂载到全局。

function showMessage(text,duration){
	const MessageDom=new MessageConstructor({
		el:document.createElement('div'),
		data(){
			return {
				text:text,
			}
		}
	})
	document.body.appendChild(MessageDom.$el)
}

接下来我们需要将该方法挂载到vue原型上,从而能够像this.$message一样使用,我们在vue.prototype上挂载$message,并将此方法导出。

function registryMessage(){
	vue.prototype.$message=showMessage
}
export default registryMessage

GlobalMessage.js全部代码

import vue from "vue"
import GlobalMessage from  './GlobalMessage.vue';
const MessageConstructor= vue.extend(GlobalMessage)
function showMessage(text,duration){
	const MessageDom=new MessageConstructor({
		el:document.createElement('div'),
		data(){
			return {
				text:text,
			}
		}
	})
	document.body.appendChild(MessageDom.$el)
}
function registryMessage(){
	vue.prototype.$message=showMessage
}
export default registryMessage

(3)main.js中

将我们抛出的方法引入,使用Vue.use进行全局注册,这样就可以愉快的使用this.$message了。

import GlobalMessage from "./GlobalMessage.js";
// 这里也可以直接执行 toastRegistry()
Vue.use(GlobalMessage);

使用

this.$message('测试数据')

3.小程序中如何实现

超导马得,刚刚能够全局使用this.$message,但是又遇到一个问题,小程序中没有document,我们看uni-app官方文档:

uni-app的js API由标准ECMAScript的js API 和 uni 扩展 API 这两部分组成。
标准ECMAScript的js仅是最基础的js。浏览器基于它扩展了window、document、navigator等对象。小程序也基于标准js扩展了各种wx.xx、my.xx、swan.xx的API。node也扩展了fs等模块。
uni-app基于ECMAScript扩展了uni对象,并且API命名与小程序保持兼容。
uni-app的js代码,h5端运行于浏览器中。非h5端(包含小程序和App),Android平台运行在v8引擎中,iOS平台运行在iOS自带的jscore引擎中,都没有运行在浏览器或webview里。非H5端,不支持window、document、navigator等浏览器的js API

uni-app的js API

那么需求不能不完成,我们采用另外一套方案,使用vuex状态机来进行全局状态控制,将自定义组件放在需要的页面中,使用状态机来控制消息的提示内容以及展示与隐藏。注:请自行安装配置vuex。

main.js中全局注册组件

import GlobalMessage from '@/components/common/GlobalMessage.vue';
Vue.component('GlobalMessage',GlobalMessage)

在需要的页面放置GlobalMessage组件,但是我们需要每个页面都要加组件标签,实在是一个难以忍受的方式,于是在翻阅一些文档后,在jy文章中发现一个工具vue-inset-loader

4.vue-inset-loader的使用

我们来看该loader的提示:编译阶段在sfc模板指定位置插入自定义内容,适用于webpack构建的vue应用,常用于小程序需要全局引入组件的场景。(由于小程序没有开放根标签,没有办法在根标签下追加全局标签,所以要使用组件必须在当前页面引入组件标签),该插件刚好能够帮助我们全局追加组件标签。

vue-inset-loader

(1)安装

npm install vue-inset-loader --save-dev

(2)vue.config.js注入loader

没有vue.config.js请新建文件。

module: {
    rules: [
      {
        test: /.vue$/,
        use:{
            loader: "vue-inset-loader"
            // // 针对Hbuilder工具创建的uni-app项目
            // loader: path.resolve(__dirname,"./node_modules/vue-inset-loader")
        }
      }
    ]
},
// 支持自定义pages.json文件路径
// options: {
//     pagesPath: path.resolve(__dirname,'./src/pages.json')
// }

(3)pages.json配置文件中添加insetLoader

"insetLoader": {
    "config":{
        "message": "<GlobalMessage></GlobalMessage>",

    },
    // 全局配置
    "label":["confirm"],
    "rootEle":"div"
},
"pages": [
    {
        "path": "pages/tabbar/index/index",
        "style": {
            "navigationBarTitleText": "测试页面",
            // 单独配置,用法跟全局配置一致,优先级高于全局
            "label": ["confirm","abc"],
            "rootEle":"div"
        }
    },
]
  • 配置说明
  • config (default: {}) 定义标签名称和内容的键值对
  • label(default: []) 需要全局引入的标签,打包后会在所有页面引入此标签
  • rootEle(default: "div") 根元素的标签类型,缺省值为div,支持正则,比如匹配任意标签 ".*"

label 和 rootEle 支持在单独页面的style里配置,优先级高于全局配置

三、总结

虽然实现了全局消息的提示,但是在小程序中,该方法还是过于麻烦,需要在每个页面追加全局组件标签,希望大家有更好的方法能够不吝赐教。

到此这篇关于Uniapp全局消息提示以及其组件实现的文章就介绍到这了,更多相关Uniapp全局消息提示内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • uniapp引入支付宝原生扫码插件步骤详解

    目录 1.打开插件市场 2.阿里云操作 开通阿里云 mPaaS 创建 mPaaS 应用 配置应用 3.配置项目 打开manifest.json 1.打开插件市场 链接:ext.dcloud.net.cn/plugin?id=2… 点击红色框按钮 绑定包名,这个包名与后续有关系,请记录下 2.阿里云操作 开通阿里云 mPaaS 打开mPaaS产品 创建 mPaaS 应用 创建一个应用效果如下 配置应用 点击你创建用的应用进去里面的配置页面 绑定刚才第一步我们绑定的包名,还有上次这个包名打包后的ap

  • app场景下uniapp的扫码记录

    目录 背景 全屏扫码 uniapp自身带的api方法-uni.scanCode 支付宝插件扫码 自定义扫码 uniapp nvue自带的Barcode 操作原生的可视化控件Barcode 背景 扫码需求日益增多,为了满足客户的需求,扫码演变的多种多样,其中有二维码,条形码居中,条形码又可以细分成几种,以下记录全屏和自定义页面扫码的在uniapp的技术实现 全屏扫码 uniapp自身带的api方法-uni.scanCode uni.scanCode(OBJECT) h5平台暂不支持这种形式调起全屏

  • UniApp + SpringBoot 实现支付宝支付和退款功能

    目录 开发准备 支付宝支付开发 后端部分 前端部分 支付宝退款开发 后端部分 上篇介绍了UniApp + SpringBoot 实现微信支付和退款功能,喜欢的朋友可以点击查看. 开发准备 一台用于支付的测试机 用于编写的后端框架接口的 IDE (IDEA 或者 Eclipse 都可以) HBuilder X 用来编辑 UniApp 项目的编辑器和编译器 基本的 SpringBoot 的脚手架,可以去 https://start.spring.io/或者 IDEA 自带的快速生成脚手架插件. Jd

  • uniapp实现支付功能

    详细参考:https://gitee.com/copperpeas/uniapp-payment uniapp-payment介绍uniapp支付 微信支付流程测试接入的是uniapp官方预下单接口 APP应用首先去微信等开发平台申请开通支付,部分支付渠道需要配置支付目录,授权域名,回调函数 预下单返回参考: "data": { "appid": "wx0411fa6a39d61297", "noncestr": "

  • Uniapp全局消息提示以及其组件的实现方法

    目录 一.前言 二.实现 1.短轮询请求-App.vue中 2.全局消息提示组件 (1)定义一个GlobalMessage.vue组件 (2)新建GlobalMessage.js (3)main.js中 3.小程序中如何实现 4.vue-inset-loader的使用 (1)安装 (2)vue.config.js注入loader (3)pages.json配置文件中添加insetLoader 三.总结 一.前言 最近有项目需求我们能够在H5及小程序中全局实时刷新消息,并且在全局做一个消息提示,提

  • vue中使用svg封装全局消息提示组件

    本文实例为大家分享了vue中使用svg封装全局消息提示组件的具体代码,供大家参考,具体内容如下 先看效果图 一.首先安装下载需要用到的svg相关依赖 npm install svg-sprite-loader --save-dev 二.针对没有vue.config.js文件的vue项目,直接在webpack.base.conf.js中进行如下两个配置 1.找到图片相关配置位置,添加款选出的代码 2.在图片配置后添加如下代码 三.根据添加的代码我们去src下创建一个icons文件夹,icons下面

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

    1.发现问题 在进行移动端适配的时候,为了在各个型号的设备上能够更好的提现结构排版,决定采用rem布局.采用rem布局的时候html的字体font-size是有一个标准的.我这边用的是750px的设计稿,就采用1rem = 100px. 在使用的过程中会用到一些第三方UI组件,而第三方UI组件是以px单位为标准的. 使用时发现:本来应该细长的提示语句变得很大! 最后发现可能是因为这个icon是继承了html设定的font-size,尝试加一些样式上去还是无效.(如果rem布局上有直接更改第三方组

  • vue实现过渡动画Message消息提示组件示例详解

    目录 概述 目录结构 总结 概述 在我自己平时做项目的时候,必不可少的会用到message组件,用来对用户友好反馈,总之使用频率还是挺高的,刚开始工作的时候,经常用的就是组件库的现成的,想想也不能总是用别人现成的,最近模拟组件库调用方式自己写了一个消息提示组件,支持过渡效果,支持自己进行扩展. 目录结构 .src/component/MessageBox/MessageBox.vue代码: <template> //css实现过渡 <transition name="fade-

  • 用Vue.extend构建消息提示组件的方法实例

    前提 前段时间自己做的vue练手项目,需要一个通用的消息提示组件,但是消息提示这种组件我更想用方法来调用,而不是在各个页面上都添加个组件(那样感觉很麻烦,重度懒癌患者),于是就上网差查了查,并研究了ElementUI的message源码.自己弄出来一个简陋的消息提示组件 Vue.extend是什么 按照官方文档说法,他是一个类构造器,用来创建一个子类vue并返回构造函数,而Vue.component它的任务是将给定的构造函数与字符串ID相关联,以便Vue.js可以在模板中接收它. 了解了这点之后

  • 【消息提示组件】,兼容IE6/7&&FF2

    作者:yemoo 来源:WWW.AJAXBBS.NET 发布日期:2007-09-03 原文地址:http://www.ajaxbbs.net/blog/post/100/ 特别说明:这只是一个纯客户端使用的js组件,非服务端控件(如asp.net控件等),改组件只是为了美化消息提示. PS:希望大家多提有实际价值的建议或意见,如果合适我会继续做完善修改. ===================================================================   

  • 070823更新的一个[消息提示框]组件 兼容ie7

    提示:8.23修复了ie 7显示错误的bug,请下载过的朋友重新下载.对此表示抱歉! 更新说明: 2007-08-23 11:50 1.修复了IE7.0下按钮文字错位的BUG(下载源码已经更新,请下载过的朋友重新下载). 2.修改了部分js程序代码.(弹出框的高度只在初始化时进行计算) 2007-08-23 21:30  1.完善了组件简介,原来没有写5-7三个介绍,可能有些朋友也没有注意到.这里补上! ==============================================

  • 通过vue.extend实现消息提示弹框的方法记录

    前提回顾 在项目开发中我们经常使用的组件注册分为两种,一个是全局注册和另一个是局部注册,假设我们的业务场景是用户在浏览注册页面时,点击页面中的注册按钮后,前端根据用户的注册信息先做一次简单的验证,并根据验证弹出一个对应消息提示弹框 我们拿到这个需求后,便开始着手准备要通过局部注册消息弹框组件的方法来实现这个场景,在通过局部注册消息弹框组件的方法解决完这个需求后,自然是沾沾自喜,紧接着又迎来了一个需求,该需求是用户在点击该注册按钮时,点击几次就要出现几次这个消息弹框,你开始犯了难,并思考难道我要在

  • Vue3封装 Message消息提示实例函数详解

    目录 Vue3封装 消息提示实例函数 样式布局封装 message.vue 功能实现 message.js 注册 自定义指令 使用 : 总结 Vue3封装 消息提示实例函数 Vue2.0使用 Vue.prototype.$message = function () {} vue3.0使用app.config.globalProperties挂载原型方法app.config.globalProperties.$message = Message 也支持直接导入函数使用 import Message

  • 自己写一个uniapp全局弹窗(APP端)

    目录 效果图: 解决思路: 方法如下: 1. 首先创建一个整个屏幕的控件,作为一个父容器. 2. 绘制遮罩层 3.绘制通知框样式 4. 绘制标题和内容 5. 创建确认按钮控件 下面是项目中的完整代码: 总结 效果图: uniapp自带的提示框不符合我们的要求,需要自己写一个提示框,且全局通用. 解决思路: 使用 plus.nativeObj 来绘制窗口以及事件监听.    官方文档 方法如下: 1. 首先创建一个整个屏幕的控件,作为一个父容器. 此时还看不到任何东西 let screenHeig

随机推荐