一、計算屬性
我們可以將同一函數定義為一個方法而不是一個計算屬性,兩種方式的最終結果確實是完全相同的。然而,不同的是計算屬性是基於他們的依賴進行緩存的,只要相關依賴發生改變時
他們才會重新求值。這就意味着多次訪問計算屬性會立即返回之前的計算結果,而不必再次執行函數;
相比之下,每當觸發重新渲染時,調用方法將總會再次執行函數;
我們為什么需要緩存?假設我們有一個性能開銷比較大的計算屬性A,他需要遍歷一個巨大的數組並做大量的計算。然后我們可能有其他的計算屬性依賴於A。如果沒有緩存,我們將不可避免額多次
執行A的getter!如果你不希望有緩存,請用方法來替代;
二、async
使用async語法開發業務,代碼以更整潔優雅的方式替代Callback 與 Promise
1)如何配置async語法的babel編譯支持
當前應用平台本身僅支持ES5的語法,所以要支持他必須借助bebel之類的語法分析轉換工具,同時要在代碼中注入polyfill;
那么開發者可以把@babel/runtime/regenerator注入到app.ux中,因為這個文件是所有頁面腳本執行前都會執行的;
//腳本:regenerator.js
//注意:僅用於注入類庫函數,不允許存儲頁面組件等數據
const injectRef = Object.getPrototypeOf(global)||global;
//注入regeneratorRuntime
injectRef.regeneratorRuntime = require('@babel/runtime/regenerator');
//如果使用hap-toolkit版本低於0.0.38(babel版本低於7),則按下面的方式引入 injectRef.regeneratorRuntime = require('babel-runtime/regenerator')
在app.ux中引入這個腳本文件,就可以注入對async的支持(在項目編譯后的build/app.js中搜索regeneratorRuntime即可發現注入成功);
2)使用async ,await語法
onReady(){
this.testAsync();
}
testAsync(){
async function bar(){
return 'bar';
}
async function foo(){
const ret1 = await bar();
console.info('PAGE:foo:',ret1);
}
foo();
}
3)在native接口中使用async------ 該方法僅支持platformVersion 1010+ 的異步接口
例如:
<script>
import fetch from '@system.fetch'
export default {
async onReady(){
try {
const response = await fetch.fetch({ url:''});
console.info('fetch成功code:', response.data.code);
console.info('fetch成功data:', response.data.data);
console.info('fetch成功headers:', JSON.stringify(response.data.headers));
}catch(err){
console.info('fetch失敗code':err.code);
console.info('fetch失敗data':err.data);
}
}
}
</script>
3) Native接口返回callback
對於platformVersion低於1010的設備,以及非異步回調的方法,要想以async的方式使用native接口,需要對native接口進行改造,從返回callback方式到返回Promise方式,同時定義async方法返回。
例如:
import nativeFetch from '@system.fetch';
const natives = {
async fetch(options){
const p1 = new Promise((resolve,reject)=>{
options.success = function(data,code){
resolve({ data, code })
}
options.fail = function(data,code){
reject( {data,code} );
}
nativeFetch.fetch(options);
})
return p1
}
}
export { natives }
改造fetch接口,暴露natives變量到app對象上;
調用async版本的fetch接口的示例代碼如下:
<script>
export default {
onReady(){
this.testMockNatives()
}
async testMockNatives(){
const { natives } = this.$app.$def;
const ret1 = await natives.fetch({
url:''
})
console.info('fetch結果:',JSON.stringify(ret1));
}
}
</script>