微信小程序开发技巧总结 (一)-- 数据传递和存储

结合自己在平时的开发中遇到的各种问题,和浏览各种问题的解决方案总结出一些自己在日常开发中常用的技巧和知点,希望各位不吝斧正。

1.短生命周期数据存储

以小程序启动到彻底关闭为周期的的数据建议存储在app.js文件夹中,引用app.js:

const app =getApp();

假设Value是在小程序本次生命周期中经常使用到的一个数据,比如说请求API的Token,动态的令牌等。那么就可以把这个值赋值到全局变量中去。实际上,并不是只有app.js中的globalData是全局变量,可以自己定义数据集。

App({
  eduOS:{
    token:''
  },
  ...
})

对于app.js里面的token进行赋值操作很简单,只要页面引用了app.js

app.eduOS.token = Value;

这个数据在小程序的本次启动到彻底关闭后台的周期中就是长期存在的了,还可以根据需要进行修改,Value可以是对象。

2.长生命周期或者隐私数据存储

这种数据的显著特点是在小程序关闭再次重启后依然存在,或者涉及到用户的隐私信息但是需要复用,这种时候可以用本地缓存来解决这种问题。

本地缓存的生命周期: 小程序被开始使用 -----> 小程序被彻底从使用列表中移除。

小程序设置缓存的方式:

wx.setStorage({
            key: 'educookie',
            data: {
              xh: that.data.xh,
              pwd: that.data.pwd
            }
          })

小程序获取缓存的方式:

 var that = this;
 wx.getStorage({
      key: 'educookie',
      success: function(res) {
        that.setData({xh:res.data.xh,pwd:res.data.pwd});
      },
    })

比如保存用户的登陆态信息,但是不能保存用户的隐私数据,就可以采用这种方式。

或者是一个非时效性的数据,可以通过这种方式进行存储。

3.动态信息或配置信息存储

保存用户的配置信息,在更换手机时能迅速完成配置同步。

商家小程序推荐商品修改,或者是内容修正,或者是增加活动,不可能每次都要重写然后再次让小程序进行审核。

对此,可以在后端服务器中保存这个信息。

以一个小程序的轮播广告牌为例:

{
 ad1:'imgurl1',
 ad2:'imgurl2',
 ad3:'imgurl3'
}

把这个数据存放在后台服务器,每一次刷新该页面都请求一次后台数据,对内容进行修改。

wx.request({
	url:'XXX',
	data:{},
	success(res){
		that.setData({
			adList:res.data
		})
	}
})

类似这种方式,完成对一些数据的动态控制或者是云同步。

4.页面间数据传递

1.url参数化

页面间之间的数据传递一般是简单的,这种类型的数据的生命周期是一次性的,用完即删。

wx.navigatorTo({
	url:'../index/index?param1=value1&param2=value2'
})
//在index页面获取
onLoad(options){
	console.log(options.param1);//value1
}

可以参照Http请求中的Get表单传参方式来写页面之间的传参。

2.storge形式传递

如果需要传送的数据太多,可通过Map<key ,Storge>进行传递,具体内容参考官方文档。

wx.setStorge({
 	key:'xxx',
 	data:mydata
})
//获取
wx.getStorgeSync('')

传递参数只需要传递一个key,在其他界面通过这个key再次去获取本地缓存,对于这种类型的数据,建议使用完后即时的删除缓存。

wx.removeStorage({
  key: 'xxx',
  success(res) {
    console.log(res)
  }
})

3.使用全局变量作为中介

const app = getApp();
page({
	app.globalData.isBackvalue = ture;//确定是返回的值
	app.globalData.tmpData = value;//你要传递的值,也可以设置缓存
})

在返回的页面获取

const app = getApp();
...
onShow(){
  if(app.globalData.isBackValue){
  	this.setData({
  		XXX:app.globalData.tmpData
  	})
  	//或者是通过获取缓存的方法进行赋值
  }
}

4.页面栈

该方法可以对所有入栈的页面进行赋值,有科班的同学可以理解为对树的dfs遍历入栈/出栈,栈内页面均可以进行数据传递。

var allpages = getCurrentPages();//获取全部页面数据
//栈的下标从 0 开始,进入页面第一个加载的页面数据是 allpages[0],当前页面是allpages[allpages.length - 1], 上一个页面是allpages[allpages.length - 2]
var prepagedata = allpages[allpages.length - 2].data;//获取上一页面的数据。
var prepage = allpages[allpages.length - 2];//获取上一页面,包括数据和方法

//设置数据方法
prepage.setData({
	XXX:value //XXX 是上个页面data中的参数,value是要设置的值
})
//调用函数方法,prepage中必须定义callfunction函数才可以调用
prepage.callfunction();

5.通信管道 EventChannel

Tips(如何理解通信管道):可以把该管道当成url或storge传递信息形式的一种,不过是被封装为Object形式了

A页面传递

wx.navigateTo({
      url: 'B页面',
      success:res=>{
        res.eventChannel.emit('channeldata', {name:'kindear'})
      }
})

B页面接收

  onLoad: function (options) {
    let eventChannel = this.getOpenerEventChannel();
    eventChannel.on('channeldata', data => {
      console.log(data)
        //打印成功 {name:'kindear'}
    })
  }

开发联系Q 1025584691

posted @ 2019-05-21 18:39  Kindear  阅读(4853)  评论(0编辑  收藏  举报