1. 换算规则:
1 px = 2 rpx
1 px = 0.75 pt = 3 / 4 pt
1 pt = 1.33 px = 4 / 3 px = 8 / 3 rpx
1 em = 16 px
1 em = 12 pt
1px = 1pt * 图像分辨率/72
1. rpx是基于 当前屏幕宽度与750的比值 算出来的,属于动态的。会根据不同屏幕进行换算。所以做响应式比较好用。
2. 1px 与框架样式 1rpx 转换公式 设计稿 1px / 设计稿基准宽度 = 框架样式 1rpx / 750rpx。
3. 页面元素宽度在 uni-app 中的宽度计算公式 750rpx * 元素在设计稿中的宽度 / 设计稿基准宽度。
eg:
1. 若设计稿宽度为 750px,元素 A 在设计稿上的宽度为 100px,
那么元素 A 在 uni-app 里面的宽度应该设为:750rpx * 100 / 750,结果为:100rpx。
2. 若设计稿宽度为 640px,元素 A 在设计稿上的宽度为 100px,
那么元素 A 在 uni-app 里面的宽度应该设为:750rpx * 100 / 640,结果为:117rpx。
3. 若设计稿宽度为 375px,元素 B 在设计稿上的宽度为 200px,
那么元素 B 在 uni-app 里面的宽度应该设为:750rpx * 200 / 375,结果为:400rpx。
pt (point,磅):是一个物理长度单位,指的是72分之一英寸。
px (pixel,像素):像素px是相对于显示器屏幕分辨率而言的。
PX特点:
IE无法调整那些使用px作为单位的字体大小;
国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位;
Firefox能够调整px和em,rem,但是96%以上的中国网民使用IE浏览器(或内核)。
em (相对长度单位,相对于当前对象内文本的字体尺寸):是一个相对长度单位,最初是指字母M的宽度,故名em。现指的是字符宽度的倍数,用法类似百分比,如:0.8em, 1.2em,2em等。通常1em=16px。
EM特点
em的值并不是固定的;
em会继承父级元素的字体大小。
注意:任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合: 1em=16px。那么12px=0.75em,10px=0.625em。为了简化font-size的换算,需要在css中的body选择器中声明Font-size=62.5%,这就使em值变为 16px*62.5%=10px, 这样12px=1.2em, 10px=1em, 也就是说只需要将你的原来的px数值除以10,然后换上em作为单位就行了。
所以我们在写CSS的时候,需要注意:
body选择器中声明Font-size=62.5%。
将你的原来的px数值除以10,然后换上em作为单位。
重新计算那些被放大的字体的em数值。避免字体大小的重复声明。
也就是避免1.2 * 1.2= 1.44的现象。比如说你在#content中声明了字体大小为1.2em,那么在声明p的字体大小时就只能是1em,而不是1.2em, 因为此em非彼em,它因继承#content的字体高而变为了1em=12px。
字号:是中文字库中特有的一种单位,以中文代号表示特定的磅值pt,便于记忆、表述。
pt和px的换算公式可以根据pt的定义得出:
pt = 1/72(英寸), px = 1/dpi(英寸)
rem 是CSS3新增的一个相对单位(root em,根em),这个单位引起了广泛关注。这个单位与em有什么区别呢?区别在于使用rem为元素设定字体大小时,仍然是相对大小,但相对的只是HTML根元素。这个单位可谓集相对大小和绝对大小的优点于一身,通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应。目前,除了IE8及更早版本外,所有浏览器均已支持rem。对于不支持它的浏览器,应对方法也很简单,就是多写一个绝对单位的声明。这些浏览器会忽略用rem设定的字体大小。
eg:
p {font-size:14px; font-size: 0.875rem;}
注意: 选择使用什么字体单位主要由你的项目来决定,如果你的用户群都使用最新版的浏览器,那推荐使用rem,如果要考虑兼容性,那就使用px,或者两者同时使用。
px 与 rem 的选择?
对于只需要适配少部分手机设备,且分辨率对页面影响不大的,使用px即可 。
对于需要适配各种移动设备,使用rem,例如只需要适配iPhone和iPad等分辨率差别比较挺大的设备。
1. 获取状态栏高度 刘海屏
this.iStatusBarHeight = uni.getSystemInfoSync().statusBarHeight
var(--status-bar-height) 此变量在微信小程序环境为固定 25px,在 App 里为手机实际状态栏高度。
2. 绝对定位居中
//1、兼容性不错的主流css绝对定位居中的用法:
//子绝父相
.conter{
width:600px;
height:400px;
position:absolute;
left:50%;
top:50%;
margin-top:-200px;/*高度的一半*/
margin-left:-300px;/*宽度的一半*/
}
注意:这种方法有一个很明显的不足,就是需要提前知道元素的尺寸。否则margin负值的调整无法精确。此时,往往要借助JS获得。
//2、css3的出现,使得有了更好的解决方法,就是使用transform代替margin.transform中translate偏移的百分比值是相对于自身大小的,可以这样实现css绝对定位居中:
.conter{
width:600px;height:400px;
position:absolute;
left:50%;
top:50%;
transform:translate(-50%,-50%);/*50%为自身尺寸的一半*/
}
//3、margin:auto实现绝对定位元素的居中(上下左右均0位置定位;margin:auto)
.conter{
width:600px;
height:400px;
position:absolute;
left:0;
top:0;
right:0;
bottom:0;
margin:auto;/*有了这个就自动居中了*/
}
CSS position 相对定位和绝对定位:
https://www.runoob.com/w3cnote/css-position-static-relative-absolute-fixed.html
1.获取当前时间戳
Math.round(new Date() / 1000)
手机信息
uni.getSystemInfo({
success: function (res) {
console.log(res.model);
console.log(res.pixelRatio);
console.log(res.windowWidth);
console.log(res.windowHeight);
console.log(res.language);
console.log(res.version);
console.log(res.platform);
}
});
系统信息
try {
const res = uni.getSystemInfoSync();
console.log(res.model);
console.log(res.pixelRatio);
console.log(res.windowWidth);
console.log(res.windowHeight);
console.log(res.language);
console.log(res.version);
console.log(res.platform);
} catch (e) {
// error
}
获取当前APP版本信息及版本升级
全局APP.vue文件中
export default {
data() {
return {
}
},
onLaunch: function() {
console.log('App Launch 启动')
// #ifdef APP-PLUS
// 获取 manifest.json 的信息
plus.runtime.getProperty( plus.runtime.appid, function ( wgtinfo ) {
// 获取 app的version
let appversion = wgtinfo.version;
// 存缓存 版本号
try {
uni.setStorageSync('appversion', appversion);
} catch (e) {}
});
//更新
this.checkUpdate();
// #endif
},
onShow: function() {
console.log('App Show 展示在前台')
},
onHide: function() {
console.log('App Hide 不在展示前台')
},
methods: {
// 版本升级
// #ifdef APP-PLUS
checkUpdate(){
var curVersion = uni.getStorageSync('appversion')
console.log(curVersion);
// 更新版本接口
var server = "http://t.heijinka.vip/api/version";
var that = this;
uni.request({
url: server, //请求更新地址
data: that.curVersion,
success(res) {
if (res.statusCode == 200 && that.curVersion < res.data.msg.version) {
uni.showModal({
title: '版本更新' + res.data.msg.version,
content: res.data.msg.content,
confirmText: "更新",
// showCancel: !res.forceUpdate,
success: function(e) {
if (e.confirm) {
if (plus.os.name.toLowerCase() == 'ios') {
// 跳转到下载页面
plus.runtime.openURL(res.data.msg.downloadUrl)
} else {
that.createDownload(res.data.msg.downloadUrl);
}
} else {
//取消
}
}
});
} else {
uni.showModal({
title: '提示',
content: '已是最新版本',
showCancel: false
});
}
},
})
},
createDownload(url){
var dtask = plus.downloader.createDownload(url, {},
function(d, status) {
uni.showToast({
title: '下载完成',
mask: false,
duration: 1000
});
//console.log(dtask);
// 下载完成
console.log('status: '+status);
if (status == 200) {
console.log('下载成功:'+d.filename);
console.log('plus.io.convertLocalFileSystemURL(d.filename): '+plus.io.convertLocalFileSystemURL(d.filename))
plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename), {}, function(success) {
uni.showToast({
title: '安装成功',
mask: false,
duration: 1500
});
}, function(error) {
uni.showToast({
title: '安装失败-01',
mask: false,
duration: 1500
});
})
} else {
uni.showToast({
title: '更新失败-02',
mask: false,
duration: 1500
});
}
});
try {
dtask.start(); // 开启下载的任务
var prg = 0;
var showLoading = plus.nativeUI.showWaiting("正在下载"); //创建一个showWaiting对象
dtask.addEventListener('statechanged', function(task,status) {
// 给下载任务设置一个监听 并根据状态 做操作
switch (task.state) {
case 1:
showLoading.setTitle("正在下载");
break;
case 2:
showLoading.setTitle("已连接到服务器");
break;
case 3:
prg = parseInt((parseFloat(task.downloadedSize) / parseFloat(task.totalSize)) * 100 );
showLoading.setTitle(" 正在下载" + prg + "% ");
break;
case 4:
plus.nativeUI.closeWaiting();
//下载完成
break;
}
});
} catch (err) {
plus.nativeUI.closeWaiting();
uni.showToast({
title: '更新失败-03',
mask: false,
duration: 1500
});
}
},
//#endif
}
}
</script>
标签栏高度 底部安全距离
topSafe:
uni.getSystemInfoSync().statusBarHeight;
var(--status-bar-height)
bottomSafe:
bottom: var(--window-bottom) ;
bottom: calc(var(--window-bottom) + 44px);
小程序版本号
const accountInfo = wx.getAccountInfoSync();
获取系统信息
uni.getSystemInfo({
success(res) {
console.log(res);
}
})
跳转应用市场及App Store
//这个是通用应用市场,如果想指定某个应用商店,需要单独查这个应用商店的包名或 scheme及参数
if (plus.os.name == "Android") {
let appurl = "market://details?id=自己打包用的包名";
plus.runtime.openURL(appurl);
}
//跳转到运用宝
let appurl = "market://details?id=自己打包用的包名";
plus.runtime.openURL(appurl,(err) =>{
console.log('打开运用宝失败', err);
},'com.tencent.android.qqdownloader');
//uni-app 中如何打开外部应用,如:浏览器、淘宝、AppStore、QQ等
打开第三方程序
调用外部浏览器打开指定的URL
plus.runtime.openURL( url, errorCB, identity );
url: ( String ) 必选 要打开的URL地址字符串类型,各平台支持的地址类型存在差异,参考平台URL支持表。
errorCB: ( OpenErrorCallback ) 可选 打开URL地址失败的回调打开指定URL地址失败时回调,并返回失败信息。
identity: ( String ) 可选 指定打开URL地址的程序名称在iOS平台此参数被忽略,在Android平台为程序包名,如果指定的包名不存在,则打开URL地址失败。
<template>
<view>
<button class="button" type="primary" @click="open(0)">使用第三方程序打开指定URL</button>
</view>
</template>
<script>
export default {
data() {
return {
url: 'https://uniapp.dcloud.io/'
}
},
methods: {
open(types) {
plus.runtime.openURL(this.url, function(res) {
cosole.log(res);
});
}
}
}
</script>
调用第三方程序
plus.runtime.launchApplication( appInf, errorCB );
appInf: ( ApplicationInf ) 必选 要启动第三方程序的描述信息
errorCB: ( LaunchErrorCallback ) 必选 启动第三方程序操作失败的回调函数启动第三方程序失败时回调,并返回失败信息。
<template>
<view>
<button class="button" type="primary" @click="launchApp">打开淘宝</button>
</view>
</template>
<script>
export default {
data() {
return {
url: 'https://uniapp.dcloud.io/'
}
},
methods: {
launchApp() {
let _this = this;
// 判断平台
if (plus.os.name == 'Android') {
plus.runtime.launchApplication(
{
pname: 'com.taobao.taobao'
},
function(e) {
console.log('Open system default browser failed: ' + e.message);
}
);
} else if (plus.os.name == 'iOS') {
plus.runtime.launchApplication({ action: 'taobao://' }, function(e) {
console.log('Open system default browser failed: ' + e.message);
});
}
}
}
}
</script>
更多实用例子
常用URLscheme
[
// 只在 ios 中生效
{
name: ‘App Store’,
scheme: ‘itms-apps://’
},
{
name: ‘支付宝’,
pname: ‘com.eg.android.AlipayGphone’,
scheme: ‘alipay://’
},
{
name: ‘淘宝’,
pname: ‘com.taobao.taobao’,
scheme: ‘taobao://’
},
{
name: ‘QQ’,
pname: ‘com.tencent.mobileqq’,
scheme: ‘mqq://’
},
{
name: ‘微信’,
pname: ‘com.tencent.mm’,
scheme: ‘weixin://’
},
{
name: ‘京东’,
pname: ‘com.jingdong.app.mall’,
scheme: ‘openApp.jdMobile://’
},
{
name: ‘新浪微博’,
pname: ‘com.sina.weibo’,
scheme: ‘sinaweibo://’
},
{
name: ‘优酷’,
pname: ‘com.youku.phone’,
scheme: ‘youku://’
}
]
除了简单的打开App,我们更多的时候想要直达。这里汇总了很多有用的直达案例:
使用应用商店打开指定App,可用于引导评分
强制使用应用宝打开指定App
打开淘宝搜索页面。需要你要做淘宝客,需要向淘宝申请自己的scheme参数并传入。
打开地图并指定地点
打开qq并到指定聊天界面,可用于客服具体代码见下:
<template>
<view>
<page-head title="通过scheme打开三方app示例"></page-head>
<button class="button" @click="openBrowser('https://uniapp.dcloud.io/h5')">使用浏览器打开指定URL</button>
<button class="button" @click="openMarket()">使用应用商店打开指定App</button>
<button class="button" @click="openMarket('com.tencent.android.qqdownloader')">强制使用应用宝打开指定App</button>
<button class="button" @click="openTaobao('taobao://s.taobao.com/search?q=uni-app')">打开淘宝搜索页面</button>
<button class="button" @click="openMap()">打开地图并指定地点</button>
<view class="uni-divider">
<view class="uni-divider__content">打开QQ</view>
<view class="uni-divider__line"></view>
</view>
<view class="uni-padding-wrap">
<form @submit="openQQ">
<view>
<view class="uni-title">请输入聊天对象QQ号:</view>
<view class="uni-list">
<view class="uni-list-cell">
<input class="uni-input" name="qqNum" type="number"/>
</view>
</view>
</view>
<view>
<view class="uni-title">请选择QQ号类型:</view>
<radio-group class="uni-flex" name="qqNumType">
<label>
<radio value="wpa" checked=""/>普通QQ号</label>
<label>
<radio value="crm" />营销QQ号(无需加好友直接聊天)</label>
</radio-group>
</view>
<view class="uni-btn-v uni-common-mt">
<button class="button" formType="submit">打开qq并到指定聊天界面</button>
</view>
</form>
</view>
</view> </template>
<script> export default {
data() {
return {
};
},
methods: {
openBrowser(url){
plus.runtime.openURL(url)
},
openMarket(marketPackageName) {
var appurl;
if (plus.os.name=="Android") {
appurl = "market://details?id=io.dcloud.HelloH5"; //由于hello uni-app没有上Android应用商店,所以此处打开了另一个示例应用
}
else{
appurl = "itms-apps://itunes.apple.com/cn/app/hello-uni-app/id1417078253?mt=8";
}
if (typeof(marketPackageName)=="undefined") {
plus.runtime.openURL(appurl, function(res) {
console.log(res);
});
} else{//强制指定某个Android应用市场的包名,通过这个包名启动指定app
if (plus.os.name=="Android") {
plus.runtime.openURL(appurl, function(res) {
plus.nativeUI.alert("本机没有安装应用宝");
},marketPackageName);
} else{
plus.nativeUI.alert("仅Android手机才支持应用宝");
}
}
},
openTaobao(url){
plus.runtime.openURL(url, function(res) {
uni.showModal({
content:"本机未检测到淘宝客户端,是否打开浏览器访问淘宝?",
success:function(res){
if (res.confirm) {
plus.runtime.openURL("https://s.taobao.com/search?q=uni-app")
}
}
})
});
},
openMap(){
var url = "";
if (plus.os.name=="Android") {
var hasBaiduMap = plus.runtime.isApplicationExist({pname:'com.baidu.BaiduMap',action:'baidumap://'});
var hasAmap = plus.runtime.isApplicationExist({pname:'com.autonavi.minimap',action:'androidamap://'});
var urlBaiduMap = "baidumap://map/marker?location=39.968789,116.347247&title=DCloud&src=Hello%20uni-app";
var urlAmap = "androidamap://viewMap?sourceApplication=Hello%20uni-app&poiname=DCloud&lat=39.9631018208&lon=116.3406135236&dev=0"
if (hasAmap && hasBaiduMap) {
plus.nativeUI.actionSheet({title:"选择地图应用",cancel:"取消",buttons:[{title:"百度地图"},{title:"高德地图"}]}, function(e){
switch (e.index){
case 1:
plus.runtime.openURL(urlBaiduMap);
break;
case 2:
plus.runtime.openURL(urlAmap);
break;
}
})
}
else if (hasAmap) {
plus.runtime.openURL(urlAmap);
}
else if (hasBaiduMap) {
plus.runtime.openURL(urlBaiduMap);
}
else{
url = "geo:39.96310,116.340698?q=%e6%95%b0%e5%ad%97%e5%a4%a9%e5%a0%82";
plus.runtime.openURL(url); //如果是国外应用,应该优先使用这个,会启动google地图。这个接口不能统一坐标系,进入百度地图时会有偏差
}
} else{
// iOS上获取本机是否安装了百度高德地图,需要在manifest里配置,在manifest.json文件app-plus->distribute->apple->urlschemewhitelist节点下添加(如urlschemewhitelist:["iosamap","baidumap"])
plus.nativeUI.actionSheet({title:"选择地图应用",cancel:"取消",buttons:[{title:"Apple地图"},{title:"百度地图"},{title:"高德地图"}]}, function(e){
console.log("e.index: " + e.index);
switch (e.index){
case 1:
url = "http://maps.apple.com/?q=%e6%95%b0%e5%ad%97%e5%a4%a9%e5%a0%82&ll=39.96310,116.340698&spn=0.008766,0.019441";
break;
case 2:
url = "baidumap://map/marker?location=39.968789,116.347247&title=DCloud&src=Hello%20uni-app";
break;
case 3:
url = "iosamap://viewMap?sourceApplication=Hello%20uni-app&poiname=DCloud&lat=39.9631018208&lon=116.3406135236&dev=0";
break;
default:
break;
}
if (url!="") {
plus.runtime.openURL( url, function( e ) {
plus.nativeUI.alert("本机未安装指定的地图应用");
});
}
})
}
},
openQQ: function (e) {
// console.log("e.detail.value: " + JSON.stringify(e.detail.value));
// 没有校验qq号是否为空或合法数字,如果不是可用的qq号,启动qq后会停留在qq主界面
plus.runtime.openURL('mqqwpa://im/chat?chat_type=' + e.detail.value.qqNumType + '&uin=' + e.detail.value.qqNum,function (res) {
plus.nativeUI.alert("本机没有安装QQ,无法启动");
});
}
}
};
</script>
<style>
.button {
margin: 30upx;
color: #007AFF;
}
</style>
给自己的App设置scheme
可在manifest中可配置。Android配置方法iOS配置方法
uni-app跳转ios app store
plus.runtime.launchApplication({
action: 'https://itunes.apple.com/cn/app/xxx-xxx-xx-xx/idxxxxxxxxxx?mt=8'
//地址:action: `itms-apps://itunes.apple.com/cn/app/id${appleId}?mt=8`
//地址:https://apps.apple.com/cn/app/%E6%9C%9B%E6%B5%B7%E4%BA%BA/id1514736394
}, function(e) {
console.log('Open system default browser failed: ' + e.message);
});
uni-app 全局变量实现的4种方式
公共模块
定义一个专用的模块,用来组织和管理这些全局的变量,在需要的页面引入。
注意:这种方式只支持多个vue页面或多个nvue页面之间公用,vue和nvue之间不公用。
在根目录下创建common目录,在创建xx.js定义公用方法:
const websiteUrl = 'http://www.javanx.cn';
const now = Date.now || function () {
return new Date().getTime();
};
const isArray = Array.isArray || function (obj) {
return obj instanceof Array;
};
export default {
websiteUrl,
now,
isArray
}
接下来在 pages/index/index.vue 中引用该模块
<script>
import helper from '/common/base.js';
export default {
data() {
return {};
},
onLoad(){
console.log('now:' + helper.now());
},
methods: { }
}
</script>
这种方式维护起来比较方便,但是缺点就是每次都需要引入。
二. 挂载 Vue.prototype
将一些使用频率较高的常量或者方法,直接扩展到 Vue.prototype 上,每个 Vue 对象都会“继承”下来。
注意这种方式只支持多个vue页面或多个nvue页面之间公用,vue和nvue之间不公用。
在 main.js 中挂载属性/方法
Vue.prototype.websiteUrl = 'http://www.javanx.cn';
Vue.prototype.now = Date.now || function () {
return new Date().getTime();
};
Vue.prototype.isArray = Array.isArray || function (obj) {
return obj instanceof Array;
};
然后在 pages/index/index.vue 中调用
<script>
export default {
data() {
return {};
},
onLoad(){
console.log('now:' + this.now());
},
methods: {
}
}
</script>
这种方式,只需要在 main.js 中定义好即可在每个页面中直接调用。
注意:1、每个页面中不要在出现重复的属性或方法名。
2、建议在 Vue.prototype 上挂载的属性或方法,可以加一个统一的前缀。比如 $url、global_url 这样,在阅读代码时也容易与当前页面的内容区分开。
三.globalData
小程序中可以在 App 上声明全局变量,但在 Vue 中没有,uni-app 中在 App.vue 可以定义在 globalData 属性上,也可以使用 API 读写这个值。
这个方式支持vue和nvue共享数据。是目前nvue和vue共享数据的一种比较好的方式。
定义:App.vue
<script>
export default {
globalData: {
text: 'text'
},
onLaunch: function() {
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script>
<style>
/*每个页面公共css */
js中操作globalData的方式如下:
赋值:
getApp().globalData.text = ‘test’
取值:
console.log(getApp().globalData.text)// test
如果需要把globalData的数据绑定到页面上,可在页面的onshow声明周期里进行变量重赋值。HBuilderX 2.0.3起,nvue页面在uni-app编译模式下,也支持onshow。
四.Vuex
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
注意这种方式只支持多个vue页面或多个nvue页面之间公用,vue和nvue之间不公用。
这里以登录后同步更新用户信息为例,简单说明下 Vuex 的用法,更多更详细的 Vuex 的内容,建议前往其官网 Vuex 学习下。
在 uni-app 项目根目录下新建 store 目录,在 store 目录下创建 index.js 定义状态值
const store = new Vuex.Store({
state: {
login: false,
token: '',
avatarUrl: '',
userName: ''
},
mutations: {
login(state, provider) {
console.log(state)
console.log(provider)
state.login = true;
state.token = provider.token;
state.userName = provider.userName;
state.avatarUrl = provider.avatarUrl;
},
logout(state) {
state.login = false;
state.token = '';
state.userName = '';
state.avatarUrl = '';
}
} })
然后,需要在 main.js 挂载 Vuex
import store from './store'
Vue.prototype.$store = store
最后,在 pages/index/index.vue 使用
<script>
import {
mapState,
mapMutations } from 'vuex';
export default {
computed: {
...mapState(['avatarUrl', 'login', 'userName'])
},
methods: {
...mapMutations(['logout'])
}
}
</script>
详细示例,请下载附件,在 HBuilderX 中运行。
示例操作步骤:未登录时,提示去登录。跳转至登录页后,点击“登录”获取用户信息,同步更新状态后,返回到个人中心即可看到信息同步的结果。
注意:对比前面的方式,该方式更加适合处理全局的并且值会发生变化的情况。
1、.vue 和 .nvue 并不是一个规范,因此一些在 .vue 中适用的方案并不适用于 .nvue。
2、Vue 上挂载属性,不能在 .nvue 中使用。
3、.nvue 不支持 vuex
4、如果希望 .vue 和 .nvue 复用一些方法的话,需要采用公用模块的方案,分别在 .vue 和 .nvue 文件中引入。
定时器使用和清除
定义一个timer
data() {
return {
timer: null
}
}
设置定时器
this.timer = setTimeout( () => {
//添加处理逻辑
}, duration*1000)
this.timer = setInterval( () => {
//添加处理逻辑
}, 1000)
清除定时器 这里需要注意的是我们页面中使用了定时器,在离开这个页面的时候一定要记得清除,避免出现bug。
onUnload() {
if (this.timer) {
clearTimeout(this.timer);
this.timer = null;
}
}
tabbar页面用onHide
onOnHide() {
if (this.timer) {
clearTimeout(this.timer);
this.timer = null;
}
}
去掉导航栏
page.json中
所有页面去掉:
"globalStyle": {
"navigationBarTextStyle": "white",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#007AFF",
"backgroundColor": "#F8F8F8",
"navigationStyle":"custom",
"app-plus":{
"titleView":false
}
},
单一页面去掉:
{
"path" : "pages/loginView/messageView",
"style" : {
"navigationBarTitleText": "短信登录",
"enablePullDownRefresh": false,
"navigationStyle":"custom",
"app-plus": {
"titleNView": false
}
}
}
uni-app如何引入Echarts
通过uni-app官网直接安装echarts插件生成echarts项目模板;
创建一个新的hello uni-app项目模板;
把echarts放到components中。
引入echarts
<template>
<view class="container">
<view>
<view class="canvasView">
<mpvue-echarts class="ec-canvas" @onInit="lineInit" canvasId="line" ref="lineChart" />
</view>
</view>
</view>
</template>
<script>
// import * as echarts from '@/components/echarts/echarts.simple.min.js';
// import mpvueEcharts from '@/components/mpvue-echarts/src/echarts.vue';
import * as echarts from '../echarts/echarts.simple.min.js'
import mpvueEcharts from '../mpvue-echarts/src/echarts.vue'
export default {
data() {
return {
updateStatus: false,
line: {
legend: {
data: ['邮件营销'],
},
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value',
data: [],
},
dataZoom: [{
type: 'slider',
start: 30,
end: 100,
zoomLock: false,
}],
grid: {
left: 40,
right: 40,
bottom: 20,
top: 40,
containLabel: true,
},
series: [{
data: [],
data: [820, 932, 901, 934, 1290, 1330, 1320],
type: 'line',
color: ['#5eb4e2'], //折线条的颜色
}]
}
}
},
methods: {
lineInit(e) {
let {
width,
height
} = e;
let canvas = this.$refs.lineChart.canvas
echarts.setCanvasCreator(() => canvas);
let lineChart = echarts.init(canvas, null, {
width: width,
height: height,
})
canvas.setChart(lineChart)
lineChart.setOption(this.line)
this.$refs.lineChart.setChart(lineChart)
},
},
components: {
mpvueEcharts
}
}
</script>
<style>
.ec-canvas {
display: flex;
height: 100%;
flex: 1;
}
.canvasView {
width: 700upx;
height: 500upx;
}
</style>
自定义组件和组件间的消息传递
自定义组件前,需要在项目目录中创建components目录,右键components目录选择新建组件,在创建组件时可以选择模板,也可以点击右上角自定义模板,在弹出的目录中创建模板名.txt,里边写入模板内容即可,例如创建带有属性的模板.txt如下:
<template name="组件名称">
<text style="text-decoration:underline" :href="href" @click="openURL" :inWhiteList="inWhiteList">{{text}}</text>
</template>
<script>
/**
* @description u-link是一个外部网页超链接组件,在小程序内打开内部web-view组件或复制url,在app内打开外部浏览器,在h5端打开新网页
* @property {String} href 点击后打开的外部网页url,小程序中必须以https://开头
* @property {String} text 显示的文字
* @property {Boolean} inWhiteList 是否在小程序白名单中,如果在的话,在小程序端会直接打开内置web-view,否则会只会复制url,提示在外部打开
* @example *
*/
export default {
name: 'u-link', //"组件名称"
//属性
props: {
href: {// 属性名称
type: String, //属性类型
default: ''
},
text: {
type: String,
default: ''
},
inWhiteList: {
type: Boolean,
default: false
}
},
methods: {
openURL() {
// #ifdef APP-PLUS
plus.runtime.openURL(this.href) //这里默认使用外部浏览器打开而不是内部web-view组件打开
// #endif
// #ifdef H5
window.open(this.href)
// #endif
// #ifdef MP
if (this.inWhiteList) { //如果在小程序的网址白名单中,会走内置webview打开,否则会复制网址提示在外部浏览器打开
uni.navigateTo({
url: '/pages/component/web-view/web-view?url=' + this.href
});
} else {
uni.setClipboardData({
data: this.href
});
uni.showModal({
content: '本网址无法直接在小程序内打开。已自动复制网址,请在手机浏览器里粘贴该网址',
showCancel: false
});
}
// #endif
}
}
}
</script>
<style>
</style>
在需要使用自定义组件的页面中,先导入自定义组件,如下:
import u-link from '../../components/u-link.vue';
再在当前页面注册该组件,如下:
components: { u-link}
最后使用即可,如index.vue如下:
<template>
<view>
<u-link class="hello-link" :href="'https://uniapp.dcloud.io/api/'" :text="'https://uniapp.dcloud.io/api/'"
:inWhiteList="true"></u-link>
</view>
</template>
<script>
//import u-link from '../../components/u-link.vue';
export default {
data() {
return {
}
},
onLoad() {
},
onShow() {
},
onHide() {
},
methods: {
}
}
</script>
<style>
</style>