
uni-app 页面顶部栏固定悬浮的 css 兼容方法
uni-app 中 NavigationBar(导航栏 44px)以及 TabBar(底部选项卡 50px)组件的高度是固定的,不可修改,各小程序平台,包括同小程序平台的 iOS 和 Android 的高度也不一样。
那么如果我们需要悬浮导航菜单则需要使用 position: sticky 来使其悬浮,然后对于 H5 平台加上 top:44px 的高度,这样 uni-app 页面顶部导航栏的固定悬浮就实现了兼容,具体的代码如下:
.menu {
position: sticky;
/* #ifdef H5 */
top: 44px;
/* #endif */
/* #ifndef H5 */
top: 0;
/* #endif */
z-index: 999;
flex: 1;
flex-direction: column;
overflow: hidden;
background-color: #ffffff;
}
以上代码纯属子凡开发中简单的需要稍微注意的地方,仅供大家学习参考。
其中 position: fixed 虽然也可以悬浮固定,但是底部的元素就无法继承 top 的值了,可以简单说 fixed 是特殊版的 absolute,fixed 元素总是相对于 body 定位的。所以就需要使用 position: static,static(没有定位)是 position 的默认值,元素处于正常的文档流中,会忽略 left、top、right、bottom 和 z-index 属性。
除非注明,否则均为泪雪博客原创文章,禁止任何形式转载
本文链接:https://zhangzifan.com/uni-app-navigationbar-position-static.html
uni-app 中 NavigationBar(导航栏 44px)以及 TabBar(底部选项卡 50px)组件的高度是固定的,不可修改,各小程序平台,包括同小程序平台的 iOS 和 Android 的高度也不一样。
那么如果我们需要悬浮导航菜单则需要使用 position: sticky 来使其悬浮,然后对于 H5 平台加上 top:44px 的高度,这样 uni-app 页面顶部导航栏的固定悬浮就实现了兼容,具体的代码如下:
.menu {
position: sticky;
/* #ifdef H5 */
top: 44px;
/* #endif */
/* #ifndef H5 */
top: 0;
/* #endif */
z-index: 999;
flex: 1;
flex-direction: column;
overflow: hidden;
background-color: #ffffff;
}
以上代码纯属子凡开发中简单的需要稍微注意的地方,仅供大家学习参考。
其中 position: fixed 虽然也可以悬浮固定,但是底部的元素就无法继承 top 的值了,可以简单说 fixed 是特殊版的 absolute,fixed 元素总是相对于 body 定位的。所以就需要使用 position: static,static(没有定位)是 position 的默认值,元素处于正常的文档流中,会忽略 left、top、right、bottom 和 z-index 属性。
除非注明,否则均为泪雪博客原创文章,禁止任何形式转载
本文链接:https://zhangzifan.com/uni-app-navigationbar-position-static.html
收起阅读 »
hbuilderx 3.0.5 bug
基座运行
报Uncaught java.lang.NullPointerException: Attempt to get length of null array;at android.bluetooth.BluetoothOutputStream.write
bug定位是在
var outputStream = bluetoothSocket.getOutputStream();
var bytes = plus.android.invoke(str, 'getBytes', 'gbk');
outputStream.write(bytes); // 这里
写入的时候报错
实测发现:
2.9.8 版本没有问题 3.0.4 和 3.0.5均有问题
基座运行
报Uncaught java.lang.NullPointerException: Attempt to get length of null array;at android.bluetooth.BluetoothOutputStream.write
bug定位是在
var outputStream = bluetoothSocket.getOutputStream();
var bytes = plus.android.invoke(str, 'getBytes', 'gbk');
outputStream.write(bytes); // 这里
写入的时候报错
实测发现:
2.9.8 版本没有问题 3.0.4 和 3.0.5均有问题

修改后浏览器不自动刷新的问题经验分享
开发h5项目时,修改保存后浏览器不自动刷新的问题困扰我很久了,今天版本更新,正常了,突然想到以前每次更新后都会去做下面修改:
因为每次更新后开发调试时一直发http://localhost:8080/sockjs-node/info?t=xxx 请求,于是照网上操作:
打开node_modules/sockjs-client/dist/sockjs.js,在代码的1605行注释
// self.xhr.send(payload);
经测试,就是上面的操作导致的,修改后浏览器不自动刷新的原因终于找到了。那如何解决一直发http://localhost:8080的问题呢,查了好久,原来是端口被占用的原因,在manifest.josn中修改:
"devServer" : {
"https" : false,
"port" : 81,//这里的端口改成浏览器测试地址对应的端口就好啦
希望对有相同情况的同学有帮助。
开发h5项目时,修改保存后浏览器不自动刷新的问题困扰我很久了,今天版本更新,正常了,突然想到以前每次更新后都会去做下面修改:
因为每次更新后开发调试时一直发http://localhost:8080/sockjs-node/info?t=xxx 请求,于是照网上操作:
打开node_modules/sockjs-client/dist/sockjs.js,在代码的1605行注释
// self.xhr.send(payload);
经测试,就是上面的操作导致的,修改后浏览器不自动刷新的原因终于找到了。那如何解决一直发http://localhost:8080的问题呢,查了好久,原来是端口被占用的原因,在manifest.josn中修改:
"devServer" : {
"https" : false,
"port" : 81,//这里的端口改成浏览器测试地址对应的端口就好啦
希望对有相同情况的同学有帮助。
收起阅读 »
发布插件的坑(已解决)
发布插件的坑
项目完成了,最近试着把公司一个下插件发布到插件市场玩一下,发布的过程提示都很到位,很多时候是文件放的位置不对,还有文件名起得不合要求,都一一提示了,非常友好。
但是发布后发现有些地方需要修改,要在更新一版,这时候就来劲了,明明我的文件结构和文件名都跟之前一模一样的,但就是提示我找不到这个插件的目录。
](https://imgchr.com/i/se08u8)
看到这些提示我前前后后修改了不下十次,研究到底是我哪里名字写错了,还是网站的bug。。
坑的原因
郁闷了半天,问题依然没有解决,我突然灵机一动,试着从插件市场下载我的第一版插件下来,再上传上去,看看它能不能识别到。。
MD!竟然检查通过了,说明还是我的文件有问题啊!
顺着文件名和文件结构我继续再找了半天,发现还是找不出问题所在。我又灵机一动对比下我的压缩包和插件市场下载下来的压缩包
](https://imgchr.com/i/se0GDS)
](https://imgchr.com/i/se0JHg)
大小竟然相差一倍!
解决办法
不要使用mac自带的压缩,使用第三方压缩软件!
例如 解压专家Oka或者MyZip
发布插件的坑
项目完成了,最近试着把公司一个下插件发布到插件市场玩一下,发布的过程提示都很到位,很多时候是文件放的位置不对,还有文件名起得不合要求,都一一提示了,非常友好。
但是发布后发现有些地方需要修改,要在更新一版,这时候就来劲了,明明我的文件结构和文件名都跟之前一模一样的,但就是提示我找不到这个插件的目录。
](https://imgchr.com/i/se08u8)
看到这些提示我前前后后修改了不下十次,研究到底是我哪里名字写错了,还是网站的bug。。
坑的原因
郁闷了半天,问题依然没有解决,我突然灵机一动,试着从插件市场下载我的第一版插件下来,再上传上去,看看它能不能识别到。。
MD!竟然检查通过了,说明还是我的文件有问题啊!
顺着文件名和文件结构我继续再找了半天,发现还是找不出问题所在。我又灵机一动对比下我的压缩包和插件市场下载下来的压缩包
](https://imgchr.com/i/se0GDS)
](https://imgchr.com/i/se0JHg)
大小竟然相差一倍!
解决办法
不要使用mac自带的压缩,使用第三方压缩软件!
例如 解压专家Oka或者MyZip

H5本地图片不显示、加载不出来的解决方案。
今天发布H5时发现不管在内置浏览器还是外部浏览器,本地图片都不能加载出来,路径是完全正确的,不管改为绝对路径还是相对路径都无法加载,后来打开manifest.json,点击源码视图找到H5配置,router下把"base" : "./",这句注释掉就能显示了,该行功能大概是发布H5时设为相对路径,能够在File协议里打开吧,但是路由会强制变为hash。
今天发布H5时发现不管在内置浏览器还是外部浏览器,本地图片都不能加载出来,路径是完全正确的,不管改为绝对路径还是相对路径都无法加载,后来打开manifest.json,点击源码视图找到H5配置,router下把"base" : "./",这句注释掉就能显示了,该行功能大概是发布H5时设为相对路径,能够在File协议里打开吧,但是路由会强制变为hash。
收起阅读 »
onNavigationBarButtonTap监听不生效问题
首先,我先描述一下我的问题,我是安卓手机不生效,但是苹果没有任何问题
然后我在论坛上看了下相关帖子,原因总结有以下几个:
1、单位不能用upx;(但是我用的是px)
2、按钮要是放在pages.json下边的第一个文件那里,会不执行;(完蛋了呢,但是我必须要放在首页啊)
3、如果动态改变titleNView的值,会不执行 (我确实动态改变了text 的值)
然后我的解决办法是根据第3个原因解决的
pages.json代码
"app-plus":{
"titleNView":{
"buttons":[
{
"text":"\ue60c",
"fontSrc":"/static/iconfont.ttf",
"fontSize":"20px",
"redDot": false,
"color":"#FFFFFF"
}
]
}
}
原先写法:
var webView = this.$mp.page.$getAppWebview();
var tn = webView.getStyle().titleNView;
if(this.selectedItem.index!=0){
tn.buttons[0].text= "修改前";
tn.buttons[0].redDot = false;
}else{
tn.buttons[0].text= "修改后";
if(count>0){
tn.buttons[0].redDot = true;
}else{
tn.buttons[0].redDot = false;
}
}
webView.setStyle({
titleNView: tn
});
这样还是不能跳转,然后我换了一种写法,就可以了
var webView = this.$mp.page.$getAppWebview();
if(this.selectedItem.index!=0){
webView.setTitleNViewButtonStyle(0,{text:'修改前',redDot:false});
}else{
if(count>0){
webView.setTitleNViewButtonStyle(0,{text:'修改后',redDot:true});
}else{
webView.setTitleNViewButtonStyle(0,{text:'修改后F',redDot:false});
}
}
如果你们要实现按钮的显示隐藏,可以跟我一样用小技巧,隐藏的时候,把按钮的颜色设置成标题栏的背景颜色。。
首先,我先描述一下我的问题,我是安卓手机不生效,但是苹果没有任何问题
然后我在论坛上看了下相关帖子,原因总结有以下几个:
1、单位不能用upx;(但是我用的是px)
2、按钮要是放在pages.json下边的第一个文件那里,会不执行;(完蛋了呢,但是我必须要放在首页啊)
3、如果动态改变titleNView的值,会不执行 (我确实动态改变了text 的值)
然后我的解决办法是根据第3个原因解决的
pages.json代码
"app-plus":{
"titleNView":{
"buttons":[
{
"text":"\ue60c",
"fontSrc":"/static/iconfont.ttf",
"fontSize":"20px",
"redDot": false,
"color":"#FFFFFF"
}
]
}
}
原先写法:
var webView = this.$mp.page.$getAppWebview();
var tn = webView.getStyle().titleNView;
if(this.selectedItem.index!=0){
tn.buttons[0].text= "修改前";
tn.buttons[0].redDot = false;
}else{
tn.buttons[0].text= "修改后";
if(count>0){
tn.buttons[0].redDot = true;
}else{
tn.buttons[0].redDot = false;
}
}
webView.setStyle({
titleNView: tn
});
这样还是不能跳转,然后我换了一种写法,就可以了
var webView = this.$mp.page.$getAppWebview();
if(this.selectedItem.index!=0){
webView.setTitleNViewButtonStyle(0,{text:'修改前',redDot:false});
}else{
if(count>0){
webView.setTitleNViewButtonStyle(0,{text:'修改后',redDot:true});
}else{
webView.setTitleNViewButtonStyle(0,{text:'修改后F',redDot:false});
}
}
如果你们要实现按钮的显示隐藏,可以跟我一样用小技巧,隐藏的时候,把按钮的颜色设置成标题栏的背景颜色。。

基于Native.js实现的安卓本地通知,已支持安卓8.0及以上版本
参考了很多大佬们的写法并进行了优化,最终实现安卓本地通知,已在安卓7.0以及10.0版本真机测试。
在需要生成通知的地方调用方法即可,在uni-app的App.vue的onShow中监听通知点击动作即可。
需要修改的话建议看一下安卓文档,链接https://developer.android.google.cn/reference/kotlin/android/app/Notification.Builder#addAction(android.app.Notification.Action)
附上项目地址,可以拿过来直接测试
https://github.com/BobCp/uniappTools#mynjsjs
方法直接封装在一个js文件中,取名xxx.js
let myNJS = {
'aOSNotify':aOSNotify,
'aOSReceive':aOSReceive,
}
// 获取版本信息
const osVersion={
versionNum:()=>{
let SystemVersion = plus.os.version;
let VersionNumber = Number(SystemVersion.split('.')[0]);
return VersionNumber;
}
}
/**
* android原生通知发送
* @param title 通知标题
* @param content 通知内容
* @param data json对象,存储通知的隐藏数据,用于点击通知时接收使用
* @param channelID 字符串,安卓8.0才需要的通知渠道id,类型为字符串
* @param channelName 字符串,安卓8.0才需要的通知渠道名称,类型为字符串
*/
function aOSNotify(title = '', content = '', data = {}, channelID = '1', channelName = '自定义的通知') {
// #ifdef APP-PLUS
// var title = '通知标题';
console.log('准备通知');
console.log(plus.os.name);
// Android平台下才使用此推送
if (plus.os.name != 'Android') {
return false;
}
//随机生成通知ID
var notifyID = Math.floor(Math.random() * 10000) + 1;
//先给channel一个默认值
//传递参数
if (osVersion.versionNum() >= 8){
var payload = {
'title':title,
'msg':content,
'channel_id':channelID,
'notify_id':notifyID,
'data':data
};
} else {
var payload = {
'title':title,
'msg':content,
'notify_id':notifyID,
'data':data
};
}
// 获取应用主Activity实例对象
var main = plus.android.runtimeMainActivity();
// importClass: 导入Java类对象
// 导入上下文(官方翻译)
var Context = plus.android.importClass("android.content.Context");
// 导入通知管理相关
var NotificationManager = plus.android.importClass("android.app.NotificationManager");
var Notification = plus.android.importClass("android.app.Notification");
//
var Intent = plus.android.importClass("android.content.Intent");
var PendingIntent = plus.android.importClass("android.app.PendingIntent");
var nm = main.getSystemService(Context.NOTIFICATION_SERVICE);
var intent = new Intent(main, main.getClass());
intent.putExtra("receive", JSON.stringify(payload));
// PendingIntent.getActivity的第二个参数需要设置为随机数,否则多个通知时会导致前面的通知被后面的通知替换Extra的数据,此处我将其和对应通知的id绑定起来
var pendingIntent = PendingIntent.getActivity(main, notifyID, intent, PendingIntent.FLAG_CANCEL_CURRENT);
//可能用到R的一些资源文件
var r = plus.android.importClass("android.R");
var mNotification;
//判断当前系统版本在8.0及以上
if (osVersion.versionNum() >= 8){
if (nm.getNotificationChannel() == null){
var NotificationChannel = plus.android.importClass('android.app.NotificationChannel');
var channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
nm.createNotificationChannel(channel);
}
mNotification = new Notification.Builder(main, channelID);
mNotification.setDefaults(Notification.DEFAULT_ALL); // mNotification.setDefaults(~0);
} else {
mNotification = new Notification.Builder(main);
mNotification.setDefaults(Notification.DEFAULT_ALL);
}
var i= notifyID.toString();
mNotification.setVisibility(Notification.VISIBILITY_PUBLIC) //设置可见性
//mNotification.setOngoing(true) //设置这是否为“正在进行中”通知
mNotification.setContentTitle(title + i) //设置标题
mNotification.setContentText(content); //设置内容
mNotification.setAutoCancel(true); //设置点击消失
mNotification.setShowWhen(true); //显示通知时间,貌似不加这句也能显示
mNotification.setSmallIcon(r.drawable.stat_notify_chat);
//mNotification.setSmallIcon(17301543); //设置app通知小图标,暂只能使用R.drawable文件中的默认值
mNotification.setTicker(title); //设置发送到无障碍服务的“ ticker”文本。
// mNotification.setDefaults(~0); //这两行结合上面的setTicker实现悬浮提示过几秒自动消失,基于覆盖考虑,把这个放到最上方
mNotification.setPriority(Notification.PRIORITY_HIGH); //通知优先级
//mNotification.setFullScreenIntent(pendingIntent, false); //弹出式提示不消失
mNotification.setContentIntent(pendingIntent);
var mNb = mNotification.build();
console.log(notifyID);
//判断当前系统版本在8.0及以上
if (osVersion.versionNum() >= 8){
nm.notify(channelID, notifyID, mNb);
} else {
nm.notify(notifyID, mNb);
}
//void plus.device.beep(2);//bee bee叫
// plus.device.vibrate(300);//震动
console.log('通知结束');
return true;
// #endif
}
/**
* android原生通知点击后所执行的内容
*/
function aOSReceive() {
// #ifdef APP-PLUS
if (plus.os.name != 'Android') {
return false;
}
// android原生通知栏接收器(程序退出后无效)
var main = plus.android.runtimeMainActivity();
var intent = main.getIntent();
var message = intent && intent.getExtra != undefined ? intent.getExtra("receive") : null;
console.log(message);
//console.log(typeof(message))
message = message ? JSON.parse(message) : '';
// var args = plus.runtime.arguments;
// console.log(args)
if (message) {
//删除当前通知
var Context = plus.android.importClass("android.content.Context");
var nm = main.getSystemService(Context.NOTIFICATION_SERVICE);
console.log(message.notify_id);
if (osVersion.versionNum() >= 8){
nm.cancel(message.channel_id, message.notify_id);//安卓版本大于等于8的
} else {
nm.cancel(message.notify_id);//安卓版本小于8的
}
// nm.cancelAll();
// 把消息数据置空,以免再次打开APP时重复执行此处
intent.putExtra("receive", '');
//用message的数据做点什么
uni.showToast({
title: message.notify_id.toString(),
position:'bottom'
})
}
// #endif
}
export default myNJS
建议在main.js中进行全局注册,按需调整
import myNJS from 'my_utils/myNJS.js'
Vue.prototype.$myNJS = myNJS
在需要生成通知的逻辑中进行通知生成,这里是测试数据
this.$myNJS.aOSNotify('通知来了', '这是一条自定义的提醒', {
params1: 'params1',
params2: 'params2',
params3: 'params3',
params4: 'params4'
});
在项目中App.vue的onShow中监听通知点击
onShow: function() {
console.log('App Show');
// #ifdef APP-PLUS
// 通知点击动作触发意图
// aOSReceive()
this.$myNJS.aOSReceive();
// #endif
},
参考了很多大佬们的写法并进行了优化,最终实现安卓本地通知,已在安卓7.0以及10.0版本真机测试。
在需要生成通知的地方调用方法即可,在uni-app的App.vue的onShow中监听通知点击动作即可。
需要修改的话建议看一下安卓文档,链接https://developer.android.google.cn/reference/kotlin/android/app/Notification.Builder#addAction(android.app.Notification.Action)
附上项目地址,可以拿过来直接测试
https://github.com/BobCp/uniappTools#mynjsjs
方法直接封装在一个js文件中,取名xxx.js
let myNJS = {
'aOSNotify':aOSNotify,
'aOSReceive':aOSReceive,
}
// 获取版本信息
const osVersion={
versionNum:()=>{
let SystemVersion = plus.os.version;
let VersionNumber = Number(SystemVersion.split('.')[0]);
return VersionNumber;
}
}
/**
* android原生通知发送
* @param title 通知标题
* @param content 通知内容
* @param data json对象,存储通知的隐藏数据,用于点击通知时接收使用
* @param channelID 字符串,安卓8.0才需要的通知渠道id,类型为字符串
* @param channelName 字符串,安卓8.0才需要的通知渠道名称,类型为字符串
*/
function aOSNotify(title = '', content = '', data = {}, channelID = '1', channelName = '自定义的通知') {
// #ifdef APP-PLUS
// var title = '通知标题';
console.log('准备通知');
console.log(plus.os.name);
// Android平台下才使用此推送
if (plus.os.name != 'Android') {
return false;
}
//随机生成通知ID
var notifyID = Math.floor(Math.random() * 10000) + 1;
//先给channel一个默认值
//传递参数
if (osVersion.versionNum() >= 8){
var payload = {
'title':title,
'msg':content,
'channel_id':channelID,
'notify_id':notifyID,
'data':data
};
} else {
var payload = {
'title':title,
'msg':content,
'notify_id':notifyID,
'data':data
};
}
// 获取应用主Activity实例对象
var main = plus.android.runtimeMainActivity();
// importClass: 导入Java类对象
// 导入上下文(官方翻译)
var Context = plus.android.importClass("android.content.Context");
// 导入通知管理相关
var NotificationManager = plus.android.importClass("android.app.NotificationManager");
var Notification = plus.android.importClass("android.app.Notification");
//
var Intent = plus.android.importClass("android.content.Intent");
var PendingIntent = plus.android.importClass("android.app.PendingIntent");
var nm = main.getSystemService(Context.NOTIFICATION_SERVICE);
var intent = new Intent(main, main.getClass());
intent.putExtra("receive", JSON.stringify(payload));
// PendingIntent.getActivity的第二个参数需要设置为随机数,否则多个通知时会导致前面的通知被后面的通知替换Extra的数据,此处我将其和对应通知的id绑定起来
var pendingIntent = PendingIntent.getActivity(main, notifyID, intent, PendingIntent.FLAG_CANCEL_CURRENT);
//可能用到R的一些资源文件
var r = plus.android.importClass("android.R");
var mNotification;
//判断当前系统版本在8.0及以上
if (osVersion.versionNum() >= 8){
if (nm.getNotificationChannel() == null){
var NotificationChannel = plus.android.importClass('android.app.NotificationChannel');
var channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
nm.createNotificationChannel(channel);
}
mNotification = new Notification.Builder(main, channelID);
mNotification.setDefaults(Notification.DEFAULT_ALL); // mNotification.setDefaults(~0);
} else {
mNotification = new Notification.Builder(main);
mNotification.setDefaults(Notification.DEFAULT_ALL);
}
var i= notifyID.toString();
mNotification.setVisibility(Notification.VISIBILITY_PUBLIC) //设置可见性
//mNotification.setOngoing(true) //设置这是否为“正在进行中”通知
mNotification.setContentTitle(title + i) //设置标题
mNotification.setContentText(content); //设置内容
mNotification.setAutoCancel(true); //设置点击消失
mNotification.setShowWhen(true); //显示通知时间,貌似不加这句也能显示
mNotification.setSmallIcon(r.drawable.stat_notify_chat);
//mNotification.setSmallIcon(17301543); //设置app通知小图标,暂只能使用R.drawable文件中的默认值
mNotification.setTicker(title); //设置发送到无障碍服务的“ ticker”文本。
// mNotification.setDefaults(~0); //这两行结合上面的setTicker实现悬浮提示过几秒自动消失,基于覆盖考虑,把这个放到最上方
mNotification.setPriority(Notification.PRIORITY_HIGH); //通知优先级
//mNotification.setFullScreenIntent(pendingIntent, false); //弹出式提示不消失
mNotification.setContentIntent(pendingIntent);
var mNb = mNotification.build();
console.log(notifyID);
//判断当前系统版本在8.0及以上
if (osVersion.versionNum() >= 8){
nm.notify(channelID, notifyID, mNb);
} else {
nm.notify(notifyID, mNb);
}
//void plus.device.beep(2);//bee bee叫
// plus.device.vibrate(300);//震动
console.log('通知结束');
return true;
// #endif
}
/**
* android原生通知点击后所执行的内容
*/
function aOSReceive() {
// #ifdef APP-PLUS
if (plus.os.name != 'Android') {
return false;
}
// android原生通知栏接收器(程序退出后无效)
var main = plus.android.runtimeMainActivity();
var intent = main.getIntent();
var message = intent && intent.getExtra != undefined ? intent.getExtra("receive") : null;
console.log(message);
//console.log(typeof(message))
message = message ? JSON.parse(message) : '';
// var args = plus.runtime.arguments;
// console.log(args)
if (message) {
//删除当前通知
var Context = plus.android.importClass("android.content.Context");
var nm = main.getSystemService(Context.NOTIFICATION_SERVICE);
console.log(message.notify_id);
if (osVersion.versionNum() >= 8){
nm.cancel(message.channel_id, message.notify_id);//安卓版本大于等于8的
} else {
nm.cancel(message.notify_id);//安卓版本小于8的
}
// nm.cancelAll();
// 把消息数据置空,以免再次打开APP时重复执行此处
intent.putExtra("receive", '');
//用message的数据做点什么
uni.showToast({
title: message.notify_id.toString(),
position:'bottom'
})
}
// #endif
}
export default myNJS
建议在main.js中进行全局注册,按需调整
import myNJS from 'my_utils/myNJS.js'
Vue.prototype.$myNJS = myNJS
在需要生成通知的逻辑中进行通知生成,这里是测试数据
this.$myNJS.aOSNotify('通知来了', '这是一条自定义的提醒', {
params1: 'params1',
params2: 'params2',
params3: 'params3',
params4: 'params4'
});
在项目中App.vue的onShow中监听通知点击
onShow: function() {
console.log('App Show');
// #ifdef APP-PLUS
// 通知点击动作触发意图
// aOSReceive()
this.$myNJS.aOSReceive();
// #endif
},
收起阅读 »

能否增加一个我自认为很实用的功能?局部格式化
当我前端代码运用freemaker语法时,使用格式化,会对js部分的代码格式化有影响,对js写了之后的相关js提示也失去提示,识别为DOM节点语法,能否增加一个功能选中freemaker甚至其他非正常的语法使其屏蔽该部分使其只能编辑,不影响原有的功能。
当我前端代码运用freemaker语法时,使用格式化,会对js部分的代码格式化有影响,对js写了之后的相关js提示也失去提示,识别为DOM节点语法,能否增加一个功能选中freemaker甚至其他非正常的语法使其屏蔽该部分使其只能编辑,不影响原有的功能。