微信小程序 开发经验整理


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 相关文章推荐
用JavaScript脚本实现Web页面信息交互
Oct 11 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
Dec 19 Javascript
js中replace的用法总结
Dec 27 Javascript
基于javascript实现动态显示当前系统时间
Jan 28 Javascript
javascript中FOREACH数组方法使用示例
Mar 01 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
Sep 16 Javascript
Jquery树插件zTree实现菜单树
Jan 24 Javascript
Angular 2.0+ 的数据绑定的实现示例
Aug 09 Javascript
JS二分查找算法详解
Nov 01 Javascript
vue项目中使用axios上传图片等文件操作
Nov 02 Javascript
js实现随机圆与矩形功能
Oct 29 Javascript
JS常用跨域方法实现原理解析
Dec 09 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下删除字符串中HTML标签的函数
2008/08/27 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
TNC vs BOOM BO3 第三场2.13
2021/03/10 DOTA
Prototype使用指南之form.js
2007/01/10 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
一个jquery实现的不错的多行文字图片滚动效果
2014/09/28 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
js闭包用法实例详解
2016/12/13 Javascript
axios基本入门用法教程
2017/03/25 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
JS中‘hello’与new String(‘hello’)引出的问题详解
2018/08/14 Javascript
vue动态绑定class选中当前列表变色的方法示例
2018/12/19 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
Python MD5加密实例详解
2017/08/02 Python
python difflib模块示例讲解
2017/09/13 Python
python pandas 如何替换某列的一个值
2018/06/09 Python
Django框架封装外部函数示例
2019/05/28 Python
Django工程的分层结构详解
2019/07/18 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
性能测试工程师的面试题
2015/02/20 面试题
2014年社区庆元旦活动方案
2014/03/08 职场文书
小班幼儿评语大全
2014/04/30 职场文书
运动会演讲稿300字
2014/08/25 职场文书
继续教育个人总结
2015/03/03 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
Nginx进程调度问题详解
2021/09/25 Servers
详解Oracle块修改跟踪功能
2021/11/07 Oracle