【小程序】微信小程序代碼如何轉uniapp代碼?

衆所周知,微信小程序的語法和uniapp的語法接近,一個是Vue的近親,一個完全兼容Vue,所以他們相互之間轉換應該也是不難的。

微信小程序的語法,其實是vue.js語法的裁剪定製版,在數據綁定、自定義組件等很多方面都有相似之處。
以下是一個小程序源碼轉換步驟指南:

客戶端代碼轉換

  1. 新建一個uni-app項目,把之前的app.js、app.wxss的代碼,挪到app.vue裏,分別放到script和style節點下面。
  2. 轉換app.json爲pages.json,把每個小程序page目錄下的index.json(或頁面名稱對應的json)裏的配置取出來,放到pages.json的style下。
  3. pages下每個頁面目錄放一個vue空文件模板。
  4. 把之前頁面的wxss內容複製到vue文件的style中,無需改動。
  5. 把之前頁面的js內容複製到vue文件的script中,然後執行如下改動
  6. 之前js裏面的data,放到新的data return下。

之前

Page({
  data: {
    show1: false
  }
})

之後

<script>
    export default {
        data() {
            return {
                show1: false
            }
        }
    }
</script>
  1. 之前js裏面的自定義方法,放到新的method下。
  • 之前
Page({
    toggleActionSheet1() {
        this.setData({show1: true});
    }
})
  • 現在
<script>
    export default {
        methods: {
            toggleActionSheet1() {
                this.show1 = true
            }
        }
    }
</script>
  1. 之前js裏面的生命週期函數onLoad、onShow等,直接放到export default下。
  • 之前
Page({
    onLoad() {
        console.log("page load");
    }
})
  • 現在
<script>
    export default {
        onLoad() {
            console.log("page load");
        }
    }
</script>
  1. setdata的處理方式
  • 方式一:從 this.setData({loading: false,areaList: response.data.data}) 改爲 this.loading = false;this.areaList = response.data.data
  • 方式二:重寫setdata方法,如下
setData:function(obj){  
    let that = this;  
    let keys = [];  
    let val,data;  
    Object.keys(obj).forEach(function(key){  
         keys = key.split('.');  
         val = obj[key];  
         data = that.$data;  
         keys.forEach(function(key2,index){  
             if(index+1 == keys.length){  
                 that.$set(data,key2,val);  
             }else{  
                 if(!data[key2]){  
                    that.$set(data,key2,{});  
                 }  
             }  
             data = data[key2];  
         })  
    });  
}  
  1. 把之前頁面的wxml內容複製到vue文件的template下的view下,然後執行如下改動
屬性綁定從 attr="{{ a }}",改爲 :attr="a"
title="複選框{{ item }}" 改爲 :title="'複選框' + item"
事件綁定從 bind:click="toggleActionSheet1" 改爲 @click="toggleActionSheet1"
阻止事件冒泡 從 catch:tap="xx" 改爲 @tap.native.stop="xx"
wx:if 改爲 v-if
wx:for="{{ list }}" wx:key="{{ index }}" 改爲`v-for="(item,index) in list"
  1. 微信小程序自定義組件處理
    之前引入的自定義組件,需要放到wxcomponents下,並在pages.json裏註冊。如果這裏有js,並且被其他代碼引入,要注意修改引用代碼的路徑指向。如下:
{
    "pages": [ //pages數組中第一項表示應用啓動頁,參考:https://uniapp.dcloud.io/collocation/pages
        {"path": "pages/dashboard/dashboard"},
        {
            "path": "pages/action-sheet/action-sheet",
            "style":{
                "navigationBarTitleText":"ActionSheet 上拉菜單",
                "usingComponents":{ //這裏單頁面引入action-sheet組件
                    "van-action-sheet": "/wxcomponents/vant/action-sheet/index"
                }
            }
        }
    ],
    "globalStyle": {
        "navigationBarTitleText": "Vant For Uni-app",
        "usingComponents": { //這裏給所有頁面全局引入瞭如下組件
            "demo-block": "/wxcomponents/vant/demo-block/index",
            "van-button": "/wxcomponents/vant/button/index",
            "van-cell": "/wxcomponents/vant/cell/index",
            "van-cell-group": "/wxcomponents/vant/cell-group/index",
            "van-icon": "/wxcomponents/vant/icon/index",
            "van-loading": "/wxcomponents/vant/loading/index",
            "van-toast": "/wxcomponents/vant/toast/index"
        }
    }
}

輔助工具

str = str.replace(/bindtap/g, '@onclick');
str = str.replace(/wx:if/g, 'v-show');
str = str.replace(/src=\'\{\{/g, ":src='");
str = str.replace(/wx\:key=\"\*this\"/g, ' ');
str = str.replace(/wx\:key\=\"index\"/g, ' ');
str = str.replace(/wx:for="{{/g, v-for= "(item,index) in ');
str = str.replace(/bindinput/g, '@input'); 

wx.是否要替換爲uni.?

關於js api中的wx.,不要全局替換爲uni.。因爲有的wx的api是微信獨有的,替換爲uni後,反而在微信下沒法用了。

同時uni-app編譯器提供了把wx.編譯爲不同平臺的機制,所以直接使用wx.的api完全可以正常在各端運行。

所以對於老代碼,替不替換不重要,不影響運行,隻影響語法提示和轉到定義。

但是新寫的代碼,還是要用uni.的api,在代碼提示、轉到定義方面更強大。

服務相關代碼轉換

登陸、支付、推送、定位、地圖等服務都是聯網服務,它們不止是客戶端代碼轉換就可以直接運行的。涉及服務器接口和配置兩方面的工作。

uni-app在客戶端側提供了統一的代碼,比如uni.login、uni.requestPayment,在不同端均可以實現登陸、支付。

但服務器端的接口不一樣,比如微信的App支付和小程序支付的申請開通、服務器接口都不一樣,所以配置和服務器接口仍需單獨處理。

比如把小程序轉換uni-app後,需要打包發佈爲app,則需要向微信申請app支付的資質,拿到appkey等信息,填寫到uni-app工程的 manifest-app -> sdk配置 -> 微信支付 下面,然後打包才能成效(如果是離線打包,參考離線打包的文件)。同時服務器需要按照微信的App支付的接口再開發對接。

同樣微信小程序裏內置的定位、地圖,在app上,需要單獨向高德等三方服務商申請,否則無法在app裏使用這些服務。

這些sdk申請方式在 manifest -> app sdk配置 下有教程鏈接。

其他注意

文章來源: https://yq.aliyun.com/articles/703548

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章