在初学微信小程序开发过程中,难免因为不能理解开发文档中一些小细节造成一些难以查找的bug,记录下来供大家交流学习。
(1)this指代这个页面的所有object,但是最好在使用之前用var that = this 把this承接掉,这样在后面的操作中有相同的函数或者变量的时候才不会指代不明。下面这个例子中,最开始定义了一个默认的data,在调用wx.request()时又有一个参数data,如果在调用wx.request()之前就把this存给that,然后下面第二个红框采用,content:that.data.content,就会出现第三个红框的报错信息:VM1956:1 thirdScriptError
Cannot read property 'data' of null;at api showToast complete callback function
TypeError: Cannot read property 'data' of null
因为这里的data可以指页面默认的data,也可以指wx.request()的参数data,造成指代不明。
(2)调用wx.request()函数时,一般都是success,但是fail也会出现,就是没有网络的情况下,这个时候需要在fail回调函数里面添加提示。
(3)调用wx.showLoading()需要注意的是,一般与wx.hideLoading()结合使用,一种是加一定的延时,在延时后取消,即:
setTimeout(function() {
wx.hideLoading()
}, 2000) //2000是延时,单位ms
一种是在回调函数中complete写,这样会在完成调用后消除转圈的loading,逻辑才正确
complete(res) {
console.log('此处处理请求完成的逻辑')
wx.hideLoading()
}
(4)微信小程序中的变量汇总:1)普通页面的变量data,可以直接写在预留的data数据中,采用this.data.**,**表示data定义的变量;2)app.js中的的全局变量globalData,全局变量的访问采用getApp().globalData.**,**就是全局变量;3)过程中的临时变量,采用var定义,例如var x=1,或者var x=‘字符串’;4)传参过程中,在*.wxml文件中用{{}}来传递普通页面的变量data中的参数,采用src="{{variables}}",需要注意的是采用列表渲染的时候,需要刷新或者更新页面,如果逻辑层的数据的修改要显示到视图层,需要调用this.setData({}),否者数据不会显示到视图层,造成页面空白的结果,对比如下:
that.setData({
list: res.data.data//将返回值中的data赋值给列表渲染中的{{list}}变量
})
而如果使用下面这段赋值代码:that.data.list = res.data.data,则结果为:
(5)页面刷新时渲染层和逻辑层的配合,各个页面的切换函数与主页面的监听(* 生命周期函数--监听页面加载*/onLoad: function(options))、渲染等函数配合,包括wx.reLaunch(),wx.navigateTo(),wx.redirectTo(),reLaunch只在页面初次加载的时候调用,这个时候用onLoad()来刷新页面数据就很有效,而如果采用navigateTo,在点返回按钮的时候,需要在onShow()中刷新,onLoad()不再调用,不能在这里写刷新数据的函数。
(6)使用新浪云SAE进行后台数据库的管理时,在代码管理中上传代码需要是zip的压缩包,rar不能识别,另外一定要先实名认证,否者上传代码的时候会报以下错:导入文件失败,错误信息:svn import failed:svn_fs_is_file(): svn error(s) occured 22 (Invalid argument) Valid UTF-8 data (hex: 31 2f 2f 74 72 65 65 68 6f 6c 65 2f) followed by invalid UTF-8 sequence (hex: f0 2d a2 bf)
(7)使用动态渲染的时候,双引号内部的引号需要用单引号,否者会出错,因为编译器是根据第一个双引号作为开始来查到结束的双引号,src="{{itemname.islike == 1 ? '/images/liked.png' : '/images/like.png'}}",另外动态渲染一定要用同一个数组进行渲染,不然会出错
(8)小程序云开发时,从小程序端获取数据库中的数据的时候,显示获取成功,但是数组一直为空,也没有任何错误,这是数据库权限设置的问题,应该设置成:所有用户可读,仅创建者可读写,云函数不需要设置成这样也可以读写,这个是一个非常重要的区别且非常容易犯错,再次强调,小程序云开发时,小程序端和云端获取数据库中的数据权限不一样,小程序端需要的权限大,需要设置:所有用户可读,仅创建者可读写,才可以读取,否者为空,云端则默认设置就可以读写,即:仅创建者可以读写
(9) 在小程序端获取数据库中的数据时,由于数据库数据获取有延时,在有赋值判断的操作过程中,需要将赋值语句放在数据库使用后的complete里面这样判断才会有效,否者在数据还没获取就先进行判断了,小程序并不会按你写的顺序流程进行,例如下面的例子中,去数据库中查找userInfo的信息,如果找到就判定:that.data.isExitwork_id = 1,用做后续if语句的判别条件,但是如果不放在complete中执行if语句,if语句中就会出现that.data.isExitwork_id的值是0(初始赋值),而不是1,从而造成判断错误或者没办法通过判断。
(10)小程序云开发过程中需要批量导入数据到数据库中,我们知道数据库中导出的有2种格式,一种是.csv,一种是.json,如下图:
个人喜欢采用.csv格式来存储数据,因为可以直接用excel打开并编辑,需要多余输入分隔符“,”或者“”,如下图:
但是需要特别注意的是excel打开csv格式保存的时候,会提示:保存的文件格式可能包含有不兼容的功能。这时如果直接上传到小程序云开发的数据库,则英文和数字不会出错,但是中文会出现乱码,这是编码的问题,需要先用Notepad++软件打开,在编码栏设置编码格式为:转为UTF-8编码,保存后上传就可以解决中文乱码问题。
(11)小程序云开发获取数据库中的数据,并下载到本地Excel中,需要注意的文件的缓存有2-3min的存在时间,如果马上切换下一个文件下载,会出现下载的文件是上一次选择的文件,而不是本次最新的文件,这块目前采用的策略是一个文件下载完,等几分钟再切换去下载另一个,虽然比较简陋,但是还没找到好的办法。