HBuilder MUI开发:新手会遇到的各种坑汇总

相比于其他的Hybrid H5+APP平台,MUI也算是自成一派,居正自认为它是国内平台中最棒的之一,包括web和原生相结合在内的各方面细节都设计的很到位。但MUI有个缺点——开发文档不够详细,学习的过程中会遇到很多坑。在本文中,居正将自己一段时间来摸爬滚打的经验分享给大家,帮助大家少走点弯路。

如今,移动应用程序的开发已经不仅仅是传统意义上的iOS、Android双平台,Swift、Java两种开发方式。以WebUI+NativeUI混合架构的Hybrid APP已经渐渐为开发者和用户们所接受。例如知乎的Android客户端、网易云音乐的Mac和Android客户端等采用的都是Web APP开发架构。对开发者来说,只需要掌握HTML和Javascript就可以开发几乎任意平台的客户端,而且开发速率相比于采用原生语言来说大大提高。开发Hybrid APP的平台有很多,国外有谷歌官方的PWA,国内也有如apicloud、dcloud等厂商在做这类的产品。

Hybrid APP详细了解

居正最近也入了Hybrid APP这个坑,采用的是dcloud家的HBuilder+MUI平台,官方网站:http://dev.dcloud.net.cn/mui/。相比于其他的平台,MUI也算是自成一派,居正自认为它是国内平台中最棒的之一,包括web和原生相结合在内的各方面细节都设计的很到位。但MUI有个缺点——开发文档不够详细,学习的过程中会遇到很多坑。在本文中,居正将自己一段时间来摸爬滚打的经验分享给大家,帮助大家少走点弯路。

1.开发文档随时查

虽然文档不详细,但不看文档是万万不可的。由于MUI相关的文档分布的比较散,这里归结如下:

MUI框架文档:http://dev.dcloud.net.cn/mui/window/(打开窗口、事件处理等应用内的基本方法)

HTML5+API文档:http://www.html5plus.org/doc/h5p.html(通过js调用webview、摄像头、本地存储、相册等手机原生方法的类库)

2.MUI≠mui.css

MUI其实有两个意思,一个是MUI开发平台,一个是mui.css的web ui前端框架,采用的是ios风格(居正个人觉得挺难看的= =)。

你可以用自己的UI框架,这里推荐MaterializeCSS:http://www.materializecss.cn/

采用自己的UI框架的话就不必写什么、标签(这些是为mui.css专门设计的),就和平常开发网页一样写、写即可。

建议新手不要用mui.css。

3.一个很好的开发实例

官方提供的开发实例是Hello MUI,但主要演示的是mui.css,注释也比较少。这里推荐自己互联网上找到的一个开发实例。

滴石APP:https://github.com/uikoo9/dishi

开发笔记:http://uikoo9.com/book/detail/3

阅读一下整套代码,会有很大帮助!

4.写法与顺序

前面都是推荐,现在正式开始踩坑。

html文件head里面的东西没声明清楚,或者引入js顺序不对的话,很容易出错。这里直接套格式(以采用了MaterializeCSS前端框架为例,每个html文件都同理):



JQuery版本最好在1.10以上,必须在MUI核心js之后、所有自己的js之前引入。

5.mui变量和plus变量分别是什么

mui变量和plus变量都是在MUI核心js里面声明的。

mui变量中的方法是打开窗口、事件处理等应用内的基本方法。是dcloud平台自己制作的。

plus变量是通过js调用webview、摄像头、本地存储、相册等手机原生方法的类库。是HTML5+中国产业联盟统一制作的。它的文档里面各种变量各种方法一定要去看!

6.mui.init()、mui.plusReady()和子页面

官方的说法

在app开发中,若要使用HTML5+扩展api,必须等plusready事件发生后才能正常使用,mui将该事件封装成了mui.plusReady()方法。

当然你不可能不用到HTML5+API,所以请把业务代码全部写到mui.plusReady()里面!

mui.init()用于页面初始化,也必须调用。

直接套格式(写在第3点提到的某个页面专一的js里面):

mui.init();

mui.plusReady(function(){

//业务代码…

}

需要注意的是mui.init()和mui.plusReady()的执行分不清谁先谁后。所以如果你在mui.init()里面按照官方文档的说明用subpages创建了一个子页面,在mui.plusReady()里面是不能直接取得引用的(会报null错误)。

故不建议采用官方文档中的方法在mui.init()里面直接创建subpages!新手可以记住:mui.init()里面什么都不要写。

也不建议新手用官方推荐的什么双webview下拉加载上拉刷新来提高性能,比较麻烦而且容易出错,直接用JQuery插件实现。单webview性能足够了,一般的设备其实也都不会卡。

如果实在要用子窗口的话建议这样写:

mui.init();

mui.plusReady(function(){

var child=plus.webview.create(‘窗口URL’,’窗口ID’,{top:’60px’/*子窗口与父窗口顶部的距离,以免遮住父窗口顶部导航栏*/});//直接用H5+API创建窗口

plus.webview.currentWebview().append(child);//将创建的子窗口添加到父窗口

}

添加完子窗口后,父窗口原来位置上面的东西全部会被挡住。

实例:MUI内置浏览器

7.事件处理,用这一个封装就够了

MUI文档中的事件管理有没有让你晕头转向?这里直接给一个万能封装,用它就够了(放在第3点提到的全局js里面):

function myEvent(obj, event, func){

$(document).off(event, obj).on(event, obj, func);

};

myEvent方法有三个传参。obj是一个字符串,和JQuery选择器传入的参数一模一样。event是一个字符串,写事件类型,一般如果是点击的话就写tap(不要写click,习惯要改过来)。func传入一个匿名方法,里面写业务代码。

使用方法,以点击id为hello的按钮弹出警告框为例:

myEvent(‘#hello’,’tap’,function(){

alert(‘你好’);

});

8.页面间传参,用这一个套路就够了

MUI的页面间传参有各种各样的方法。这里推荐一个最简单最高效的:用extras属性传参。

A页面打开B页面(text.html)代码:

mui.openWindow({

url:’text.html’,

id:’text01′,

extras:{

content:’我是内容’,

title:’我是标题’

}

});

顺便提一下mui.openWindow中的两个必备参数:

url:目标页面相对于此页面的地址(不是相对于业务处理js的地址)

id:字符串数据,打开窗口的唯一标识符。如果打开了一个窗口没有销毁,在其他地方又采用此id打开窗口的话就会直接跳到先前打开的那个窗口,并且不会执行里面的mui.plusReady()代码。

B页面接收A页面传来的两个参数(必须写在mui.plusReady()里面):

var content=plus.webview.currentWebview().content;

var title=plus.webview.currentWebview().title;

需要注意的是,extras里面的取名不能取mui.openWindow中存在的参数,例如id、url这样的,因为调用的方法都是【plus.webview.currentWebview().名字】。否则MUI就不知道你想调用的是这个窗口本身的属性还是传过来的参数。这一点应该算是MUI的设计缺陷。

9.网络请求必须用mui.ajax,调试必须用真机或模拟器

你可能习惯了JQuery的$.ajax方法,但在mui开发里面必须用mui.ajax,否则会出现跨域错误问题。调试的时候不要用HBuilder自带的内置浏览器调试,必须用真机或模拟器中的HBuilder基座调试,否则也会跨域报错。

mui.ajax和$.ajax参数基本一样,返回的是一个XMLHttpRequest对象。

10.manifest.json中的build版本号要手动改

版本号有两种,一种是应用版本名称(如:1.2),一种是build版本号(如:65)。应用市场判断APP有没有升级用的是build版本号而不是应用版本名称。但HBuilder中build版本号并不是自动递增的,需要手动改。如果没改的话应用升级发布到应用市场里面会出现奇怪的错误。

打开manifest.json切换到代码视图,找到:

其中name即为应用版本名称,code即为build版本号。每次发布应用的时候code值要改成比上次大的数。

以上是为大家整理的若干条新手易错点,希望大家在开发中少走弯路!


本文首发于淀粉月刊:https://dfkan.com

原作者:居正

发布时间:2018年7月11日

点此查看原文

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容

  • MUI背景介绍 MUI是一套前端框架,由DCLOUD公司研发而成,提供大量H5和js语言组成的组件,大大提高了开发...
    jackzhouyu阅读 29,617评论 2 76
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • 在深圳 教育机构很多 各种培训机构各种培训 如果 把所有的教育资源全部整合 联盟起来 那么一定会很好玩 第一 ...
    余淼阅读 119评论 0 0
  • 【1】 05年,我十二岁,娟子十三岁,《仙剑奇侠传》正在疯狂的席卷着电视屏幕,我俩窝在沙发上,我哭着,娟子一脸嫌弃...
    MrHear阅读 513评论 0 2
  • 乌云浸湿的日子 没有黎明,胆怯让我 蜷缩成一只蜗牛 躲避风口浪尖 被荒芜和孤独款待 被厚重的黑款待 命运是否想让我...
    木屋和猫阅读 154评论 0 3