摘要:注冊(cè)賬號(hào)首先你需要一個(gè)手機(jī)廠商對(duì)應(yīng)開發(fā)者賬號(hào)和快應(yīng)用賬號(hào)由于博主的手機(jī)是華為,就在華為官網(wǎng)注冊(cè)一個(gè)個(gè)人開發(fā)者賬號(hào)就好啦,這個(gè)部分就不具體展開了。
博主的開發(fā)及調(diào)試環(huán)境是 macOS 10.13.4 + Chrome/65.0.3325.181 + honorV9 EMUI8.0.0(Android8.0.0)注冊(cè)賬號(hào)本文適合有一定前端開發(fā)經(jīng)驗(yàn)的小伙伴(有一定經(jīng)驗(yàn)看原文檔太累贅了,而且環(huán)境配置部分原文寫的太零碎了),最后總結(jié)了一些開發(fā)過(guò)程中遇到的坑。附文檔鏈接:https://doc.quickapp.cn/
本文沒(méi)有提到的部分和正常前端開發(fā)保持一致,也可能是我還沒(méi)有遇到的坑。。。
首先你需要一個(gè)手機(jī)廠商對(duì)應(yīng)開發(fā)者賬號(hào)和快應(yīng)用賬號(hào)
由于博主的手機(jī)是華為,就在華為官網(wǎng)注冊(cè)一個(gè)個(gè)人開發(fā)者賬號(hào)就好啦,這個(gè)部分就不具體展開了。相關(guān)地址快應(yīng)用也給我提供了一份列表和指南。值得說(shuō)明的是,這個(gè)賬號(hào)是需要實(shí)名制的,有上傳身份證照片和個(gè)人照片審核的,審核需要1-2個(gè)工作日(華為使用芝麻信用認(rèn)證可以即即刻生效,不知道其他廠家什么情況)。
然后打開快應(yīng)用官網(wǎng) https://www.quickapp.cn/, 點(diǎn)擊右上角的注冊(cè),注冊(cè)一個(gè)快應(yīng)用賬號(hào),這個(gè)部分很簡(jiǎn)單,也不展開了。
登陸以后我們可以看到導(dǎo)航欄上多出來(lái)一個(gè)開發(fā)者中心標(biāo)簽,點(diǎn)擊進(jìn)去,選擇【廠商賬號(hào)綁定】選項(xiàng)卡,選擇你的手機(jī)品牌方標(biāo)簽進(jìn)行綁定即可,目前小米、華為、金立、魅族、努比亞、OPPO 和 VIVO 都已經(jīng)可以綁定了,而中興、聯(lián)想和一加還不能綁定。該綁定過(guò)程同樣需要1-2個(gè)工作日審核。
首先你需要安裝 node v6.11.3 這是快應(yīng)用官方推薦的版本
注意:不要使用 v8.0.* 這個(gè)版本內(nèi)部 ZipStream 實(shí)現(xiàn)與 node-archive 包不兼容,會(huì)引起報(bào)錯(cuò)
如果你已經(jīng)使用了 node 高版本,可以安裝 nvm 管理 node 版本(如果你是第一次安裝 node 可以直接安裝 v6 版本,跳過(guò)該步驟)。
安裝nvm, 注意不要使用 brew 安裝,因?yàn)?curl 安裝不需要手動(dòng)配置 .bashrc :
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.2/install.sh | bash
然后安裝對(duì)應(yīng)版本node:
nvm install v6.11.3
檢查當(dāng)前使用 node 版本:
nvm current
此時(shí)應(yīng)該已經(jīng)是我們需要的版本了,如果不是,可以手動(dòng)切換。查看已安裝的 node 版本,和切換到已安裝的版本:
nvm ls # 查看已安裝版本 nvm use v6.11.3 # 使用已安裝版本
更多 nvm 用法直接輸入:
nvm --help
到這里,我們繼續(xù)快應(yīng)用開發(fā),全局安裝腳手架:
npm install -g hap-toolkit
檢測(cè)是否安裝成功:
hap -V調(diào)試工具
chrome 的 devTools 肯定是必不可少的。除此之外我們需要在手機(jī)安裝一下兩個(gè)應(yīng)用:快應(yīng)用調(diào)試器(左),快應(yīng)用預(yù)覽平臺(tái)(右)
如果你不安裝【快應(yīng)用預(yù)覽平臺(tái)】,那么【快應(yīng)用調(diào)試器】中的按鈕都是不可點(diǎn)擊的。而【快應(yīng)用預(yù)覽平臺(tái)】里面其實(shí)啥也看不到,就是一個(gè)供快應(yīng)用工作的殼。完整安裝好以后【快應(yīng)用調(diào)試器】如下圖。
當(dāng)然官方也給了一份 源碼, 方便大家熟悉生命周期,樣式,自定義組件,事件傳遞,組件使用。注意:下載后請(qǐng)記得操作:hap update --force,增加編譯支持。
最后 adb 安裝(Homebrew):
brew cask install android-platform-tools
檢測(cè)是否安裝成功:
adb devicesDemo 項(xiàng)目生成
我們利用腳手架新建一個(gè)項(xiàng)目, 并且進(jìn)入該項(xiàng)目, init 過(guò)程中需要輸入項(xiàng)目名稱:
hap init demo && cd demo
注意:之后的所有操作都在這個(gè)目錄下面
這是 demo 目錄結(jié)構(gòu)
├── sign #rpk包簽名模塊 │ └── debug #調(diào)試環(huán)境 │ ├── certificate.pem #證書文件 │ └── private.pem #私鑰文件 ├── src │ ├── Common #公用的資源和組件文件 │ │ └── logo.png #應(yīng)用圖標(biāo) │ ├── Demo #頁(yè)面目錄 │ | └── index.ux #頁(yè)面文件,可自定義頁(yè)面名稱 │ ├── app.ux #APP文件,可引入公共腳本,暴露公共數(shù)據(jù)和方法等 │ └── manifest.json #項(xiàng)目配置文件,配置應(yīng)用圖標(biāo)、頁(yè)面路由等 └── package.json #定義項(xiàng)目需要的各種模塊及配置信息
需要注意的是,sign 用來(lái)存放簽名模塊,sign/debug 中有用于調(diào)試的證書的私鑰,但debug簽名由于是公開的,安全性無(wú)法保證。在 release 發(fā)布之前一定要添加 release 目錄并且寫入對(duì)應(yīng)的證書和私鑰:
openssl req -newkey rsa:2048 -nodes -keyout private.pem -x509 -days 3650 -out certificate.pem mkdir sign/release && mv *.pem ./sign/release/
安裝相關(guān)依賴:
npm install
如果上面的安裝很慢,可以使用淘寶的資源:
npm install --registry=https://registry.npm.taobao.org
腳手架已經(jīng)提供很多運(yùn)行方式:
npm run release # 發(fā)布程序包,在 /dist/.signed.rpk,注意需要使用 release 簽名模塊 npm run build # 生成 build 和 dist 兩個(gè)目錄。前者是臨時(shí)產(chǎn)出,后者是最終產(chǎn)出 npm run watch # 文件保存時(shí)自動(dòng)編譯和調(diào)試調(diào)試方法
項(xiàng)目已和產(chǎn)生了 rpk 包,在做好之前的準(zhǔn)備工作已后,運(yùn)行:
npm run server # 當(dāng)然,你可以通過(guò) --port XXXX 指定端口,默認(rèn)12306
此時(shí),會(huì)在控制臺(tái)和 http://localhost:12306 得到一個(gè)二維碼,利用【快應(yīng)用調(diào)試器】中的掃碼安裝,即可在手機(jī)上看到效果了。
此時(shí)你退出預(yù)覽界面,點(diǎn)擊【快應(yīng)用調(diào)試器】中的開始調(diào)試,會(huì)同步在 chrome Devtool 中打開調(diào)試窗口,原理同在 chrome://inspect 中使用的遠(yuǎn)程調(diào)試功能,如下圖:
調(diào)試可以采用一下三種方式:
npm run build # 手動(dòng)編譯 + 手動(dòng)刷新 npm run build && npm run notify # 手動(dòng)編譯 + 自動(dòng)刷新 npm run watch # 自動(dòng)編譯 + 自動(dòng)刷新
注意:使用遠(yuǎn)程調(diào)試請(qǐng)確保手機(jī)與PC在同一局域網(wǎng)
開發(fā)
IDE / Code Editor
VS Code: 搜索 Hap Extension 安裝插件即可
webStorm: 可以通過(guò) html 關(guān)聯(lián) ".ux" 文件
sublime: 選擇 html 高亮即可
Android Studio: 使用 Android Monitor 看 console
console
為了正常使用 console.log 修改 src/manifest.json 中的 config 如下:
{ "config": { "logLevel": "debug" } }
console 僅支持 info, log, warn, error, debug 方法。
LESS 支持
安裝 less、less-loader
在 style 標(biāo)簽上添加 lang="less" 屬性即可
Async Function 支持
安裝 babel-runtime
將 babel 注入項(xiàng)目全局
/* app.ux 文件(如果沒(méi)有自己在 Common 里建一個(gè))*/目錄結(jié)構(gòu) 與 manifest 目錄結(jié)構(gòu)
根目錄下的 sign 文件上文已經(jīng)提到過(guò),其他文件目錄不再贅述,因?yàn)榍岸隧?xiàng)目大多如此,這里僅僅說(shuō) src 目錄:
src ├── manifest.json # 配置文件 ├── app.ux # 入口文件 ├── Page1 # 頁(yè)面1 │ ├── page1.ux ├── Page2 # 頁(yè)面2 │ ├── page2.ux └── Common # 公共頁(yè)面和資源 ├── ComponentA.ux ├── ComponentB.ux └── xxx.pngmanifest
manifest
屬性 | 類型 | 默認(rèn)值 | 必填 | 描述 |
---|---|---|---|---|
package | String | - | 是 | 應(yīng)用包名,確認(rèn)與原生應(yīng)用的包名不一致,推薦采用com.company.module的格式,如:com.example.demo |
name | String | - | 是 | 應(yīng)用名稱,6個(gè)漢字以內(nèi),與應(yīng)用商店保存的名稱一致,用于在桌面圖標(biāo)、彈窗等處顯示應(yīng)用名稱 |
icon | String | - | 是 | 應(yīng)用圖標(biāo),提供192x192大小的即可 |
versionName | String | - | 否 | 應(yīng)用版本名稱,如:"1.0" |
versionCode | Integer | - | 是 | 應(yīng)用版本號(hào),從1自增,推薦每次重新上傳包時(shí)versionCode+1 |
minPlatformVersion | Integer | - | 否 | 支持的最小平臺(tái)版本號(hào),兼容性檢查,避免上線后在低版本平臺(tái)運(yùn)行并導(dǎo)致不兼容;如果不填按照內(nèi)測(cè)版本處理 |
features | Array | - | 否 | 接口列表,絕大部分接口都需要在這里聲明,否則不能調(diào)用,詳見每個(gè)接口的文檔說(shuō)明 |
config | Object | - | 是 | 系統(tǒng)配置信息,詳見下面說(shuō)明 |
router | Object | - | 是 | 路由信息,詳見下面說(shuō)明 |
display | Object | - | 否 | UI顯示相關(guān)配置,詳見下面說(shuō)明 |
config
用于定義系統(tǒng)配置和全局?jǐn)?shù)據(jù)。
屬性 | 類型 | 默認(rèn)值 | 描述 |
---|---|---|---|
logLevel | String | log | 打印日志等級(jí),分為off,error,warn,info,log,debug |
designWidth | Integer | 750 | 頁(yè)面設(shè)計(jì)基準(zhǔn)寬度,根據(jù)實(shí)際設(shè)備寬度來(lái)縮放元素大小 |
data | Object | - | 全局?jǐn)?shù)據(jù)對(duì)象,屬性名不能以$或_開頭,在頁(yè)面中可通過(guò)this進(jìn)行訪問(wèn);如果全局?jǐn)?shù)據(jù)屬性與頁(yè)面的數(shù)據(jù)屬性重名,則頁(yè)面初始化時(shí),全局?jǐn)?shù)據(jù)會(huì)覆蓋頁(yè)面中對(duì)應(yīng)的屬性值 |
router
用于定義頁(yè)面的組成和相關(guān)配置信息,如果頁(yè)面沒(méi)有配置路由信息,則在編譯打包時(shí)跳過(guò)。
屬性 | 類型 | 默認(rèn)值 | 描述 |
---|---|---|---|
entry | String | - | 首頁(yè)名稱 |
pages | Object | - | 頁(yè)面配置列表,key值為頁(yè)面名稱(對(duì)應(yīng)頁(yè)面目錄名,例如Hello對(duì)應(yīng)"Hello"目錄),value為頁(yè)面詳細(xì)配置page,詳見下面說(shuō)明 |
router.page
用于定義單個(gè)頁(yè)面路由信息。
屬性 | 類型 | 默認(rèn)值 | 必填 | 描述 |
---|---|---|---|---|
component | String | - | 是 | 頁(yè)面對(duì)應(yīng)的組件名,與ux文件名保持一致,例如"hello" 對(duì)應(yīng) "hello.ux" |
path | String | /<頁(yè)面名稱> | 否 | 頁(yè)面路徑,例如“/user”,不填則默認(rèn)為/<頁(yè)面名稱>。path必須唯一,不能和其他page的path相同。下面page的path因?yàn)槿笔?會(huì)被設(shè)置為“/Index”:"Index": {"component": "index"} |
filter | Object | - | 否 | 聲明頁(yè)面可以處理某種請(qǐng)求 |
router.page.filter
聲明頁(yè)面可以處理某種請(qǐng)求,頁(yè)面可以從$page獲取打開頁(yè)面的參數(shù)。filter的結(jié)構(gòu)如下:
"filter": { "": { "uri": " " } }
屬性 | 類型 | 默認(rèn)值 | 必填 | 描述 |
---|---|---|---|---|
action | String | - | 是 | 請(qǐng)求的動(dòng)作,目前僅支持view這一種 |
uri | Pattern | - | 是 | 請(qǐng)求的數(shù)據(jù)的匹配規(guī)則。必須是正則表達(dá)式。如https?://.*可以匹配所有http和https類型的網(wǎng)址。 |
display
用于定義與UI顯示相關(guān)的配置。
屬性 | 類型 | 默認(rèn)值 | 描述 |
---|---|---|---|
backgroundColor | String | #ffffff | 窗口背景顏色 |
fullScreen | Boolean | false | 是否是全屏模式,默認(rèn)不會(huì)同時(shí)作用于titleBar,titleBar需要繼續(xù)通過(guò)titleBar控制 |
titleBar | Boolean | true | 是否顯示titleBar |
titleBarBackgroundColor | String | - | 標(biāo)題欄背景色 |
titleBarTextColor | String | - | 標(biāo)題欄文字顏色 |
titleBarText | String | - | 標(biāo)題欄文字(也可通過(guò)頁(yè)面跳轉(zhuǎn)傳遞參數(shù)(titleBarText)設(shè)置) |
menu | Boolean | false | 是否顯示標(biāo)題欄右上角菜單按鈕 |
pages | Object | - | 各個(gè)頁(yè)面的顯示樣式,key為頁(yè)面名(與路由中的頁(yè)面名保持一致),value為窗口顯示樣式,頁(yè)面樣式覆蓋default樣式。 |
開發(fā)基礎(chǔ) 保留字{{title}} ? {{($item || {}).name}} {{($item || {}).value}}
This is children of hint templete.
除了傳統(tǒng)保留字,添加了 show tid 等;
生命周期頁(yè)面生命周期
屬性 | 類型 | 參數(shù) | 返回值 | 描述 | 觸發(fā)時(shí)機(jī) |
---|---|---|---|---|---|
onInit | Function | 無(wú) | 無(wú) | 監(jiān)聽頁(yè)面初始化 | 當(dāng)頁(yè)面完成初始化時(shí)調(diào)用,只觸發(fā)一次 |
onReady | Function | 無(wú) | 無(wú) | 監(jiān)聽頁(yè)面創(chuàng)建完成 | 當(dāng)頁(yè)面完成創(chuàng)建可以顯示時(shí)觸發(fā),只觸發(fā)一次 |
onShow | Function | 無(wú) | 無(wú) | 監(jiān)聽頁(yè)面顯示 | 當(dāng)進(jìn)入頁(yè)面時(shí)觸發(fā) |
onHide | Function | 無(wú) | 無(wú) | 監(jiān)聽頁(yè)面隱藏 | 當(dāng)頁(yè)面跳轉(zhuǎn)離開時(shí)觸發(fā) |
onDestroy | Function | 無(wú) | 無(wú) | 監(jiān)聽頁(yè)面退出 | 當(dāng)頁(yè)面跳轉(zhuǎn)離開(不進(jìn)入導(dǎo)航棧)時(shí)觸發(fā) |
onBackPress | Function | 無(wú) | Boolean | 監(jiān)聽返回按鈕動(dòng)作 | 當(dāng)用戶點(diǎn)擊返回按鈕時(shí)觸發(fā)。返回true表示頁(yè)面自己處理返回邏輯,返回false表示使用默認(rèn)的返回邏輯,不返回值會(huì)作為false處理 |
onMenuPress | Function | 無(wú) | 無(wú) | 監(jiān)聽菜單按鈕動(dòng)作 | 當(dāng)用戶點(diǎn)擊菜單按鈕時(shí)觸發(fā) |
A頁(yè)面的生命周期接口的調(diào)用順序:
打開頁(yè)面A:onInit() -> onReady() -> onShow()
在頁(yè)面A打開頁(yè)面B:onHide()
從頁(yè)面B返回頁(yè)面A:onShow()
A頁(yè)面返回:onBackPress() -> onHide() -> onDestroy()
應(yīng)用生命周期
屬性 | 類型 | 參數(shù) | 返回值 | 描述 | 觸發(fā)時(shí)機(jī) |
---|---|---|---|---|---|
onCreate | Function | 無(wú) | 無(wú) | 監(jiān)聽?wèi)?yīng)用創(chuàng)建 | 當(dāng)應(yīng)用創(chuàng)建時(shí)調(diào)用 |
onDestroy | Function | 無(wú) | 無(wú) | 監(jiān)聽?wèi)?yīng)用銷毀 | 當(dāng)應(yīng)用銷毀時(shí)觸發(fā) |
全局對(duì)象 (通過(guò) this 訪問(wèn))
的屬性 | 類型 | 參數(shù) | 描述 |
---|---|---|---|
$app | Object | - | 應(yīng)用對(duì)象 |
$app.$def | Object | - | 獲取在app.ux中暴露的對(duì)象 |
$app.$data | Object | - | 獲取在manifest.json的config.data中聲明的全局?jǐn)?shù)據(jù) |
$page | Object | - | 頁(yè)面對(duì)象 |
$page.action | String | - | 獲取打開當(dāng)前頁(yè)面的action。僅在當(dāng)前頁(yè)面是通過(guò)filter匹配的方式打開時(shí)有效,否則為undefined。參見manifest |
$page.uri | String | - | 獲取打開當(dāng)前頁(yè)面的uri。僅在當(dāng)前頁(yè)面是通過(guò)filter匹配的方式打開時(shí)有效,否則為undefined。參見manifest |
$page.setTitleBar | Function | Object* | - |
$valid | Boolean | - | 頁(yè)面對(duì)象是否有效 |
$visible | Boolean | - | 頁(yè)面是否處于用戶可見狀態(tài) |
* this.$page.setTitleBar 參數(shù)屬性包括:
{ text: "Hello QuickApp", //標(biāo)題欄文字 textColor: "#ffff", //文字顏色 backgroundColor: "#434343", //背景顏色 backgroundOpacity: "0.8", //背景透明度 menu: false, //是否在標(biāo)題欄右上角顯示菜單按鈕 | 設(shè)置當(dāng)前 }
屬性 | 類型 | 參數(shù) | 描述 |
---|---|---|---|
$element | Function | id: String | 獲取指定id的組件dom對(duì)象,如果沒(méi)有指定id,則返回根組件dom對(duì)象用法:this.$element("xxx")獲取id為xxx的組件實(shí)例對(duì)象 this.$element() 獲取根組件實(shí)例對(duì)象 |
$root | Function | 無(wú) | 獲取頂層ViewModel |
$parent | Function | 無(wú) | 獲取父親ViewModel |
$child | Function | id: String | 獲取指定id的自定義組件的ViewModel用法:this.$child("xxx") 獲取id為xxx的div組件ViewModel |
$vm deprecated | Function | id: String | 請(qǐng)使用上面this.$child("xxx")替代 |
$rootElement deprecated | Function | 無(wú) | 請(qǐng)使用上面this.$element()替代 |
$forceUpdate | Function | 無(wú) | 強(qiáng)制頁(yè)面刷新 |
公共屬性 | 類型 | 參數(shù) | 描述 |
---|---|---|---|
$set | Function | key: String value: Any |
添加數(shù)據(jù)屬性,必須在onInit函數(shù)中使用,用法:this.$set("key",value) |
$delete | Function | key: String | 刪除數(shù)據(jù)屬性,如果在onInit函數(shù)中使用,用法:this.$delete("key") |
元素屬性/方法 | 類型 | 參數(shù) | 描述 |
---|---|---|---|
$set | Function | key: String value: Any |
添加數(shù)據(jù)屬性,用法:this.$vm("id").$set("key",value) |
$delete | Function | key: String | 刪除數(shù)據(jù)屬性,用法:this.$vm("id").$delete("key") |
$on | Function | eventName: String handler: Function |
在當(dāng)前頁(yè)面注冊(cè)監(jiān)聽事件, 可監(jiān)聽$emit()、 $dispatch()、 $broadcast()等觸發(fā)的自定義事件,不能用于注冊(cè)組件節(jié)點(diǎn)的事件響應(yīng) |
$off | Function | eventName: String handler: Function |
移除事件監(jiān)聽,參數(shù) fnHandler 為可選,傳遞僅移除指定的響應(yīng)函數(shù),不傳遞則移除此事件的所有監(jiān)聽 |
$emit | Function | eventName: String data: Object |
觸發(fā)當(dāng)前實(shí)例監(jiān)聽事件函數(shù),與 $on() 配合使用 |
* 注意,獲取元素應(yīng)該在頁(yè)面已渲染后,如 onReady 事件中或 onReady 事件執(zhí)行完以后。
頁(yè)面設(shè)計(jì)布局和尺寸
采用 border-box 模型且不支持 box-sizing 屬性
設(shè)計(jì)稿1px / 設(shè)計(jì)稿基準(zhǔn)寬度 = 框架樣式1px / 項(xiàng)目配置基準(zhǔn)寬度(項(xiàng)目配置基準(zhǔn)寬度:/src/manifest.json 中 config.designWidth 的值,默認(rèn)750)
CSS
可以使用內(nèi)聯(lián)樣式、tag選擇器、class選擇器、id選擇器來(lái)為組件設(shè)置樣式
僅可以使用并列選擇、后代選擇器、子代選擇器
支持@import引入外部樣式、內(nèi)聯(lián)樣式、行內(nèi)樣式
顏色值不支持縮寫,偽類支持不完全(支持:disabled,:checked,:focus等)
通用通用事件:click, longpress, focus, blur, appear(組件出現(xiàn)),disappear(組件消失),swipe(快速滑動(dòng),參數(shù)direction:[left|right|up|down])
通用屬性: id, class, style, if, elif, else, for, show, disabled 等;
通用樣式:width, height, padding, padding-, margin, margin-, border, border-style, border-width, border-color, border--color, border--width, border-radius, border---radius, background-color, background-size, background-image(僅本地圖片), background-repeat, opacity, display(flex|none), flex, flex-grow, flex-shrick, flex-basis, position(none|fix), linear-gradient, repeating-inear-gradient, transform-origin, animation, animation-name, animation-delay, animation-duration, animation-iteration-count, animation-timing-function, animation-fill-mode, @key-frames(background-color|opacity|width|height|transform), transform(translate|translateX|translateY|rotate|rotateX|rotateY|scale|scaleX|scaleY)(以上*代表枚舉[left|right|top|bottom], 具體和 css 一致。注:縮寫形式和展開形式不要同時(shí)使用)
組件默認(rèn)支持通用事件、屬性和樣式
支持樣式 flex-direction, flex-wrap, justify-content, align-items, align-content
支持屬性 target 和 placement 支持樣式 mask-color 支持事件 visibilitychange 自組件只能是
支持屬性 offset 和 refreshing 支持樣式 background-color 和 progress-color 支持事件 refresh
支持屬性 type(值為 html) 支持div樣式, height 無(wú)效 不支持子組件
支持div樣式
支持屬性 index, interval, autoplay 和 indicator(是否顯示indicator) 支持樣式 indicator-color, indicator-selected-color 和 indicator-size 支持事件 change 支持方法 swipeTo(index)
支持屬性 index 支持事件 change 子組件僅支持最多一個(gè)
支持屬性 mode(scrollable|fix) 支持樣式 height 支持事件 visibilitychange
支持屬性 target 和 placement 支持樣式 mask-color 支持事件 visibilitychange
子組件必須是 支持屬性 scrollpage,默認(rèn)關(guān)閉,標(biāo)志是否將頂部頁(yè)面中非 組件的性能優(yōu)化分為: 精簡(jiǎn) DOM 層級(jí)、復(fù)用 支持 flex-direction 和 column 具有方法scrollTo(num)和事件scroll, scrollBottom, scrollTop
的子組件可以是任何標(biāo)簽或除 有一個(gè)屬性 type,type 值相同的 支持
支持屬性 href href 屬性值可根據(jù)路由配置 href還支持http和https開頭的網(wǎng)址,點(diǎn)擊后會(huì)打開webview加載網(wǎng)頁(yè) href還可以通過(guò)“?param1=value1”的方式添加參數(shù),參數(shù)可以在頁(yè)面中通過(guò)this.param1的方式使用 子組件僅支持 僅支持 `text 支持 sms, tel, mailto 支持樣式 lines, color, font-style, font-weight(normal|bold),text-decoration, text-align, line-height, text-overflow
支持屬性 src 和 alt 支持樣式 resize-mode(cover|contain|stretch|center) 不支持子組件
支持屬性 percent 和 type(horizontal|circular) 支持樣式 color 和 stroke-width 支持事件 visibilitychange 不支持子組件
支持屬性 numstars(總數(shù)), stepsize(步長(zhǎng)), indicator(是否可操作)和 rating(值) 支持樣式 star-background, star-secondary, star-foreground(三種狀態(tài)的圖片) 支持事件 change,不支持click、longpress事件 不支持子組件
: 格式化的文本 不支持 show 和 disabled 屬性 支持樣式 color, font-size, font-style, font-weight(normal|bold),text-decoration 不支持任何事件 不支持子組件
支持樣式 lines, color, font-style, font-weight(normal|bold),text-decoration, text-align, line-height, text-overflow
: 接收用戶的輸入 不支持子組件 支持屬性 type(button|checkbox|radio|text|email|date|time|number|password), name, value, checked 和 placeholder 支持樣式 color, placeholder-color, width, height 和 font-size 支持事件 change 支持方法 focus()
: 為input、textarea組件定義標(biāo)注 不支持子組件 支持屬性 target 支持樣式 lines, color, font-style, font-weight(normal|bold),text-decoration, text-align, line-height, text-overflow 不支持事件
: 的子組件,用來(lái)展示下拉選擇具體項(xiàng)目 不支持子組件 支持屬性 value 和 selected 不支持事件
支持子組件 支持屬性 type(text|date|time), range, start, end, value 和 selected 不支持 click 事件, 支持 change 事件 支持方法 show()
: 下拉菜單 僅支持 不支持 click 事件, 支持 change 事件
不支持子組件 支持屬性 min, max, value 和 step 支持樣式 color, selected-color, padding 僅支持 left 和 right 支持事件 change
不支持子組件 支持屬性 checked 支持事件 change
: 接收用戶的輸入 不支持子組件 支持屬性 placeholder 支持樣式 color, placeholder-color 和 font-size 支持事件 change 支持方法 focus()
: 視頻播放器 支持屬性 src, poster 和 autoplay 支持事件 prepared, start, pause, finish, error, seeking, seeked, timeupdate 和 fullscreenchange 支持方法 start(), pause(), setCurrentTime(seconds), requestFullscreen() 和 exitFullscreen()
必須聲明"打開網(wǎng)頁(yè)"接口,否則會(huì)提示缺乏權(quán)限。 支持屬性 src, src 值為 Deeplink, 參考下文 Deeplink 部分 支持樣式 mask-color 支持事件 titlereceive, pagestart, pagefinish 和 error 支持方法 reload(), forward(), back(), canForward(callback), canBack(callback)
@system.app
getInfo(), 得到應(yīng)用名稱、版本名稱、版本號(hào)、log級(jí)別,三級(jí)來(lái)源
@system.share
內(nèi)置分享,接口聲明:{"name": "system.share"}
share({type: MIME Type, data:String/URL/FileList, success, fail, cancel, complete}): 分享調(diào)用
第三方分享,接口聲明:{"name": "service.share","params": {"appSign": "abcdefg...","qqKey":"1234567","wxKey":"wx1234","sinaKey":"1234"}} manifest 參數(shù)說(shuō)明: appSign 簽名; qqKey QQ后臺(tái)ID; wxKey: 微信后臺(tái)ID, sinaKey 新浪后臺(tái)ID
getProvider(): 獲取廠商信息
share({shareType:int, title, summary, targetUrl,imagePath, mediaUrl, success, fail, cancel, complete}) 其中 shareType 默認(rèn)圖文0,純文字1,純圖片2,音樂(lè)3,視頻4 cancel
@system.router 接口聲明:{"name": "system.router"}
push({url, params:Object}): 跳轉(zhuǎn)url
replace({url, params:Object}): 跳轉(zhuǎn)url, 后退不會(huì)來(lái)
back(): 后退
clear(): 清空歷史棧
getLength(): 獲取歷史棧長(zhǎng)度
getState(): 獲取當(dāng)然頁(yè)面位置,名稱,路徑
@system.prompt 接口聲明:{"name": "system.prompt"}
showToast({message, duratuon:(0 or 1)}): 顯示吐司
showDialog({title:, message:, buttons:[{text,color}], success({index}), fail, cancel, complete}): 顯示對(duì)話框
showContextMenu({itemList:String[], itemColor:HexColor, success, fail, cancel, complete}): 顯示上下文菜單
@system.notification 接口聲明:{"name": "system.notification"}
show({contentTitle, contentText, clickAction:{url}}): 顯示通知
@system.vibrator 接口聲明:{"name": "system.vibrator"}
vibrate(): 震動(dòng)1s
@system.webview 接口聲明:{"name": "system.webview"}
loadUrl({url}): 通過(guò) webview 加載 url 在webview打開的網(wǎng)頁(yè)中可以使用的api: system.go(path): url 跳轉(zhuǎn)
@system.request 接口聲明:{"name": "system.request"}
upload({url, header:Object, method(POST|GET), files:{filename,name,url,type}[], data:{name,value}[], success({code,data,headers}), fail, complete}): 上傳
download({url, header:Object, success({token}), fail, complete}): 下載
onDownloadComplete({token, success({url}), fail({code}), complete}): 監(jiān)聽下載任務(wù)
@system.fetch 接口聲明:{"name": "system.fetch"}
fetch({url, header:Object, method(POST|GET), files:{filename,name,url,type}[], data:{name,value}[], success({code,data,headers}), fail, complete}): 發(fā)起請(qǐng)求
@system.storage 接口聲明:{"name": "system.storage"}
get({key, default, success({data}), fail, complete}): 獲取值
set({key, value, success, fail, complete}): 存儲(chǔ)值
clear({success, fail, complete}): 清空數(shù)據(jù)
delete({key, success, fail, complete}): 刪除數(shù)據(jù)
@system.file 接口聲明:{"name": "system.file"}
move({srcUri, dstUri, success, fail({code}), complete}): 移動(dòng)文件
copy({srcUri, dstUri, success, fail({code}), complete}): 復(fù)制文件
list({uri, success(fileList:{uil,list,lastModifiedTime}[]), fail({code}), complete}): 獲取目錄下文件列表
get({uri, success({uil,list,lastModifiedTime}), fail({code}), complete}): 獲取文件信息
delete({uri, success, fail(code**), complete}): 獲取文件信息
@system.barcode (需要用戶授權(quán)) 接口聲明:{"name": "system.barcode"}
scan({success({result}), fail(code:201用戶拒絕), cancel, complete}): 掃描二維碼
@system.sensor 接口聲明:{"name": "system.sensor"}
subscribeAccelerometer({callback(x,y,c)}): 獲取重力感應(yīng)數(shù)據(jù)
unsubscribeAccelerometer(): 停止獲取重力感應(yīng)數(shù)據(jù)
subscribeCompass({callback(direction)}): 獲取羅盤數(shù)據(jù)
unsubscribeCompass(): 停止獲取羅盤數(shù)據(jù)
subscribeProximity({callback(distance)}): 獲取距離感應(yīng)數(shù)據(jù)
unsubscribeProximity(): 停止獲取距離感應(yīng)數(shù)據(jù)
subscribeLight({callback(intensity)}): 獲取光線感應(yīng)數(shù)據(jù)
unsubscribeLight(): 停止獲取光線感應(yīng)數(shù)據(jù)
@system.clipboard 接口聲明:{"name": "system.clipboard"}
set({text, success, fail, complete}): 寫入
get({success({text}), fail, complete}): 讀取
@system.geolocation (需要用戶授權(quán)) 接口聲明:{"name": "system.geolocation"}
getLocation({timeout, success({longitude, latitude}), fail, complete}): 獲取地理位置
subscribe({callback(longitude, latitude), fail}): 監(jiān)聽用戶位置
unsubscribe(): 取消監(jiān)聽用戶位置
@system.shortcut (需要用戶授權(quán)) 接口聲明:{"name": "system.shortcut"}
hasInstalled({success, fail, complete}): 是否已創(chuàng)建桌面圖標(biāo)
install({success, fail, complete}): 創(chuàng)建桌面圖標(biāo)
@system.calandar (需要用戶授權(quán)) 接口聲明:{"name": "system.calandar"}
insert({title, description, startDate:number, endDate:number, timezone:string, allDay:boolean是否整天, rrule:string重復(fù)規(guī)則, remindMinutes:number[]提前提醒時(shí)間, organizer: string, success, fail, cancel}): 插入日歷事件
@system.network 接口聲明:{"name": "system.network"}
getType({success(metered是否按流量計(jì)費(fèi), type網(wǎng)絡(luò)類型), fail, complete}): 獲取網(wǎng)絡(luò)類型
subscribe({callback(metered, type), fail}): 監(jiān)聽網(wǎng)絡(luò)情況
unsubscribe(): 取消監(jiān)聽網(wǎng)絡(luò)情況
@system.device (需要用戶授權(quán)) 接口聲明:{"name": "system.device"}
getInfo({success({brand, manufacturer, model, product, osType, osVersionName, osVersionCode, platformVersionName, platformVersionCode, language, region, screenWidth, screenHeight}), fail, complete}): 獲取設(shè)備基本信息
getId({type(device|mac|user|advertising)[], success({device, mac, user, advertising}), fail, complete}): 獲取設(shè)備標(biāo)識(shí)
getDeviceId({success({deviceId}), fail, complete}): 獲取設(shè)備ID
getUserId({success({userId}), fail, complete}): 獲取用戶ID
getAdvertisingId({success({advertisingId}), fail, complete}): 獲取廣告ID
getTotalStorage({success({totalStorage}), fail, complete}): 獲取總?cè)萘?/p>
getAvailableStorage({success({availableStorage}), fail, complete}): 獲取可用容量
getCpuInfo({success({cpuInfo}), fail, complete}): 獲取cpu信息
@system.brightness 接口聲明:{"name": "system.brightness"}
getValue({success({value}), fail, complete}): 獲取屏幕亮度
setValue({value, success(value:0手動(dòng);1自動(dòng)), fail, complete}): 設(shè)置屏幕亮度
getMode({success(value:0手動(dòng);1自動(dòng)), fail, complete}): 獲取屏幕亮度模式
setMode({value, success, fail, complete}): 設(shè)置屏幕亮度模式 1. 接口聲明:{"name": "system.volume"}
@system.volume 接口聲明:{"name": "system.volume"}
getMediaValue({success(value:0到1), fail, complete}): 獲取音量
setMediaValue({value, success, fail, complete}): 設(shè)置音量
@system.battary 接口聲明:{"name": "system.battary"}
getStatus({success(charging, level:0到1), fail, complete}): 獲取當(dāng)前電池狀態(tài)
@system.package 接口聲明:{"name": "system.package"}
hasInstalled({package包名, success(result:boolean), fail, complete}): 判斷是否安裝了某個(gè)應(yīng)用
install({package, success(result:boolean), fail, complete}): 安裝應(yīng)用 利用路由中的 push 操作打開應(yīng)用
@system.record (需要用戶授權(quán)) 接口聲明:{"name": "system.record"}
start({success({url}), fail, complete}): 開始錄音
record.stop(): 停止錄音
@system.cipher 接口聲明:{"name": "system.cipher"}
rsa({action:encrypt|decrypt, text, key加密為公鑰|解密為私鑰, transformation補(bǔ)充項(xiàng),success({text}), fail, complete}): rsa 加密解密
@system.media (需要用戶授權(quán)) 接口聲明:{"name": "system.media"}
takePhoto({success({uri}), fail, complete, cancel}): 拍照
takeVideo({success({uri}), fail, complete, cancel}): 錄像
pickImage({success({uri}), fail, complete, cancel}): 選擇圖片
pickVideo({success({uri}), fail, complete, cancel}): 選擇視頻
@system.image 接口聲明:{"name": "system.image"}
getImageInfo({uri, success({uri, width, height, size}), fail, complete, cancel}): 獲取圖片基礎(chǔ)信息
compressImage({uri, quality:1到100, ratio:number縮放比, format:圖片格式, success({uri, width, height, size}), fail, complete, cancel}): 壓縮圖片
applyOperations({uri, operations:Object[](如下), quality, format, success({uri}), fail, complete, cancel}}): 對(duì)圖片按順序執(zhí)行編輯操作 剪裁: {action: "crop", x, y, width, height}
縮放: {action: "scale", scaleX, scaleY}
旋轉(zhuǎn): {action: "rotate", degree}
editImage({uri, success({uri}), fail, complete, cancel}): 使用編輯器編輯圖片
@system.audio 接口聲明:{"name": "system.audio"}
play(): 播放
pause(): 暫停 屬性: src, currentTime, duration, autoplay, loop, volume, muted 事件: play, pause, loadeddata, ended, durationchange, error, timeupdate
@system.push 接口聲明:{"name": "system.push"}
getProvider(): 獲取服務(wù)提供商
subscribe({success({regId}), fail, complete}): 訂閱push
unsubscribe(): 取消訂閱push
on({callback(messageId, data)}): 添加push事件回調(diào)
off(): 移除push事件回調(diào)
@system.pay 接口聲明:{"name": "system.pay"}
getProvider(): 獲取服務(wù)提供商
pay({orderInfo:String, success({code, message, result}), fail({code, message}), complete}): 付款
@system.stats 接口聲明:{"name": "system.stats"}
getProvider(): 獲取服務(wù)提供商
recordCountEvent({category, key, map}): 計(jì)數(shù)類型事件
recordCalculateEvent({category, key, value, map}): 計(jì)算類型事件
@system.account 接口聲明:{"name": "system.account"}
getProvider(): 獲取服務(wù)提供商
authorize({type:string(code|token), redirectUri, scope, state, success({state, code, accessToken, tokenType, expiresIn, scope}), fail, complete): 認(rèn)證
getProfile({token, success({openid, id, unionid, nickname, avatar}), fail, complete}): 獲取用戶認(rèn)證信息
@system.alipay 接口聲明:{"name": "system.alipay"}
pay({orderInfo:string, callback}): 支付 支付寶支付細(xì)節(jié),請(qǐng)查看請(qǐng)求參數(shù)說(shuō)明文檔
@system.wxpay 接口聲明:{"name": "service.wxpay", "params": {"package": "com.your.package", "sign": "abcdefg", "url": "http://your.domain/page"}}
兩種方式的 manifest 配置: app 原生:package: 包名,sign: 簽名 web 方式:url:H5 url
getType(): 返回調(diào)用方式(none|APP|MWEB)
pay({prepayid, extra, success({prepayid,final_url}), fail(code**), complete}): 支付
extra app 版參數(shù)如下 app_id: 微信支付訂單中的app_id partner_id: 微信支付訂單中的partner_id package_value: 微信支付訂單中的package_value nonce_str: 微信支付訂單中的nonce_str time_stamp: 微信支付訂單中的time_stamp order_sign: 微信支付訂單中的order_sign
extra app 版參數(shù)如下 mweb_url: 在微信的支付服務(wù)器下單以后,微信返回的 MWEB_URL,在CP用于微信支付的h5頁(yè)面中,直接將mweb_url取出后跳轉(zhuǎn)過(guò)去即可,但這個(gè)做法并不是強(qiáng)制的,您也可以通過(guò)其他自定義鍵值向您自己的服務(wù)器換取MWEB_URL custome_key: 其他的自定義鍵值,cp可以根據(jù)需要增加其他自己認(rèn)為需要的鍵名和鍵值 微信支付細(xì)節(jié),請(qǐng)參考微信網(wǎng)頁(yè)支付和微信app支付
以上接口錯(cuò)誤列表如下: 201 用戶拒絕 202 參數(shù)錯(cuò)誤 204 超時(shí) 300 I/O錯(cuò)誤 301 路徑不存在 900 簽名有誤 901 包名有誤 1000 應(yīng)用未安裝|下載失敗|位置開關(guān)關(guān)閉 1001 url配置找不到|任務(wù)不存在 2001 內(nèi)部錯(cuò)誤 傳遞方法1. 標(biāo)簽配合 queryString 傳遞參數(shù), 這個(gè)和前端一致。 傳遞方法2. 通過(guò) router 接口:router.push(), router.replace(), 接受一個(gè)如下結(jié)構(gòu)的對(duì)象,用法這個(gè)和前端 router 一致。 接收方法:上述2種傳遞參數(shù)的方法,其接收方法一致,在接收參數(shù)頁(yè)面的 protected 對(duì)象中獲取即可(可設(shè)置默認(rèn)值) 回傳參數(shù):借助 this.$app.$data 實(shí)現(xiàn),相當(dāng)于綁定數(shù)據(jù)到全局了,這個(gè)不再舉例 這個(gè)部分和 HTML5 中的同源頁(yè)面通信如出一轍。會(huì)利用到一個(gè)構(gòu)造函數(shù) new BroadcastChannel(string), 它接受一個(gè)字符串參數(shù),作為實(shí)例的頻道名稱。它的實(shí)例具有以下屬性和方法: 其中 onmessage 事件有2個(gè)屬性(通過(guò) event 對(duì)象訪問(wèn)): 由于和 HTML5 用法一樣,這里就不演示了。 父子組件使用見 template 部分
父組件到子組件 子組件通過(guò) props 獲取父組件傳入的值,見上文 template 部分 通過(guò) this.watch(props, callback) 監(jiān)控傳入數(shù)據(jù)變化并調(diào)用回調(diào)函數(shù) 父組件通過(guò)this.$broadcast()完成事件觸發(fā),子組件通過(guò)$on()綁定事件并響應(yīng)
子組件到父組件 父子組件傳對(duì)象類型屬于引用傳遞,可以直接修改父組件傳入對(duì)象改變父組件數(shù)據(jù) 子組件通過(guò)this.$dispatch()完成事件觸發(fā),父組件通過(guò)$on()綁定事件并響應(yīng) 子組件通過(guò)this.$emit()觸發(fā)在節(jié)點(diǎn)上綁定的事件來(lái)執(zhí)行父組件的方法 * 注:this.$broadcast()、this.$emit() 和 this.$dispatch() 參數(shù)一致 配合 http://hapjs.org/app/ https://hapjs.org/app/ hap://app/ 參數(shù)說(shuō)明: package: 應(yīng)用包名,必選 path: 應(yīng)用內(nèi)頁(yè)面的path,可選,默認(rèn)為首頁(yè) key-value: 希望傳給頁(yè)面的參數(shù),可選,可以有多個(gè) 從傳統(tǒng)網(wǎng)頁(yè)調(diào)起需引入以下腳本:
提供方法:
appRouter(packageName, pageName, params, confirm) packageName:應(yīng)用的包名,和manifest.json中保持一致 pageName:跳轉(zhuǎn)的頁(yè)面,對(duì)應(yīng)于manifest.json中pages的path字段. 特殊的.如果傳入的是"/",則跳轉(zhuǎn)到path為"/"的頁(yè)面,如果無(wú)此頁(yè)面,則跳轉(zhuǎn)到首頁(yè). 更多信息,請(qǐng)參見manifest中path字段的說(shuō)明. params:攜帶參數(shù),形式為{ param1: value1, param2: value2 } confirm:顯示給用戶的應(yīng)用名稱,當(dāng)不為空時(shí),表示跳轉(zhuǎn)時(shí)需要用戶確認(rèn),當(dāng)不傳或者為false時(shí),表示無(wú)需用戶確認(rèn)直接跳轉(zhuǎn)
channelReady(callback) callback:檢測(cè)的回調(diào)函數(shù),無(wú)論檢測(cè)到是否支持服務(wù),都會(huì)執(zhí)行回調(diào)函數(shù)。平臺(tái)支持服務(wù)則傳入實(shí)參true,否則傳入實(shí)參false 自定義屬性名不能采用駝峰命名,否則值永遠(yuǎn)是 undefined show 屬性并不好用,沒(méi)起什么作用 類似 onInit 等等函數(shù)是頁(yè)面生命周期,不是組件生命周期,不會(huì)因?yàn)榻M件狀態(tài)變化而執(zhí)行 display 類型只有 flex 和 none 子盒子不能將父盒子撐高 不遵循盒子模型,類似但不完全等同于 border-box, css選擇器在覆蓋樣式時(shí)候,不能采用后代選擇器寫法(初次定義樣式時(shí)可以),這樣子 box 樣式不會(huì)生效,因?yàn)樾阅軉?wèn)題,當(dāng)前只支持 CSS 聲明的多個(gè)選擇器中最后一個(gè)規(guī)則的變更對(duì)DOM的更新,例如,下例中給 .tag 添加了 .active 后,只有邊框顏色會(huì)變,字的顏色不會(huì)變。 文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97602.html 摘要:個(gè)人所有文章同步到前言最近公司準(zhǔn)備開發(fā)幾款可以在微信小程序端和端同時(shí)運(yùn)行的一套商城,接著就是任務(wù)下發(fā)嘍,但是有一點(diǎn),時(shí)間緊任務(wù)重,直接說(shuō)其他的不管,反正幾個(gè)星期之內(nèi)必須上線,頭疼。
個(gè)人所有文章同步到:https://github.com/zhengzhuan...
前言
最近公司Boss準(zhǔn)備開發(fā)幾款可以在微信小程序端和H5端同時(shí)運(yùn)行的一套商城,接著就是任務(wù)下發(fā)嘍,但是有一點(diǎn),時(shí)間緊任...: 開發(fā)者在頁(yè)面中實(shí)現(xiàn)長(zhǎng)列表或者屏幕滾動(dòng)等效果時(shí),習(xí)慣使用div組件做循環(huán)遍歷
的元素隨
一起滾動(dòng)。開啟 scrollpage 會(huì)降低
渲染性能
以外的組件
以下接口通過(guò) import app from "@system.app" 或 require("@system.app")方式引入
接口申明在 manifest 文件的 features 中,除了@system.app使用前以外都需要申明。
頁(yè)面切換和參數(shù)傳遞
跳轉(zhuǎn)頁(yè)面
{
url: "/src/home/index.html",
params: { key: 2333 /* 需要傳遞的參數(shù) */ }
}
名稱
類型
參數(shù)
描述
name
String
-
頻道名稱,區(qū)分不同的消息頻道(注意:不同頻道之間不可通信)。
postMessage
Function
Any: 消息內(nèi)容
用于在當(dāng)前頻道中廣播消息。
onmessage
Function
Event:消息對(duì)象
訂閱消息。在頻道中接收到廣播消息之后,會(huì)給所有訂閱者派發(fā)消息事件。
close
Function
-
關(guān)閉當(dāng)前的頻道。
屬性
類型
描述
type
String
"message"
data
Any
接收到的消息內(nèi)容
* 注:觸發(fā)時(shí)傳遞參數(shù),再接收時(shí)使用event.detail來(lái)獲取參數(shù)
* 注:當(dāng)傳遞結(jié)束后,可以調(diào)用event.stop()來(lái)結(jié)束傳遞相關(guān)文章
Taro,快速上手教程(一)
發(fā)表評(píng)論
0條評(píng)論
閱讀 1083·2021-11-16 11:45
閱讀 2731·2021-09-27 13:59
閱讀 1326·2021-08-31 09:38
閱讀 3157·2019-08-30 15:52
閱讀 1323·2019-08-29 13:46
閱讀 2095·2019-08-29 11:23
閱讀 1654·2019-08-26 13:47
閱讀 2501·2019-08-26 11:54