javascript基础原理让前端飞微信小程序

总结微信小程序中遇到的一些坑

2017-09-05  本文已影响796人  IOneStar
title
总结微信小程序开发中遇到的坑,一些坑你得一个一个的跳啊,/(ㄒoㄒ)/~~
aboutme
github
blog

1,页面跳转和参数传递实例

首先说一下我遇到的需求
有一个我的消息页面,里面的数据都是后端返回的,返回的数据大致如下,有一个是数据url是要控制跳转到哪个页面,可能是tab页面也可能是非tab页面,但是微信小程序中跳转到tab和非tab页面用的api不是同一个,但是在页面中渲染肯定是要用到循环的,难道要再多个参数来判断是跳转到tab页面还是非tab页面?

[
    {
        "id": 2121,
        "title": "test",
        "body": "test",
        "url": "url",
        "pic": "pic",
        "created_at": "2017-07-01 12:34:56"
    }, {
        "id": 2122,
        "title": "test",
        "body": "test",
        "url": "url",
        "pic": "pic",
        "created_at": "2017-07-01 12:34:56"
    },
]
<view class="mesList" wx:for="{{unReadList}}" wx:key="unique">
    <navigator url="/pages/index?tab=0" hover-class="none" >
        <text>{{item.body}}</text>
        <view class="messageTime">{{item.created_at}}</view>
    </navigator>
</view>

然后再index页面的onload中判断显示哪个tab

onLoad(options) {
    if (options && options.tab) {
        this.tab = parseInt(options.tab);
        this.$apply();
    }
}

2,微信小程序授权处理

3, 登录问题的处理

function getStorage(key) {
    return new Promise(function (resolve, reject) {
        // 先判断本地数据存储有没有cookie
        wx.getStorage({
            key: key,
            success: function (res) {
                resolve(res.data);
            },
            fail: function (res) {
                resolve(null);
            },
        });
    });
}
function setStorage(key, value) {
    return new Promise(function (resolve, reject) {
        wx.setStorage({
            key: key,
            data: value,
            success: function (res) {
                // TODO: 不知道返回什么
                resolve(res.data);
            },
            fail: function (res) {
                reject(res.errMsg);
            },
        });
    });
}

4,wx.getStorage安卓手机上返回的错误信息是getStorage:fail,ios返回getStorage:fail data not found

function getStorage(key) {
    return new Promise(function (resolve, reject) {
        // 先判断本地数据存储有没有cookie
        wx.getStorage({
            key: key,
            success: function (res) {
                resolve(res.data);
            },
            fail: function (res) {
                resolve(null);
                // 下面注释的部分即为刚开始犯的错误,导致有可能ios或安卓或部分机型显示不出数据
                // if (res.errMsg == 'getStorage:fail' || res.errMsg == 'getStorage:fail data not found') {
                //     console.log('没有cookie');
                //     resolve(null);
                // } else {
                //     console.log('这是一个问题');
                //     reject(res.errMsg);
                // }
            },
        });
    });
}

5,小程序解决异步

function login() {
    return new Promise(function (resolve, reject) {
        wx.login({
            success: function (res) {
                resolve(res);
            },
            fail: function (res) {
                reject(res.errMsg);
            },
        });
    });
}

function promiseify(func) {
    return (args = {}) => {
        return new Promise((resolve, reject) => {
            func.call(wx, Object.assign(args, {
                success: resolve,
                fail: reject,
            }));
        })
    }
}
for (const key in wx) {
    if (Object.prototype.hasOwnProperty.call(wx, key) && typeof wx[key] === 'function') {
        wx[`_${key}`] = promiseify(wx[key]);
    }
}

6,怎么保证在调用其他接口之前已经调用过登录的接口了

// html
  <div class="first">按钮一</div>
  <div class="second">按钮二</div>
// js
  const d1 = document.querySelector('.first');
  const d2 = document.querySelector('.second');
  let count = 0; // 用来记录第几次输出
  let isPrint = false; // 是否允许输出
  let arr = []; // 声明一个数组,用来存储

  function clickCount() {
    count++;
    console.log('这是第' + count + '次输出d1');
  }
  d1.onclick = function () {
    console.log(isPrint);
    console.log(arr);
    if (isPrint) {
      if (arr.length === 0) {
        clickCount();
      } else {
        for (let i = 0, len = arr.length; i < len; i++) {
          arr[i]();
        }
      }
    } else {
      arr.push(clickCount);
      console.log('不允许输出');
    }
  };
  d2.onclick = function () {
    isPrint = true;
    console.log(isPrint);
  }

6,小程序问题

7,总结

8,后采用wepy重构小程序遇到的一些坑

wepy文档
1,Q: 怎么在page组件和component组件中回去到getApp(),就是app里面定义的函数,通过this.$parent只能拿到数据,拿不到方法?
A:可以在this.$parent_proto上拿到方法,即this.$parent.onLogin
2, Q:怎么实现按需加载
A:在compoent组件中自定义生命周期函数,并手动触发

上一篇下一篇

猜你喜欢

热点阅读