本文主要介绍微信小程序全球现状的相关信息。通过示例代码进行了非常详细的介绍,对大家的学习或者工作都有一定的参考价值。有需要的朋友下面和边肖一起学习。

在微信小程序中,App.js的globalData可以作为页面与组件之间传递信息的中间桥梁,包括页面与页面、页面与组件、组件与组件。但是,我们无法及时了解globalData下的变化。在官方默认创建新小程序的情况下,延迟了获取UserInfo的网络操作,所以写了很多不必要的代码。这种情况即使在官方案例中也是存在的,相信你在开发中也会遇到类似的情况。本文将介绍如何解决这类问题。

需求分析

我认为,在没有全局状态管理的情况下,以下情况是我们的常见操作:

在页面和组件的两个生命周期钩子函数OnLoad和Attached中,一些已有的属性是从App的globalData赋给页面或组件中的数据的。

最开始有一些异步的网络请求,获取的数据是全局使用的。起初,这个globalData中可能没有相关属性,直到请求成功,相关属性才会添加到globalData中。此时,来自globalData的Page的赋值操作可能已经完成,但只是未定义。因此,在分配给页面和组件之前,需要进一步判断。如果这些只有一两个简单,但是需要赋值多个页面或者变量,我想你会拒绝,会想办法偷懒。

在一些页面和组件中,从globalData赋值的变量不仅仅用于判断和显示,我们可能还需要根据用户交互改变变量的值,所以在其他页面中,其他组件中的相同变量需要统一改变。

以上情况我们可提出以下几点需求:

最初加载页面和组件时,尽早从globalData获取并分配页面和组件所需的一些属性。

及时获取globalData的某个属性的一些变化,并进行一些后续的相关操作。

在更改页面和组件的值时,其他页面和组件也会以同样的方式进行更改。

以下是需求的原始代码。

//app.js

应用程序({

全局数据:{

userInfo:空

},

onLaunch(){

wx.getSetting({

成功:res={

if(RES . auth setting[‘ scope . userinfo ‘]){

wx.getUserInfo({

成功:res={

this . global data . userinfo=RES . userinfo

//需求2

if(this . userinfoeadycallback){

//这个回调函数的存在意味着page已经执行了onLoad

//没有获取userInfo并赋给page的数据。

//执行这个回调函数,分配给对应的页面。

this . userinfoeadycallback(RES)

}

}

})

}

}

})

}

})

//Pages/索引/index.js

const app=getApp()

页面({

//.

加载(选项){

//需求1

const userInfo=app . global data . userInfo

userInfo this.setData({useInfo})

//需求2

//如果没有获得app.globalData.userInfo

//表示没有执行wx.getUserInfo的回调函数。

//给app添加一个响应回调函数,此时将这个绑定到回调函数。

userInfo | | app . userinfoeadycallback=RES={

this.setData({

用户信息:res.userInfo

})

删除app.userInfoReadyCallback

}

}

})

https://codes90.oss-cn-hangzhou.aliyuncs.com/2022/09/1664365664-0e921884142c685.png

这是官方小程序案例的代码。我只做了一点点修改。这里我只展示需求2的回调函数,globalData属性从头开始执行页面设置,但并没有意识到回调函数每次都会执行。需求3的代码比较复杂,这里就不展示了。

我们可以思考一下,实现上述需求需要哪些代码。可以发现,需求1和3主要是在页面、组件初始化、globalData属性发生变化时,需要使用this.setData方法,但每次这指向的都是不同的实例。要求2是要有回调函数,回调函数的this也要指向对应的实例,并且这些回调函数要在globalData属性改变时执行。

从时间上看,我们有两个,一个是页面,组件初始化,一个是globalData属性发生变化的时候。然后在第一个时间点,我们可以考虑小程序生命周期的hook函数,onLoad和attached,在这两个时间点执行this.setData的操作。globalData属性的改变是由我们的主动或者用户事件引起的,也就是这个操作可以看作是globalData的一个属性的事件,这个事件发生后,会执行一些写好的回调函数。

从操作对象的角度来看,基本上都是页面和组件this、app.globalData的实例

需求的理论综述

综上所述,在初始化时,我们可以自动做到this.setData(无需手动操作),保存this(用于事件执行时指向对应的实例),将对应的回调函数存储为事件(事件为未执行的函数),必要时主动触发此事件。可以看到,整个流程下来后,我们需要一个跨app、跨页面、跨组件的变量来劫持初始化的hook函数,自动赋值,存储相应的事件,并公开一个由事件触发的接口。

纸上谈兵会觉得练功浅薄永远不会知道

看到这里,相信你已经对全局状态管理有了一定的了解,那么如何实现呢?在这里,我想强调的是,如果你看完这篇文章后对此有了一定的了解,那么你一定要尝试自己实现代码。不管是好是坏,总比不执行好,你在自己的执行中可能收获更多。上面的案例展示了下面简单的实现代码,给了我一个不太理解的想法。下次我会写相关代码实现的说明,应该会有。

//app.js

类别存储区{

构造器(应用程序){

这个[‘event’]={}

this.app=app

}

autoSet(全局数据,实例){

const instanceData={}

for (let prop of globalData){

instance data[prop]=this . app . global data[prop]

常量回调=(新值)={

instance . setdata({[prop]:new value })

instance . watch[prop]instance . watch[prop]。调用(实例,新值)

}

this.addEvent(prop,callBack)

instance.setData(instanceData)

回调(instanceData[prop])

删除实例. watch

删除instance.globalData

}

}

addEvent(eventName,callBack){

this . event[事件名称]=this . event[事件名称] || []

this . event[事件名称]。推送(回拨)

}

分派(事件名称,新值){

this . app . global data[事件名称]=新值

this . event[事件名称]this . event[事件名称]。forEach(item=item(newValue))

}

}

应用程序({

全局数据:{

userInfo:空

},

onLaunch(){

//新建一个实例,保存在小程序app中进行全局调用。

this.store=新商店(this)

wx.getSetting({

成功:res={

if(RES . auth setting[‘ scope . userinfo ‘]){

wx.getUserInfo({

成功:res={

//获取userInfo后,触发事件。

this.store.dispatch(‘userInfo ‘,res.userInfo)

}

})

}

}

})

}

})

//Pages/索引/index.js

const app=getApp()

页面({

//.

数据:{

用户名:空

},

//globalData数组用于自动赋值。

globalData: [‘userInfo’],

//监听对应的globalData属性,设置回调函数。

观察:{

用户信息(userInfo){

Console.log(‘userInfo已更新’,this)

this . setdata({用户名:用户信息.昵称})

}

},

加载(选项){

//传入这个globalData,和实例,设置这个实例需要的数据,创建一个事件。

app . store . autoset(this . global data,this)

//你想做的其他事情.

}

})

上面的代码没有劫持hook函数,只是在函数的开头执行绑定函数,没有在页面被破坏时释放内存的操作。还有很多可以优化的地方,都留到另一个解释。

摘要

关于微信小程序全球现状的这篇文章就到此为止。有关相关小程序全球状态的更多信息,请搜索Script House之前的文章或继续浏览下面的相关文章。希望大家以后多多支持剧本之家!

来源:剧本之家

链接:https://www.jb51.net/article/207572.htm

发表回复

后才能评论