前端如何低门槛开发iOS、Android、小程序多端应用

现如今跨平台开发技术已不是什么新鲜话题了,在市面上也有一些开源的框架可供选择,然而技术成熟、产品服务健全的平台并不多,其中也不乏推陈出新的框架值得关注。

比如最近使用的AVM,由APICloud迭代推出的多端开发框架,基于JavaScript,兼容多语法,如果是Vue、React的用户,可直接上手,没什么学习成本,具备虚拟DOM,可一次编写多端渲染;主要是APICloud上线已有7年,相对已经成熟,所以我把自己的一些认知和实践结合AVM官方文档的内容做了一下整理,希望能对需要使用跨平台开发技术的开发者有所帮助。

为什么学习AVM框架?

结合AVM官网的介绍和我自己的一些实践经验,我总结了一系列AVM的特性,我想这些内容足以让你主动去学习AVM框架了。

  1. 一套代码可编译为对应Android 、iOS 、微信小程序、iOS 轻App、H5端的安装包或代码包。
  2. 兼容APICloud2.0技术栈,这意味着平台上上千款Android iOS原生模块可供使用。或者在老项目里部分引入3.0的技术,对APP局部进行优化。
  3. 原生引擎渲染。如果使用 avm.js 进行开发,App 将使用无 webView 的原生引擎 3.0 进行渲染,所有组件及视图与 Android & iOS 系统原生组件和视图百分百对齐。
  4. 类Vue语法和兼容 React JSX。有Vue或React基础的用户可以很快上手。
  5. 组件化开发,提升代码复用率。

AVM中的页面介绍:

AVM中的页面称为stml页面,一个典型的 stml 文件代码如下:

1.  <template>  
2.      <view>  
3.          <view class="header">  
4.              <text>{title}</text>  
5.          </view>  
6.          <view class="content">  
7.              <text>{content}</text>  
8.          </view>  
9.          <view class="footer">  
10.             <text>{footer}</text>  
11.         </view>  
12.     </view>  
13. </template>  
14. <style>  
15.     .header {  
16.       height: 45px;  
17.     }  
18.     .content {  
19.       flex-direction:row;  
20.     }  
21.     .footer {  
22.       height: 55px;  
23.     }  
24. </style>  
25. <script>  
26.     export default {  
27.         name: 'api-test',  
28.           
29.         apiready(){  
30.             console.log("Hello APICloud");  
31.         },  
32.   
33.         data(){  
34.             return {  
35.                 title: 'Hello App',  
36.                 content: 'this is content',  
37.                 footer: 'this is footer'  
38.             }  
39.         }  
40.     }  
41. </script>

数据绑定

从上面代码段中可以看到数据绑定方式为{变量},同时支持双大括号、单大括号将变量或表达式包起来,可以用于绑定文本内容或元素属性。

事件绑定

监听事件有两种方式。
使用 on 监听:
<text onclick="doThis">Click me!</text>

使用 v-on 指令以及缩写方式监听:
<text v-on:click="doThis">Click me!</text>
<text @click="doThis">Click me!</text>

事件处理方法
事件的处理方法需要在 methods 中定义,方法默认包含一个参数,可以通过该参数获取 detail、currentTarget 对象等。

1.  <template>  
2.      <text data-name="avm" onclick="doThis">Click me!</text>  
3.  </template>  
4.  <script>  
5.      export default {  
6.          name: 'test',  
7.          methods: {  
8.              doThis(e){  
9.                  api.alert({  
10.                     msg:e.currentTarget.dataset.name  
11.                 });  
12.             }  
13.         }  
14.     }  
15. </script>  

事件处理方法也可以使用模板的方式,如:
<text onclick={this.doThis}>Click me!</text>

view 是通用容器组件,内部可以放置任意组件。默认布局方式为flex布局。

• 注意不要直接在 view 内添加文本,添加文本使用 text 组件。
text 组件用于显示文本信息。

1.  <template>  
2.      <scroll-view class="main" scroll-y>  
3.          <text class="text">普通文本</text>  
4.          <text class="text bold">粗体文本</text>  
5.          <text class="text italic">斜体文本</text>  
6.          <text class="text shadow">Text-shadow 效果</text>  
7.      </scroll-view>  
8.  </template>  
9.  <style>  
10.     .main {  
11.         width: 100%;  
12.         height: 100%;  
13.     }  
14.     .text {  
15.         height: 30px;  
16.         font-size: 18px;  
17.     }  
18.     .bold {  
19.         font-weight:bold;  
20.     }  
21.     .italic {  
22.         font-style:italic;  
23.     }  
24.     .shadow {  
25.         text-shadow:2px 2px #f00;  
26.     }  
27. </style>  
28. <script>  
29.     export default {  
30.         name: 'test'  
31.     }  
32. </script>  

image 组件用于显示图片。
button 组件定义一个按钮。
input 组件定义一个输入框。
swiper 定义滑动视图,支持上下或左右滑动。其中只可放置 swiper-item 组件。
scroll-view 定义滚动视图。
若需要在垂直方向滚动,则需要指定高度;若在水平方向滚动,则需要指定宽度,否则可能无法显示。
ist-view 定义可复用内容的竖向滚动视图,可以优化内存占用和渲染性能,支持下拉刷新和上拉加载。可使用 scroll-view 的基本属性。
list-view 里面可放置 cell、list-header、list-footer、refresh 等组件,使用 cell 组件作为每项显示内容。
frame 组件用于显示一个frame,效果同 openFrame 方法一致。
frame-group 组件用于显示一个 frame 组,里面的每个 frame 为一个独立的页面。

组件化开发
定义一个组件:
使用stml定义一个组件 api-test.stml:

1.  <template>    
2.      <view class='header'>  
3.          <text>{this.data.title}</text>  
4.      </view>    
5.  </template>    
6.  <script>  
7.      export default {    
8.          name: 'api-test',  
9.          data(){  
10.             return {  
11.                 title: 'Hello APP'  
12.             }  
13.         }  
14.     }  
15. </script>  
16. <style scoped>  
17.     .header{  
18.         height: 45px;  
19.     }  
20. </style>  

引用组件:
在其他页面或组件引用。

1.  // app-index.stml:  
2.    
3.  <template>    
4.      <view class="app">    
5.          <img src="./assets/logo.png" />    
6.          <api-test></api-test>   
7.      </view>    
8.  </template>  
9.  <script>  
10.     import './components/api-test.stml'    
11.       
12.     export default {    
13.         name: 'app-index',    
14.         data: function () {    
15.             return {  
16.                 title: 'Hello APP'  
17.             }  
18.         }    
19.     }    
20. </script>    
21. <style>    
22.     .app {     
23.         text-align: center;    
24.         margin-top: 60px;    
25.     }    
26. </style>  

组件生命周期
avm.js组件规范符合Web Components规范,生命周期遵循标准Web Components组件的生命周期。同时兼容Vue组件的生命周期。

所有支持的生命周期事件

生命周期函数名 触发时机
apiready 页面运行时环境准备完毕&渲染完毕。当页面未引入组件时,该事件等同于installed。
install 组件被挂载到真实DOM(或App原生界面)之前
installed 组件被挂载到真实DOM(或App原生界面)之后。在页面级别中,该事件等同于apiready。
render 组件开始渲染
uninstall 组件从真实DOM(或App原生界面)移除之前
beforeUpdate 组件更新之前
updated 组件更新完成
beforeRender 组件开始渲染之前

『每个页面都应实现apiready,并在apiready后处理业务逻辑;installed属于组件级别生命周期,在页面加载组件过程中即被触发,其触发时机早于apiready』

总体而言,APICloud这款开发框架,比较趋近于原生的编程体验,通过简洁的模式来分离应用的用户界面、业务逻辑和数据模型,适合高度定制化的项目,另外APICloud网站上提供了很多模块、实例和工具源码的下载,感兴趣的前端小伙伴不妨去试试。

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

推荐阅读更多精彩内容