uniapp 使用subNVue原生子窗体显示弹框或悬浮框

2023-09-18 17:05:18

效果展示

在uniapp中,我们可以使用subNVue原生子窗体来解决web-view等原生页面中弹框无法显示的问题。

subNVue原生子窗体是uniapp提供的一种原生组件,可以在uniapp中嵌入原生页面,并且可以与uniapp页面进行通信。我们可以在原生页面中使用uniapp提供的API来与uniapp页面进行通信,从而实现弹框等功能。

image.png

效果如图,显示在右下角的专属福利弹窗,不挂载在当前页面,挂载在全局。

使用步骤

在创建.nvue后缀文件,编写原生vue组件

在页面目录下新建专门存放原生子窗体的文件夹,subNVue是使用原生子窗体的vue页面

image.png

<template>
	<view class="living-box">
		<image @click="jump" class="living-img" src="https://oss-emcsprod-public.modb.pro/modb_imgs/point/reward-dialog.png"></image>
        <i class="iconfont icon-guanbi4 c3" @click.stop="closeRewardView"></i>
        <image @click.stop="closeRewardView" class="close-img" src="https://oss-emcsprod-public.modb.pro/modb_imgs/point/guanbi4.png"></image>
	</view>
</template>
<script>
	import { mapGetters, mapActions, mapMutations } from 'vuex'
	import { savepointmixin } from '@/mixins/savepointmixin.js'
	export default {
        data () {
            return {
                rewardShow:false,
                mdays: ['+5', '+10', '+15'],
                isRewardShow: false
            }
        },
		computed:{
            ...mapGetters(['userInfo']),
            ...mapActions(['getUser', 'isNewUser', 'isOldUserReturn']),
		},
		mixins:[savepointmixin],
		methods: {
			...mapMutations(['SetReward']),
            jump(){
                this.closeRewardView()
                uni.navigateTo({
					url: '/pages/task/task'
				})
            },
			closeRewardView() {
				const _subNVue = uni.getCurrentSubNVue()
				_subNVue.hide()
				this.SetReward('false')
			}
		}
	}
</script>
<style scoped>
    .living-box{
        width: 150rpx;
        height: 150rpx;
        z-index: 99;
        position: relative;
    }
    .living-img{
        width: 130rpx;
        height: 130rpx;
    }
    .close-img{
        width: 28rpx;
        height: 28rpx;
        position: absolute;
        top: 0;
        right: -2rpx;
}
</style>

在pages.json中"pages"中需要使用到subNvue的页面中配置

{
			"path": "pages/course/course",
			"style":{
				"app-plus":{
					"subNVues":[{
						"id": "course-reward", //唯一标识 
						"path": "pages/subNVue/reward",//页面路径不需要后缀",
                				"type": 'popup', //内置的特殊子窗体类型,弹出(popup)和导航(navigationBar)。  
                    一旦设置 type为navigationBar或 popup,position和dock 的值都会被忽略。
						"style": {
							"width": "150rpx",
							"height": "150rpx",
							"bottom": "240rpx",
							"right": "40rpx",
							"background": "transparent"
						}
					}]
				}
			}
}
参数设置
position    原生子窗体的排版位置,排版位置决定原生子窗体在父窗口中的定位方式。
"static",原生子窗体在页面中正常定位,如果页面存在滚动条则随窗口内容滚动;
"absolute",原生子窗体在页面中绝对定位,如果页面存在滚动条不随窗口内容滚动;
"dock",原生子窗体在页面中停靠,停靠的位置由dock属性值决定。 默认值为"absolute"。
dock    原生子窗体的停靠方式,仅当原生子窗体 "position" 属性值设置为 "dock" 时才生效,可取值:"top",原生子窗体停靠则页面顶部;"bottom",原生子窗体停靠在页面底部;"right",原生子窗体停靠在页面右侧;"left",原生子窗体停靠在页面左侧。 默认值为"bottom"。
mask    原生子窗体的遮罩层,仅当原生子窗体 "type" 属性值设置为 "popup" 时才生效,可取值: rgba格式字符串,定义纯色遮罩层样式,如"rgba(0,0,0,0.5)",表示黑色半透明;
width   原生子窗体的宽度,支持百分比、像素值,默认为100%。未设置width属性值时,可同时设置left和right属性值改变窗口的默认宽度。
height  原生子窗体的高度,支持百分比、像素值,默认为100%。 当未设置height属性值时,优先通过top和bottom属性值来计算原生子窗体的高度。
top     原生子窗体垂直向下的偏移量,支持百分比、像素值,默认值为0px。 未设置top属性值时,优先通过bottom和height属性值来计算原生子窗体的top位置。
bottom  原生子窗体垂直向上偏移量,支持百分比、像素值,默认值无值(根据top和height属性值来自动计算)。 当同时设置了top和height值时,忽略此属性值; 当未设置height值时,可通过top和bottom属性值来确定原生子窗体的高度。
left    原生子窗体水平向左的偏移量,支持百分比、像素值,默认值为0px。 未设置left属性值时,优先通过right和width属性值来计算原生子窗体的left位置。
right   原生子窗体水平向右的偏移量,支持百分比、像素值,默认无值(根据left和width属性值来自动计算)。 当设置了left和width值时,忽略此属性值; 当未设置width值时,可通过left和bottom属性值来确定原生子窗体的宽度。
margin  原生子窗体的边距,用于定位原生子窗体的位置,支持auto,auto表示居中。若设置了left、right、top、bottom则对应的边距值失效。
zindex  原生子窗体的窗口的堆叠顺序值,拥有更高堆叠顺序的窗口总是会处于堆叠顺序较低的窗口的前面,拥有相同堆叠顺序的窗口后调用show方法则在前面。
动画方式
slide-in-right  slide-out-right     新窗体从右侧进入
slide-in-left   slide-out-left  新窗体从左侧进入
slide-in-top    slide-out-top   新窗体从顶部进入
slide-in-bottom     slide-out-bottom    新窗体从底部进入
fade-in     fade-out    新窗体从透明到不透明逐渐显示
zoom-out    zoom-in     新窗体从小到大缩放显示
zoom-fade-out   zoom-fade-in    新窗体从小到大逐渐放大并且从透明到不透明逐渐显示
pop-in  pop-out     新窗体从左侧进入,且老窗体被挤压而出
none    none    无动画

通过获取subNVue实例的方式来设置子窗体样式

在mixins中新建一个submixin.js
image.png

showRewardOrNot(subId) {
			let _rewardType = uni.getStorageSync('rewardType')
			let _userInfo = this.userInfo 
			if (_rewardType != 'false'){
				const _sub = uni.getSubNVueById(subId + '-reward')
				_sub && _sub.show()
			}else{
				const _sub = uni.getSubNVueById(subId + '-reward')
				_sub && _sub.hide()
			}
},

在需要展示的页面,执行showRewardOrNot方法

<script>
	import { submixin } from '@/mixins/submixin.js'
	export default {
		mixins:[submixin],
		onShow() {
			this.showRewardOrNot('course')
		},
	}
</script>
更多推荐

接口性能优化

1.批量操作数据库2.异步执行,降低接口耗时,可以使用线程池或消息队列。3.使用缓存,把要查的数据,提前放好到缓存里面,需要时,直接查缓存,而避免去查数据库或者计算的过程。4.提前初始化到缓存,避免一些复杂的计算的耗时。5.池化思想,使用线程池,重复利用线程,避免不必要的耗时。6.拒绝阻塞等待。7.远程调用由串行改为并

企业电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理

功能描述1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看所有的立项信息。主要功能包含:招标立项申请、非招标立项申请、采购立项管理。3、采购项目管理:可对项目采购过程全流程管

OpenCV(四十七):RANSAC优化特征点匹配

1.RANSAC算法介绍RANSAC是一种常用的参数估计方法,全称为RandomSampleConsensus(随机抽样一致性)。它的主要思想是通过随机选择一部分数据样本,构建模型并评估其拟合程度,迭代过程中逐步优化模型,最终得到一个拟合较好的模型。其基本流程如下:随机取样,计算规律(特征点匹配中计算单应矩阵)测试规律

【JMeter】threadNum:将接口查询结果列表按顺序赋值给各线程

【软件测试行业现状】2023年了你还敢学软件测试?未来已寄..测试人该何去何从?【自动化测试、测试开发、性能测试】使用JMeter做性能测试会遇到这么一个场景:后面的请求需要根据前面的查询列表结果通过正则表达式提取器取值后赋值,而后面用户的赋值必须是唯一的,此时该如何做?如果按编程思维来说,这个问题并不难。只需要把前面

打卡中国人民大学与加拿大女王大学金融硕士项目,读研梦想从这里起飞

2024年硕士研究生网报即将于10月8日开启,中国人民大学硕士研究生招生简章也已公布,计划报考人大研究生的在职人士你们复习的怎么样了呢,录取的比率逐年下降,想要成功上岸还是需要做多重准备的,除了PlanA我们还要做PlanB或PlanC等,中国人民大学与加拿大女王大学金融硕士项目邀你来打卡,你的读研梦想也可以从这里起飞

Hadoop的YARN高可用

一、YARN简介Hadoop2.0即第二代Hadoop,由分布式存储系统HDFS、并行计算框架MapReduce和分布式资源管理系统YARN三个系统组成,其中YARN是一个资源管理系统,负责集群资源管理和调度,MapReduce则是运行在YARN上的离线处理框架。YARN一种开源的分布式资源管理和作业调度技术,它是作为

通过java代码在指定目录生成一个指定内容的vue文件

可能很多人觉得用java写vue会更快或者有什么固定格式但其实那需要构建一套非常完整的系统架构如果什么都没构建那么用前端编辑器肯定是比你用java写的快而且写的好的我们直接创建一个类叫Main编写代码如下importjava.io.FileWriter;importjava.io.IOException;publicc

如何搭建数据驱动自动化测试框架?

前言说到数据驱动自动化测试,你会不会有这样的疑问:数据怎么管理?数据怎么才能驱动测试用例执行?到底怎么样才算数据驱动?那么本篇文章就教你如何进行数据驱动测试,相信你一定能对数据驱动自动化测试有一个不一样的理解,希望这篇文章能帮助还在懵懵懂懂的你了解数据驱动测试,如何来做数据驱动测试?那么就跟上我的脚步吧^_^项目介绍1

动态近场通信标签:如何使用C++与微控制器进行NFC交互的完整指南

1.引言近场通信(NFC)技术已经成为现代电子设备中不可或缺的一部分。从手机支付到门禁系统,NFC为我们的日常生活带来了许多便利。但是,你知道我们可以如何使用C++与微控制器进行NFC交互吗?在本文中,我们将深入探讨如何使用开源NFC标签与微控制器进行通信。2.NFC简介近场通信(NFC)是一种建立在射频识别(RFID

2023 ICPC 网络赛 第一场 部分题解 (待完善)

DTransitivity题解:根据题意可以推出结论:如果存在连通块,那么这个连通块要满足条件,必然是满连通块.一共有两种情况1.存在一个连通块不是满连通块设cnt表示连通块的节点个数,num表示连通块边的个数一个连通块的贡献=cnt*(cnt-1)/2-num;那么最终答案=连通块贡献之和2.所有连通块都是满连通块因

2023!6招玩转 Appium 自动化测试

Appium是个什么鬼Appium是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的。可用于IOS和Android以及firefox的操作系统。原生的应用是指用android或ios的sdk编写的应用,移动网页应用是指网页应用,类似于ios中safari应用或者Chrome应用或者类浏

热文推荐