快應用---注意點


一、計算屬性

        我們可以將同一函數定義為一個方法而不是一個計算屬性,兩種方式的最終結果確實是完全相同的。然而,不同的是計算屬性是基於他們的依賴進行緩存的,只要相關依賴發生改變時

他們才會重新求值。這就意味着多次訪問計算屬性會立即返回之前的計算結果,而不必再次執行函數;

        相比之下,每當觸發重新渲染時,調用方法將總會再次執行函數;

        我們為什么需要緩存?假設我們有一個性能開銷比較大的計算屬性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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM