微信小程序 开发经验整理


Posted in Javascript onFebruary 15, 2017

微信小程序 开发经验整理

前言:

最近小程序出来了,公司也要求我们开发一款小程序。

于是,就开始着手做了,做了差不多一周吧,也遇到了很多问题,这里就来总结一下。(主要是从一个Android开发者的角度来述说的,可能比较零碎的一些知识点和经验,如果大家还有补充,欢迎)

总结

1:传参,方法判断

js中 方法中可以传递一个方法作为形参,在java中是不可以的。比如start项目中的

getUserInfo:function(cb){
 var that = this
 if(this.globalData.userInfo){
  typeof cb == "function" && cb(this.globalData.userInfo)
 }else{
  //调用登录接口
  wx.login({
   success: function () {
    wx.getUserInfo({
     success: function (res) {
      that.globalData.userInfo = res.userInfo
      typeof cb == "function" && cb(that.globalData.userInfo)
     }
    })
   }
  })
 }
},

这里就是传递一个形参,cb的方法,并且这里还有一个很巧妙的判断方法

typeof cb == "function" && cb(that.globalData.userInfo)

利用的&&的运算规律,首先判断cb是不是一个方法, 这里的==可以作为类型是否相当的判断,然后在&&中如果前面的不满足,后面的则不会执行;如果是cb是一个方法,调用cb方法,并且传入success成功回调的userinfo参数

还有一点,if(this.globalData.userInfo) 可以作为是否为null的判断条件,在java中不可以。

2:log打印

log的打印,如果直接打印“”+变量 是不可以的,因为人家没有toString()方法

X console.log("info"+info);

所以只能分开打印

console.log("info");
console.log(info);

3: json取对象

json的使用,可以通过 json["key"]来取其子对象

person: {
   name: "jafir",
   age: "11",
}
var name = person["name"];
var age = person["age"];
info: {persons:[{name:"123",age:11},{name:"jafir1",age:12}]}
//如果有数组 通过这种方法获取
 console.log(that.data.info["persons"][1].name)
 console.log(that.data.info["persons"][1].age)

 4:定义boolean类型值

要注意如果在page的data中要定义一个boolean类型的值,必须是 isSuccess : true而不是 isSuccess :"true"

if (this.data.isSccess) {
   console.log("true")
  } else {
   console.log("false")
  }

因为如果是isSucees : "true" ,结果为true,没问题,但是如果是isSucess:"false",结果依旧为true,

因为这里的isSuccess不是boolean,而是一个非空类型,既然非空,if就是为true

如果,默认undefined,if则为false

5:使用"that"

建议在 page{}外面定义一个that变量,然后在onLoad中赋值为this,以后所有的地方,都可以使用that,这样就避免有些地方,this并不是指向page的上下文对象

//上下文对象
var that;
page({
 onLoad: function (options) {
  // 页面初始化 options为页面跳转所带来的参数
  that = this;
 }

...
that.setData({
    xxx: xxx,
   })
})

6:page的生命周期方法

  1. 只有onload中有options参数,可以获取页面传值等等,onload只会执行一次
  2. 但是onShow可以每次切换页面的时候执行,所以,需要每次刷新页面的数据请求,可以放在onShow中,测试过,性能体验基本无影响
  3. page的生命周期没有Android那么丰富,页面之间传值也有一定的限制。
  4. 可以通过普通的url的传值方式传值,xxx?key = value ,但是要注意:我们传的值其实是相当于字符串和url拼接在一起,请不要直接传一个对象,因为对象没有toString方法。

传递json对象的步骤为:

1.把json对象变成字符串,如果本身就是那就直接用,如果是json对象,需要 parseString(json)

2.和url进行参数拼接?key=value

3.取得时候在onload的options里面取出,

onLoad: function (options) {
var value= options.key
}

然后JSON.stringify(value)转为json对象使用

7: 页面间跳转

从主页跳转一个新的界面 新界面处理完逻辑 成功与否 结束之后怎么通知 主页结果?
这种情况,一般是没有办法解决的。经过测试,如果你想要从二级非主页界面直接navigator打开主页,是不行的,会报错。

所以,我们采用的策略是:二级界面处理完数据之后,直接返回,然后在主页界面重新拉取数据。所以会出现,我们的请求接口是在onShow方法里面执行的。因为onload只会执行一次

8:wxml

1.text标签可以使用bindtap

<image src="{{logoUrl?logoUrl:'../../img/paihao.png'}}"></image>

可以使用这种方式来显示默认的图片

3.再强调一下 在标签中使用data-xx-oo ="value",在对应对象中可以通过e.currentTarget.dataset.xxOo获得,这里的xx-oo ,-其实是会转义驼峰。这种一般使用场景为 你可以给你所点击或者绑定事件的view设置一个数据,比如你一个picker里面有5个view,就可以绑定每个view不同的值,在触发事件的时候取到相应的值

4.如果你想要显隐view你可以通过wx:if="true/false"来处理,但是这样的话,如果为false,page不会去渲染这个view,它所在的位置空间也不会预留,假如下面的view就会往上排。如果想要留存它的位置空间,可以修改其style样式来解决

style="visibility:{{isShow?'visible':'hidden'}}"

9:统一网络请求处理结果

你可以封装一下网络请求的返回结果,做统一处理

requestWithGet: function(paramsData) {
 data.method = 'GET'
 this.requestInternal(paramsData)
},
requestWithPost: function(paramsData) {
 data.method = 'POST'
 this.requestInternal(paramsData)
},
requestInternal: function (paramsData) {
 var that = this;
 console.log('requestInternal: 开始请求接口[' + paramsData.url + ']');
 //开始网络请求
 wx.request({
  url: paramsData.url,
  data: paramsData.data,
  method: paramsData.method,
  success: function (res) {
   console.log('requestInternal: 接口请求成功[' + paramsData.url + ']');
   paramsData.success(res);
  },
  fail: function (res) {
   console.log('requestInternal: 接口请求失败[' + paramsData.url + ']');
   console.log(res);
   ////在这里做请求失败的统一处理
   wx.showToast({
    title: '网络访问失败',
    duration: 1500
   })
   typeof paramsData.fail == "function" && paramsData.fail(res);
  },
  complete: function (res) {
//在这里做完成的统一处理
   typeof paramsData.complete == "function" && paramsData.complete(res);
  }
 })
}

这样在使用请求的时候,可以直接先wx.request({}) 这样,就可以IDE给你联想生成对应的请求格式,然后直接把“wx.request” 替换 “requestWithGet”或者“requestWithPost”就OK了

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
jquery操作select option 的代码小结
Jun 21 Javascript
javascript制作的网页侧边弹出框思路及实现代码
May 21 Javascript
javascript实现仿IE顶部的可关闭警告条
May 05 Javascript
JavaScript获取数组最小值和最大值的方法
Jun 09 Javascript
jQuery上传多张图片带进度条样式(DEMO)
Mar 02 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
Apr 07 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
May 19 Javascript
JS实现搜索关键词的智能提示功能
Jul 07 Javascript
使用vue中的v-for遍历二维数组的方法
Mar 07 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 Javascript
Angular中sweetalert弹框的基本使用教程
Jul 22 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
Aug 08 Javascript
bootstrap table操作技巧分享
Feb 15 #Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
Feb 15 #Javascript
JS原型与原型链的深入理解
Feb 15 #Javascript
js中数组插入、删除元素操作的方法
Feb 15 #Javascript
jQuery中on方法使用注意事项详解
Feb 15 #Javascript
防止重复发送 Ajax 请求
Feb 15 #Javascript
Input文本框随着输入内容多少自动延伸的实现
Feb 15 #Javascript
You might like
PHP array_multisort()函数的使用札记
2011/07/03 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
javascript页面加载完执行事件代码
2014/02/11 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
深入学习JavaScript对象
2015/10/13 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
基于javascript的Form表单验证
2016/12/29 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
redux中间件之redux-thunk的具体使用
2018/04/17 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
将Python代码打包为jar软件的简单方法
2015/08/04 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
python批量修改文件名的示例
2020/09/27 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
Missguided美国官网:英国时尚品牌
2018/01/18 全球购物
英国版MAC彩妆品牌:Illamasqua
2018/04/18 全球购物
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
Java中实现多态的机制是什么?
2014/12/07 面试题
员工保密协议书
2014/09/27 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
对领导班子的意见和建议
2015/06/08 职场文书
详解分布式系统中如何用python实现Paxos
2021/05/18 Python