微信小程序转uniapp以及插件转换后的常见错误

时间:2024-10-07 14:04:27

微信小程序的语法,其实是语法的裁剪定制版,在数据绑定、自定义组件等很多方面都有相似之处。

微信小程序怎么转uniapp

方法一:miniprogram-to-uniapp 插件

推荐使用HBuilderX插件miniprogram-to-uniapp v2 - DCloud 插件市场,直接转换小程序到uni-app

需要注意的是:这个插件依赖于uniapp的编辑工具Hbuilder,也就是使用这个插件需要先安装Hbuilder

 1.启动Hbuilder,点击插件右侧 “使用HBuilderX 导入插件”,等待Hbuilder安装成功的提示

 2.在Hbuilder导入微信小程序

3.在对应的小程序项目上点击右键,选择菜单:miniprogram to uniapp v2,会自动出现转换进度,完成了提示转换后的uniapp目录保存在了一个新目录下,重新按新项目导入即可。

 

但是转换后的小程序总是莫名出现一些bug,以下就是整理的遇到的常见错误:(通常在文件内搜索关键词进行定位即可)

1.wxParse插件更改导致

const undefined;

2.键值中增加了空格,会导致页面页面元素值显示不出来

data[" name"].values

数组转换不完全

部分 无法正常转换为 this. 格式,建议手动查询一遍

转换不完全

'/images/ -> '/static/images/
"/images/ -> "/static/images/

5.表单默认内容显示true

placeholder=" "

方法二:客户端代码手动转换

1.新建一个uni-app项目,把之前的、的代码,挪到里,分别放到script和style节点下面
如果其中有globalData等全局变量或方法,也直接放到的script下:

  1. export default {
  2. globalData: {
  3. text: 'text'
  4. },
  5. onLaunch: function() {
  6. console.log('App Launch')
  7. }
  8. }

读取globalData或赋值的方法是getApp(). = 'test'

2.转换为,把每个小程序page目录下的(或页面名称对应的json)里的配置取出来,放到的style下

下每个页面目录放一个vue空文件模板

4.把之前页面的wxss内容复制到vue文件的style中,无需改动

5.把之前页面的js内容复制到vue文件的script中,然后执行如下改动

5.1 之前js里面的data,放到新的data return下

  1. //之前
  2. Page({
  3. data: {
  4. show1: false
  5. }
  6. })
  7. //现在
  8. <script>
  9. export default {
  10. data() {
  11. return {
  12. show1: false
  13. }
  14. }
  15. }
  16. </script>

5.2 之前js里面的自定义方法,放到新的method下

  1. 之前
  2. Page({
  3. toggleActionSheet1() {
  4. ({show1: true});
  5. }
  6. })
  7. 现在
  8. <script>
  9. export default {
  10. methods: {
  11. toggleActionSheet1() {
  12. 1 = true
  13. }
  14. }
  15. }
  16. </script>

5.3 之前js里面的生命周期函数onLoad、onShow等,直接放到export default下

之前

  1. Page({
  2. onLoad() {
  3. console.log("page load");
  4. }
  5. })

现在

  1. <script>
  2. export default {
  3. onLoad() {
  4. console.log("page load");
  5. }
  6. }
  7. </script>

 

 

5.4 setdata的处理方式
方式一:从 ({loading: false,areaList: }) 改为 = false; =
方式二:重写setdata方法,如下

  1. setData:function(obj){
  2. let that = this;
  3. let keys = [];
  4. let val,data;
  5. Object.keys(obj).forEach(function(key){
  6. keys = key.split('.');
  7. val = obj[key];
  8. data = that.$data;
  9. (function(key2,index){
  10. if(index+1 == keys.length){
  11. that.$set(data,key2,val);
  12. }else{
  13. if(!data[key2]){
  14. that.$set(data,key2,{});
  15. }
  16. }
  17. data = data[key2];
  18. })
  19. });
  20. }

 

6.把之前页面的wxml内容复制到vue文件的template下的view下,然后执行如下改动

  • 属性绑定从
    attr="{{ a }}",改为 :attr="a"
    title="复选框{{ item }}" 改为 :title="'复选框' + item"
  • 事件绑定从 bind:click="toggleActionSheet1" 改为 @click="toggleActionSheet1"
  • 阻止事件冒泡 从 catch:tap="xx" 改为 @="xx"
  • wx:if 改为 v-if
  • wx:for="{{ list }}" wx:key="{{ index }}" 改为`v-for="(item,index) in list"

7.微信小程序自定义组件处理
之前引入的自定义组件,需要放到wxcomponents下,并在里注册。如果这里有js,并且被其他代码引入,要注意修改引用代码的路径指向。如下:

  1. {
  2. "pages": [ //pages数组中第一项表示应用启动页,参考:https:///collocation/pages
  3. {"path": "pages/dashboard/dashboard"},
  4. {
  5. "path": "pages/action-sheet/action-sheet",
  6. "style":{
  7. "navigationBarTitleText":"ActionSheet 上拉菜单",
  8. "usingComponents":{ //这里单页面引入action-sheet组件
  9. "van-action-sheet": "/wxcomponents/vant/action-sheet/index"
  10. }
  11. }
  12. }
  13. ],
  14. "globalStyle": {
  15. "navigationBarTitleText": "Vant For Uni-app",
  16. "usingComponents": { //这里给所有页面全局引入了如下组件
  17. "demo-block": "/wxcomponents/vant/demo-block/index",
  18. "van-button": "/wxcomponents/vant/button/index",
  19. "van-cell": "/wxcomponents/vant/cell/index",
  20. "van-cell-group": "/wxcomponents/vant/cell-group/index",
  21. "van-icon": "/wxcomponents/vant/icon/index",
  22. "van-loading": "/wxcomponents/vant/loading/index",
  23. "van-toast": "/wxcomponents/vant/toast/index"
  24. }
  25. }
  26. }

微信自定义组件虽然可以这样转换。但转换后只能用于微信和App。如果想用于支付宝百度头条,则需要新建swancomponents等目录,将微信自定义组件复制到这些目录,改造测试。虽然各小程序平台均支持自定义组件,但细节有差异,仍需自己测试。无论如何,H5端不支持这些自定义组件。
比较妥善的跨端做法,是在uni-app插件市场寻找类似功能的vue组件,废弃之前的小程序自定义组件。