第一次发帖 不晓得写些啥  就说说我和我的微信小程序吧

之前始终对微信小程序有趣味 空余工夫做了模拟 永辉生存做了个便利店 而后悲催的发现个体号不能用领取接口什么的 一下索然无味 而后 删了~

对!删了 而后 过了良久 又想玩玩 而后  又做了个记账的小程序 因为文档太干燥 就 边做边查  想到点什么 就加上去  当初根本成型,我就说说 我在这过程中遇到的一些坑死我这个小白的问题吧  要是有大佬们有什么骚操作和 倡议 务必留个言 让我排汇一下子哈

一.tabBar

1.自定义导航栏首先小程序底部导航栏; 官网的是在app.json外面对立配置和治理的;然而它 并不反对自定义点击事件 

解决办法: 先把app.json 中tabBar的配置项 =>   "custom": true, 这样就使原生的导航栏生效 默认读取custom-tab-bar/index

这个就须要本人去创立写啦具体看这个[https://developers.weixin.qq....]

而后这个形式须要1先做个自定义的tabBar组件;2.每个须要的导航页引入该组件 3.每个导航页的onshow 执行跳转函数。至于那个自定义点击事件就 在tabBar外面实现。

2.导航页边组件。

有一说一哈 我感觉自定义导航栏好麻烦  而后我最近又把他改掉了

先新建个新的页面四件套 wxml外面实现tabBar的展现 之上则是依据条件加载不同的组件 ,这些组件就是原先的导航页 改的(这个改的很省事)

是这样的

1.  <!--index.wxml-->    2.  <home  id="component" wx:if="{{PageCur=='home'}}"></home>    3.  <canvasInfo  id="component" wx:if="{{PageCur=='canvasInfo'}}"></canvasInfo>    4.  <new id="component" wx:if="{{PageCur=='new'}}"></new>    5.  <count id="component" wx:if="{{PageCur=='count'}}"></count>    6.  <wd id="component" wx:if="{{PageCur=='wd'}}"></wd>    8.  <view class="cu-bar tabbar {{skin}} shadow foot">    9.    <view class="action" bindtap="NavChange" data-cur="home">    10.      <view class='cuIcon-cu-image'>    11.        <image src="/images/明细{{PageCur=='home'?'':'1'}}.png"></image>    12.      </view>    13.      <view class="{{PageCur=='home'?'text-green':'text-gray'}}">明细</view>    14.    </view>    16.  </view>    17.  <!--index.json-->    18.  {    19.    "usingComponents": {    20.      "home": "/pages/home/index",    21.      "canvasInfo": "/pages/canvasInfo/canvasInfo",    22.      "new": "/pages/new/new",    23.      "count": "/pages/count/count",    24.      "wd": "/pages/wd/wd"    26.    }    27.  }    28.  <!--index.js-->    29.  data: {    30.      PageCur: 'home',    31.      skin: app.globalData.skin,    32.    },    33.    NavChange(e) {    34.      var a = e.currentTarget.dataset.cur    35.      if (a == "new" ) {    36.        if (!getApp().globalData.isAuthorize) {    37.          console.log("用户没有受权");    38.          wx.navigateTo({    39.            url: '/pages/getWxUserInfo/getWxUserInfo',    40.          })    41.          return    42.        }    43.        wx.navigateTo({    44.          url: "/pages/" + a + "/" + a    45.        })    46.        return;    47.      }    48.      this.NavChange1(a)    49.    },    50.    NavChange1(e) {    51.      this.setData({    52.        PageCur: e    53.      })    54.      let myComponent = this.selectComponent('#component'); // 页面获取自定义组件实例    55.      console.log(myComponent)    56.      myComponent.onLoad(); // 通过实例调用组件事件    57.      myComponent.onShow();    59.    },    

二.皮肤

嫌着蛋疼 没想出新性能的时候就想到些花里胡哨的玩意儿,换肤性能

刚刚开始都想哭了因为最早页面款式我想写的到处都是 整顿死我了

大体这样:

1.将全副须要受到换肤影响的元素都找进去

2.在每个页面js的data中减少一个skin(名字你随便)作为 1中的className (一个皮肤不同地位有不同的的款式 那就多配几个)

3减少一个wxss文件 外面写好所有的皮肤款式 款式为类选择器 类名用用于skin赋值

4.app.js中globalData也新增skin(用于每个页面skin默认值) ,并新增一个设置相应界面skin值的函数setSkin(that){}

5.提供一个抉择皮肤的性能,抉择对应的皮肤后  将所选的skinName 存入缓存(为了继续失效) 后调用app.js的setSkin函数 setSkin函数通过获取缓存中的数据 为相应页面skin赋值

5.在每个页面的onshow中 调用app.js的setSkin(that){}函数为skin赋值

1.  <!--app.js-->    2.    globalData: {    3.      skin: "normal-skin",    4.      tab1:'normal-skin-tab1',    5.      tab2:'normal-skin-tab2',    6.    },    7.    setSkin:function(that){    8.      wx.getStorage({    9.       key: 'skin',    10.       success: function(res) {    11.         if(res){    12.           console.log(res)    13.           that.setData({    14.            skin: res.data,    15.            tab1:res.data+'-tab1',    16.            tab2:res.data+'-tab2',    17.          })   }     }   })  }    19.  <!--index.html-->    21.  <view class="{{skin}}" style="height:100%; width:100%"></view>    23.  <!--setskin.js-->    24.   data: {    25.      CustomBar: app.globalData.CustomBar,    26.      StatusBar: app.globalData.StatusBar,    27.      skin: app.globalData.skin,    28.      skinList: [    29.        { 'name': '默认', 'val': 'normal-skin' },    30.        { 'name': '彩色', 'val': 'dark-skin' },    31.        { 'name': '粉色', 'val': 'red-skin' },    32.        { 'name': '黄色', 'val': 'yellow-skin' },    33.        { 'name': '绿色', 'val': 'green-skin' },    34.        { 'name': '灰色', 'val': 'cyan-skin' },    35.        { 'name': '蓝色', 'val': 'blue-skin' },    36.      ]}    37.  ,  //换肤    38.    setSkin: function (e) {    39.      console.log('=================setSkin=======================')    40.      var skin = e.target.dataset.flag;    41.      console.log(skin)    42.      app.globalData.skin = skin    43.      this.setData({    44.        skin: skin,    45.        openSet: false    46.      })    48.      wx.setStorage({    49.        key: "skin",    50.        data: skin    51.      })    52.      app.setSkin(this);    53.      this.hideModal()    54.      app.setSkin(getCurrentPages()[0])    56.    }, 

三.一些通用小函数

1.  function formatTime(date) {    2.    var year = date.getFullYear()    3.    var month = date.getMonth() + 1    4.    var day = date.getDate()    6.    var hour = date.getHours()    7.    var minute = date.getMinutes()    8.    var second = date.getSeconds()    9.    return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')    10.  }    11.  function formatNumber(n) {    12.    n = n.toString()    13.    return n[1] ? n : '0' + n    14.  }    15.  //2020-11-20 转为Unix    16.  function dateStrToUnix(date) {    17.    date = date.substring(0, 19);    18.    date = date.replace(/-/g, '/'); //必须把日期'-'转为'/'    19.    return new Date(date).getTime();    20.  }    21.  function unixToDateStr(timestamp) {    22.    var d = new Date(timestamp);    //依据工夫戳生成的工夫对象    23.    return (d.getFullYear()) + "/" +    24.      (d.getMonth() + 1) + "/" +    25.      (d.getDate()) + " "    26.  }    27.  function weekAndday(dates) {    28.    let date = new Date(dates);    30.    return weekAnddayByDate(date);    31.  }    32.  function weekAnddayByDate(date) {    33.    let dateObj = {};    34.    let show_day = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];    35.    date.setDate(date.getDate());    36.    let day = date.getDate();    37.    let yearDate = date.getFullYear();    38.    let month = ((date.getMonth() + 1) < 10 ? (date.getMonth() + 1) : date.getMonth() + 1);    39.    let dayFormate = (date.getDate() < 10 ? + date.getDate() : date.getDate());    40.    dateObj.time = yearDate + "-" + month + "-" + dayFormate;    41.    dateObj.week = show_day[date.getDay()];    42.    dateObj.day = day;    43.    dateObj.year = yearDate;    44.    dateObj.month = month;    45.    return dateObj;    46.  }    47.  // 除法函数    48.  function accDiv(arg1, arg2) {    49.    var t1 = 0, t2 = 0, r1, r2;    50.    try { t1 = arg1.toString().split(".")[1].length } catch (e) { }    51.    try { t2 = arg2.toString().split(".")[1].length } catch (e) { }    53.    r1 = Number(arg1.toString().replace(".", ""));    55.    r2 = Number(arg2.toString().replace(".", ""));    56.    return (r1 / r2) * Math.pow(10, t2 - t1);    57.  }    58.  // 乘法函数    59.  function accMul(arg1, arg2) {    60.    var m = 0,    61.      s1 = arg1.toString(),    62.      s2 = arg2.toString();    63.    try { m += s1.split(".")[1].length } catch (e) { }    64.    try { m += s2.split(".")[1].length } catch (e) { }    65.    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)    66.  }    67.  //减法函数    68.  function accSub(arg1, arg2) {    69.    var r1, r2, m, n;    70.    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }    71.    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }    72.    m = Math.pow(10, Math.max(r1, r2));    73.    //last modify by deeka    74.    //动静控制精度长度    75.    n = (r1 >= r2) ? r1 : r2;    76.    return ((arg1 * m - arg2 * m) / m).toFixed(n);    77.  }    78.  /*用来失去准确的加法后果    79.  *阐明:javascript的加法后果会有误差,在两个浮点数相加的时候会比拟显著。这个函数返回较为准确的加法后果。    80.  *调用:accAdd(arg1,arg2)    81.  *返回值:arg1加上arg2的准确后果    82.  */    83.  function accAdd(arg1, arg2) {    84.    var r1, r2, m;    85.    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }    86.    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }    87.    m = Math.pow(10, Math.max(r1, r2))    88.    return (arg1 * m + arg2 * m) / m    89.  }    91.  //给Number类型减少一个add办法,调用起来更加不便。    92.  Number.prototype.add = function (arg) {    93.    return accAdd(arg, this);    94.  }    95.  //计算明天是往年第几周    96.  function getWeek(y, m, d) {    97.    let day1 = new Date(y, parseInt(m) - 1, d);    98.    let day2 = new Date(y, 0, 1);    99.    let day = Math.round((day1.valueOf() - day2.valueOf()) / 86400000);    100.    return Math.ceil((day + ((day2.getDay() + 1) - 1)) / 7)    101.    // console.log(y+"+"+m+"+"+d)    102.    // var arr=whichWeek(y);    103.    // console.log(arr)    105.    // for(var i=0;i<arr.length;i++){    106.    //     if(arr[i].month==m&&arr[i].date<=d&&((arr[i].last.month==m&&arr[i].last.date>=d)||(arr[i].last.month>m))){    107.    //       return i+1    108.    //     }    109.    // }    110.  }    112.  //工夫戳转年月日  参数是秒的工夫戳 函数返回一个对象 对象里有年 月 日    113.  function yearDay(long) {    114.    var time = new Date(long * 1000)    115.    var year = time.getFullYear();    116.    var month = (time.getMonth() + 1) < 10 ? '0' + (time.getMonth() + 1) : (time.getMonth() + 1);    117.    var date = time.getDate() < 10 ? '0' + time.getDate() : time.getDate();    118.    var yearday = { year, month, date }    119.    return yearday    120.  }    121.  //计算一年中的每一周都是从几号到几号    122.  //第一周为1月1日到 本年的 第一个周日    123.  //第二周为 本年的 第一个周一 往后推到周日    124.  //以此类推 再往后推52周。。。    125.  //如果最初一周在12月31日之前,则本年有垮了54周,反之53周    126.  //12月31 日不论是周几,都算为本周的最初一天    127.  //参数年份 ,函数返回一个数组,数组里的对象蕴含 这一周的开始日期和完结日期    128.  function whichWeek(year) {    129.    var d = new Date(year, 0, 1);    130.    while (d.getDay() != 1) {    131.      d.setDate(d.getDate() + 1);    132.    }    133.    let arr = []    134.    let longnum = d.setDate(d.getDate())    135.    if (longnum > +new Date(year, 0, 1)) {    136.      let obj = yearDay(+new Date(year, 0, 1) / 1000)    137.      obj.last = yearDay(longnum / 1000 - 86400)    138.      arr.push(obj)    139.    }    140.    let oneitem = yearDay(longnum / 1000)    141.    oneitem.last = yearDay(longnum / 1000 + 86400 * 6)    142.    arr.push(oneitem)    143.    var lastStr    144.    for (var i = 0; i < 51; i++) {    145.      let long = d.setDate(d.getDate() + 7)    146.      let obj = yearDay(long / 1000)    147.      obj.last = yearDay(long / 1000 + 86400 * 6)    148.      lastStr = long + 86400000 * 6    149.      arr.push(obj)    150.    }    151.    if (lastStr < +new Date(year + 1, 0, 1)) {    152.      let obj = yearDay(lastStr / 1000 + 86400)    153.      obj.last = yearDay(+new Date(year + 1, 0, 1) / 1000 - 86400)    154.      arr.push(obj)    155.    } else {    156.      arr[arr.length - 1].last = yearDay(+new Date(year + 1, 0, 1) / 1000 - 86400)    157.    }    158.    return arr    159.  }    160.  // 是否是数组    161.  function isArray(obj){    162.    return (typeof obj=='object')&&obj.constructor==Array;    163.    }    164.  const getDaysInMonth = (year, month) => {    165.    let date = new Date(year, month, 1);    166.    return new Date(date.getTime() - 864e5).getDate();    167.  }    168.  // 俩个工夫距离    169.  function subTime(startTime,endTime) {// 工夫new Date('2018-1-1')    170.    console.log(endTime - startTime); // 毫秒数    171.    console.log(Math.floor((endTime - startTime) / 1000)); // 秒数    172.    console.log(Math.floor((endTime - startTime) / 1000 / 60)); // 分钟    173.    console.log(Math.floor((endTime - startTime) / 1000 / 60 / 60)); // 小时    174.    console.log(Math.floor((endTime - startTime) / 1000 / 60 / 60 / 24)); // 天数    175.  }    176.  // 是否同一天    177.  function isSameDay(startTime, endTime) {    178.    // debugger    179.    const startTimeMs = new Date(startTime).setHours(0,0,0,0);    180.    const endTimeMs = new Date(endTime).setHours(0,0,0,0);    181.    return startTimeMs === endTimeMs ? true : false    182.  }    183.  // 获取元素在数组中地位    185.  module.exports = {    186.    formatTime: formatTime,    187.    dateStrToUnix: dateStrToUnix,    188.    unixToDateStr: unixToDateStr,    189.    weekAndday: weekAndday,    190.    accSub: accSub,    191.    accAdd: accAdd,    192.    accDiv: accDiv,    193.    accMul: accMul,    194.    getWeek: getWeek,    195.    weekAnddayByDate: weekAnddayByDate,    196.    whichWeek: whichWeek,    197.    getDaysInMonth: getDaysInMonth,    198.    isArray:isArray,    199.    isSameDay:isSameDay    200.  } 

四.新版本公布 自动更新

小程序公布之后没做解决的话 得须要用户冷启动才能够获取新的版本 所以须要咱们加个检测机制我是 间接加在了app.js的 onshow页面调用的时候检测是否有新版本有的话弹窗让用户更新重启

 1.    onShow:function(options){    2.      console.log('app.js==================onShow')    3.      //解决小程序更新    4.      this.autoUpdate();    5.      wx.onMemoryWarning(function () {    6.        console.log('onMemoryWarningReceive')    7.        console.log('内存炸了')    8.      })    9.      // wx.BaaS.reportTemplateMsgAnalytics(options)    10.    },    11.    /***    12.   * 小程序更新机制解决    13.   */    14.    autoUpdate(){    15.      let that = this    16.      //获取小程序更新机制兼容    17.      if(wx.canIUse('getUpdateManager')){    18.        //获取全局惟一的版本更新管理器,用于治理小程序更新    19.        let updateManager = wx.getUpdateManager()    20.        //1.查看小程序是否有新版本公布    21.        updateManager.onCheckForUpdate(function(res){    22.          //申请完新版本信息的回调    23.          if(res.hasUpdate){    24.            //2.小程序有新版本,则静默下载新版本,做好更新筹备    25.            updateManager.onUpdateReady(function(){    26.              wx.showModal({    27.                title: '更新提醒',    28.                content: '新版本曾经筹备好,是否重启利用?',    29.                success: function(res) {    30.                  if(res.confirm){    31.                    //3.新的版本曾经下载好,调用 applyUpdate 利用新版本并重启    32.                    updateManager.applyUpdate()    33.                  }else if(res.cancel){    34.                    //如果须要强制更新,则给出二次弹窗;如果不须要,则这里的代码都能够删除    35.                    wx.showModal({    36.                      title: '舒适提醒~',    37.                      content: '本次版本更新波及到新的性能增加,旧版本无奈失常拜访哦',    38.                      success: function(resc) {    39.                        that.autoUpdate()    40.                        return    41.                        //第二次提醒后,强制更新    42.                        if(resc.confirm){    43.                            //新的版本曾经下载好,调用 applyUpdate 利用新版本并重启    44.                            updateManager.applyUpdate()    45.                        }else if(resc.cancek){    46.                          //从新回到版本更新提醒    47.                          that.autoUpdate()    48.                        }    49.                      }    50.                    })    51.                  }    52.                }    53.              })    54.            })    55.            updateManager.onUpdateFailed(function(){    56.              //新的版本下载失败    57.              wx.showModal({    58.                title: '曾经有新版本了哟~',    59.                content: '新版本曾经上线啦~,请您删除以后小程序,从新搜寻关上哟~',    60.              })    61.            })    62.          }    63.        })    64.      }else{    65.        //如果心愿用户在最新版本的客户端上体验您的小程序,能够这样提醒    66.        wx.showModal({    67.          title: '提醒',    68.          content: '以后微信版本过低,无奈应用该性能,请降级到最新微信版本后重试',    69.        })    70.      }      71.    },

五.问题求助

ok当初我有个坑始终没解决想要看看哪个大佬搞得来

我的小程序中引入echarts 用来做图表 我只是用初始化 和setOption()的函数 日常应用失常 然而用小程序开发工具的Audits测评 说是存在定时器未追随页面回收 都是echarts.js外面的 我切实搞不懂这货色 看看哪位大佬帮我解决下

六.分享几个echarts的坑 

1 echarts的图表在开发工具的 真机调试中会报错 这是工具的问题

2.最近发现echarts 的图表 绘制在canvas 2d外面的话 工具上失常  当手机拜访的时候 会间接导致微信闪退(目前不知道咋搞 坐等大佬解决) 解决办法 改用 canvas

 好啦,还有些货色我一时也想不起来先这些啦,上面是我的小程序二维码 感兴趣能够看看 (处女作=>基操勿喷哈)而后心愿大家有什么

好的倡议和骚操作能够共享下哟 拜拜~