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

结合本身在平时的开发中遇到的各类问题,和浏览各类问题的解决方案总结出一些本身在平常开发中经常使用的技巧和知点,但愿各位不吝斧正。javascript

1.短生命周期数据存储java

以小程序启动到完全关闭为周期的的数据建议存储在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.长生命周期或者隐私数据存储cookie

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

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

小程序设置缓存的方式:this

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

相关文章
相关标签/搜索