uniapp 内使用 nvue 做原生标题

本贴最后更新于 1804 天前,其中的信息可能已经沧海桑田

nvue 页面只能使用 vue 的生命周期,uniapp 生命周期 api 支持部分,css 样式只支持 flex,很多 css 样式不支持

<template>
	<div class="controls-top" ref="controlsTop">
		<div class="title"><text class="text">{{title}}</text></div>
		<div class="fanhui" @tap="back"><text class="ios-icon">&#xe60a;</text></div>
		<div class="top-right1">
			<div class="power-view">
				<div class="power-box">
					<div class="power-header"></div>
					<div class="power-body"><div class="power-level" :style="{ width: `${16 * level}px`, backgroundColor: '#fff' }"></div></div>
				</div>
			</div>
		</div>
		<div class="top-right2">
			<text class="ios-sm-title">{{nowTime}}</text>
		</div>
	</div>
</template>

<script>
const animation = weex.requireModule('animation');
const modal = weex.requireModule('modal');
export default {
	data() {
		return {
			level:0,
			nowTime:"00:00",
			title:'',
			timer:null,
			platform:null
		}
	},
	beforeCreate() {
		// #ifdef APP-PLUS-NVUE
		var domModule = weex.requireModule('dom');
		domModule.addRule('fontFace', {
			fontFamily: 'texticons',
			src: "url('../../../static/text-icon.ttf')"
		});
		// #endif
	},
	created(){
		uni.getSystemInfo({
			success: (e) => {
				// #ifndef MP
				this.platform = e.platform
				// #endif
			}
		})
	},
	mounted() {
		this.getLevel()
		this.timer = setInterval(()=>{
			this.nowTime = this.getNowTime()
		},1000)
		uni.$on("videoTitileShow",()=>{
			this.nowTime = this.getNowTime()
			this.animateControls(0,this.$refs.controlsTop)
		})
		uni.$on("videoTitileHide",()=>{
			this.animateControls(-40,this.$refs.controlsTop)
		})
		uni.$on("videoTitileChange",(title)=>{
			this.title = title
		})
	},
	destroyed() {
		uni.$off("videoTitileShow")
		uni.$off("videoTitileHide")
		uni.$off("videoTitileChange")
		clearInterval(this.timer)
	},
	methods: {
		getLevel(){
			let promise = new Promise((resolve,reject)=>{
				//#ifdef APP-PLUS-NVUE
				if(this.platform == 'android'){
					//注意,安卓需要配置下manifest.json文件,打开后,进入模块权限配置,在右侧的Android权限设置里勾选上android.permission.BATTERY_STATS
					var main = plus.android.runtimeMainActivity();  
					var Intent = plus.android.importClass('android.content.Intent');  
					var recevier = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  
					        onReceive: function(context, intent) {  
					        var action = intent.getAction();  
					        if (action == Intent.ACTION_BATTERY_CHANGED) {  
					            let level   = intent.getIntExtra("level", 0); //电量  
					            var voltage = intent.getIntExtra("voltage", 0); //电池电压  
					            var temperature = intent.getIntExtra("temperature", 0); //电池温度  
								resolve(level/100)
					        }  
					     }  
					 });  
					var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
					var filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);  
					main.registerReceiver(recevier, filter);
				}else if(this.platform == 'ios'){
					var UIDevice = plus.ios.import("UIDevice");
					var dev = UIDevice.currentDevice();  
					if (!dev.isBatteryMonitoringEnabled()) {  
					    dev.setBatteryMonitoringEnabled(true);  
					}  
					let level =dev.batteryLevel();  
					
					resolve(level)
				}
				//#endif
				//#ifdef MP-WEIXIN
				wx.getBatteryInfo({
					success: function(e) {
						resolve(e.level)
					}
				})
				//#endif
			})
			promise.then(res=>{
				this.level = res
			})
		},
		getNowTime(){
			var now = new Date();
			var hh = now.getHours();            //时
			if(hh<10) hh = "0" + hh;
			var mm = now.getMinutes();          //分
			if(mm<10) mm = "0" + mm;  
			return `${hh}:${mm}`; 
		},
		back(){
			this.animateControls(-40,this.$refs.controlsTop)
			uni.$emit("exitFullscreen")
		},
		animateControls(distance,el){
			animation.transition(el, {
				styles: {
					transform: `translate(0px, ${distance}px)`,
				},
				duration: 350, //ms
				timingFunction: 'ease',
				delay: 0 //ms
				}, () => {
					
				}
			)
		}
	}
};
</script>

<style>
.controls-top {
	/* width: 750upx; */
	/* #ifndef APP-PLUS-NVUE */
	display: flex;
	/* #endif */
	position: relative;
	background-image: linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.8));
	height: 40px;
	transform: translateY(-40px);
	align-items: center;
	justify-content: space-between;
	text-align: left;
	padding: 0 40px 0 40px;
}
.ios-icon {
	font-size: 18px;
	color: #fff;
	font-family: texticons;
}
.title {
	/* width: 750upx; */
	height: 40px;
	/* #ifndef APP-PLUS-NVUE */
	display: flex;
	/* #endif */
	position: absolute;
	left: 40px;
	right: 80px;
	top: 0px;
	justify-content: center;
	text-align: left;
	align-items: flex-start;
	/* background-color: #007aff; */
	padding: 0 10px 0 10px;
}
.text {
	color: #fff;
	font-size: 14px;
}
.fanhui {
	/* #ifndef APP-PLUS-NVUE */
	display: flex;
	/* #endif */
	width: 40px;
	height: 40px;
	position: absolute;
	top: 0;
	left: 0;
	justify-content: center;
	align-items: center;
}
.top-right1 {
	/* #ifndef APP-PLUS-NVUE */
	display: flex;
	/* #endif */
	align-items: center;
	font-size: 12px;
	color: #fff;
	position: absolute;
	top: 14px;
	right: 2px;
	width: 40px;
}
.top-right2 {
	/* #ifndef APP-PLUS-NVUE */
	display: flex;
	/* #endif */
	align-items: center;
	font-size: 12px;
	color: #fff;
	position: absolute;
	top: 12px;
	right:38px;
	width: 40px;
}
.power-view {
	/* #ifndef APP-PLUS-NVUE */
	display: flex;
	/* #endif */
	align-items: center;
}
.power-box {
	flex-direction: row;
	align-items: center;
}
.power-header {
	height: 4px;
	width: 2px;
	background-color: #fff;
}
.power-body {
	height: 9px;
	width: 20px;
	border-width: 1px;
	border-color: #fff;
	padding: 1px;
	flex-direction: row;
	justify-content: flex-end;
}
.power-level {
	height: 5px;
}
.ios-sm-title{
	font-size: 10px;
	color: #fff;
}
</style>

image.png

pages.josn 配置 nvue
image.png

vue 页面里获取 nvue 组件,使用

this.videoTitleNvue = uni.getSubNVueById('title');
this.videoTitleNvue.setStyle({
	top: 44 + uni.getSystemInfoSync().statusBarHeight + 'px',
	left: '0px',
	width: '100%',
	height: '40px'
});
this.videoTitleNvue.show('auto', 0, function() {
	// 打开后进行一些操作...
	//
});

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
gjTool
欢迎博客互链 https://www.gjtool.cn/ 武汉

推荐标签 标签

  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 282 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    8 引用 • 30 回帖 • 409 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    574 引用 • 3533 回帖
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 1 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    288 引用 • 734 回帖 • 1 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 2 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    177 引用 • 816 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    343 引用 • 723 回帖
  • 996
    13 引用 • 200 回帖 • 10 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 106 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 105 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 548 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 591 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 387 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1348 回帖 • 1 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 2 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 3 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 140 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 486 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 361 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 7 关注
  • 笔记

    好记性不如烂笔头。

    308 引用 • 793 回帖