主机参考:VPS测评参考推荐/专注分享VPS服务器优惠信息!若您是商家可以在本站进行投稿,查看详情!此外我们还提供软文收录、PayPal代付、广告赞助等服务,查看详情! |
我们发布的部分优惠活动文章可能存在时效性,购买时建议在本站搜索商家名称可查看相关文章充分了解该商家!若非中文页面可使用Edge浏览器同步翻译!PayPal代付/收录合作 |
微信小程序如何保证每个页面都已经登录过?本文向你介绍了小程序保证每个页面都登录的方法,希望对你有所帮助!
在一个微信小程序中,有一个主页,一个个人页面,一些列表页面,详情页等。这些页面大部分可以共享。当共享页面被其他用户打开时,该页面如何确保该用户已经登录?
网上有很多方案在请求包中添加一个拦截。如果没有令牌,在继续之前调用登录请求来获取令牌。这个方案没有错。注意一下就好。当一个页面同时有多个请求被触发时,在所有请求被拦截后,把它们放在一个数组中。令牌成功获取后,遍历数组逐个请求就可以了。
但是这个要求有点复杂。比如连锁便利店小程序,大部分页面都需要有店铺(因为需要根据店铺获取当前店铺商品的库存和价格)。这个存储是根据当前定位调用后端接口得到的。这时候再封装在请求里就太麻烦了。
解决办法
首先,我们注意到登陆和获取位置与我们的页面请求是异步的。我们需要保证页面请求是在落地和得到位置之后,但是如果每个页面都写一次,可维护性就太差了。所以我们可以画出一个方法来做这件事。这是代码:
const app = getApp()Page({ data:{ logs:[]},onLoad(){ app . common log in(()= gt;{//处理页面请求}}})这样做看似解决了我们的问题,但是再想想。如果想做更多的事情,比如每页的onShareAppMessage统一处理,但是我不想每页都写一遍。此外,我想自己为每个页面实现一个观察器。我能怎么做呢?
进一步解决方案
我们可以看到微信小程序,每个页面都是一个页面(),所以我们可以在这个页面的外面加一个外壳,可以有一个MyPage来代替这个页面。事不宜迟,上传代码:
Tool.js相关代码
/* * *处理合并参数*/handlepagrammerge(arg){ let numargs = arg . length;//获取传递的参数值。let data = { } let page = { } for(let IX in arg){ let item = arg[IX]if(item . data ; type of(item . data)= = = # 39;对象 # 39;){ data = Object.assign(data,item . data)} if(item . methods ; type of(item . methods)= = = # 39;对象 # 39;){ page = Object.assign(page,Item . methods)} else { page = object . assign(page,Item)} } page . data = data return page }/* * *合并页面方法和数据,兼容{data:{},methods: {}}或{data:{},a:{},B:{ } */Merge page(){ return this。handlepagrammerge(arguments)}/* *流程组件参数merge */handlecomparammer(arg){ let numargs = arg . length;//获取传递的参数值。data = { } let options = { } let properties = { } let methods = { } let comp = { } for(let IX in arg){ let item = arg[IX]//初始数据if(item . data ;type of(item . data)= = = # 39;对象 # 39;){data = object.assign (data,item . data)}//合并属性列表if(item . properties ;type of(item . properties)= = = # 39;对象 # 39;){ properties = object . assign(properties,item . properties)}//if(item . methods ;type of(item . methods)= = = # 39;对象 # 39;){ methods = Object.assign(methods,item . methods)} if(item . options ; type of(item . options)= = = # 39;对象 # 39;){ options = Object.assign(options,item . options)} comp = object . assign(comp,item)} comp . data = data comp . options = options comp . properties = properties comp . Methods = Methods return comp }/* * * Component { properties:{ },options: {},data: {},Methods:{ } */merge Component(){ return this . handlecomparamerge(arguments)}/* * * *与watch */new page(){ let options = this . handlepam gram merge(arguments)let = this let app = get app()//复合页面options . public check log in){ options . public check log in = function(e){ let pages = getCurrentPages()Page = pages[pages . length -1]let dataset = e . current target . dataset let callback = null//如果(dataset.callback type of(page[dataset . callback])= = = ;函数 ){ callback = page[dataset . callback]}//console . log( # 39;回调 gt gt',callback,app.isRegister()) //确定是否登录if(callback ;app . is register()){ callback(e)} else { wx . navigate to({ URL: # 39;/pages/log in/log in # 39;})} } } const { onLoad } = options options . onLoad = function(arg){ options . watch ; set watcher(this)onLoad ; onLoad.call(this,arg)} const { on show } = options options . on show = function(arg){ if(options . data . no autolog in | | app . is register()){ on show ; OnShow.call(this,arg) // page嵌入app . ga({ })} else { wx . navigate to({ URL: # 39;/pages/log in/log in # 39;}}}}返回页面(选项)}/* *用watch等组成组件。*/new component(){ let options = this . handlecompparammerge(arguments)let = this const { ready } = options options . ready = function(arg){ options . watch ; that . set watcher(this)ready ; Ready.call (this,arg)} return component(options)}/* * Set listener */Set watcher(page){ let data = page . data;let watch = page.watchObject.keys(手表)。forEach(v = gt;{ let key = v . split( # 39;。');//使用watch中的属性作为 # 39;。'切入数组let nowData = data//将数据赋给nowData for(设I = 0;我 ltkey . length -1;++){//遍历键数组的元素,除了最后一个!now data = now data[key[I]];//将nowData指向其key属性object } let last key = key[key . length -1];//假设key = = = # 39我的名字 # 39;这时,now data = = data[ # 39;我的 # 39;]===data.my,lastKey = = = # 39姓名 # 39;让watchFun = watch[v]。handler | | watch[v];//兼容有无处理程序两种写法let deep = watch[v]。深沉;//如果没有设置deep,就是未定义this.observe (nowdata,last key,watchfun,deep,page);//监听nowData对象的last key } }/* *监听属性,执行监听函数*/obj,key,watchfun,deep,page){ var val = obj[key];//确定deep为true,val不能为空,typeof val = = = # 39对象 # 39;(数组中值的变化也需要深度监控)if(deep ;瓦尔。= null typeof val = = = # 39对象 # 39;){ Object.keys(val)。forEach(child key = gt;{//遍历val对象下的每个keythis.observe (val,childkey,watchfun,deep,page);//递归调用监听函数})} var that = this;Object.defineProperty(obj,key,{ configurable: true,enumerate:true,Set:function(value){ if(val = = value){ return }//用page对象调用,改变函数中的这个点,使this.data可以访问data中的属性值watchFun.call(page,value,val);// value是新值,val是旧值val = valueIf (deep) {//在深度监视的情况下,重新监视对象以便监视其属性。that . obj(obj,key,watchFun,deep,page);} },get:function(){ return val;}}}}页面代码:
app . tool . new page({ data:{//no autolog in:false },on show:function(){//在此写页面请求逻辑}}最后,
代码已经在线运行很长时间了,用工具中的newPage封装。可以根据自己的需求添加。简而言之,我在这里提供一个思路。如果你有更好的想法,请分享。
【相关学习推荐:小程序开发教程】以上是如何保证每个页面都被小程序登录过的详细内容。更多请关注主机参考其他相关文章!
这几篇文章你可能也喜欢:
本文由主机参考刊发,转载请注明:浅谈小程序保证每个页面都已登录的方法(小程序登录页面) https://zhujicankao.com/75226.html
评论前必须登录!
注册