最近接到一个请求,产品经理希望添加弹窗广告,可以根据后台配置在应用的任意页面展示。当后台改变当前页面、链接或目标页面的广告数量时,修改当前页面的数据,不影响其他页面数据。比如后台设置“首页”出现过一次广告,“我的”页面广告出现过3次。用户进入后,关闭。“主页”广告1次,关闭“我的”页面广告2次。此时退出应用,后台会将“首页”广告设置为2次,则用户“首页”广告将重置为2次,“我的”页面广告仍为1次(3-2)需求分析后台返回数据必须是一个数组,每个对象都会有三个参数:目标页面(展示的页面)、跳转链接、总出现次数。前端需要对数据进行处理:当本地没有数据时(第一次进入),将总出现次数赋值给一个参数firstTotalTimes(记录原来的总出现次数)。当本地有数据(不是第一个条目)时,将存储在本地的firstTotalTimes清空,返回值赋值给removeLocalTotalTimeList。比较removeLocalTotalTimeList和请求返回的数据advertisementList是否相等,说明后台数据没有变化。查看你本地存储中出现的总次数是否大于0,如果大于0,则显示的广告不相等,说明后台修改了数据,我们这里需要分析一下。只有修改过的页面会被重置,未修改的部分不会被处理。我使用的框架是umi3,里面有wrappers的概念,是配置路由的高层组件包。在umi.conf添加后,任何页面都要先经过这个过程。关键代码如下:useEffect(()=>{dispatch({type:'common/fetchGetPopUpAdvertisementList'}).then((resData:any)=>{if(resData?.resultCode==="S00000"){if(!localStorage.advertisementList){constaddFirstTotalTimes=resData.advertisementList.map((item:any)=>{item.firstTotalTimes=item.totalTimesreturnitem;})localStorage.advertisementList=JSON.stringify(addFirstTotalTimes);}constlocalAdvertisementList=JSON.parse(localStorage.advertisementList)constcloneLocalAdvertisementList=JSON.parse(JSON.stringify(localAdvertisementList))constremoveLocalTotalTimeList=cloneLocalAdvertisementList.map((item:any)=>{deleteitem.firstTotalTimes返回项})if(_.isEqual(removeLocalTotalTimeList,resData.advertisementList)){console.log('相等')localAdvertisementList.filter((item:any)=>{if(item.targetUrl.indexOf(history.location.pathname)>-1){if(item.firstTotalTimes>0){setAdItem(item)}}})}else{console.log('不相等')constcloneList=JSON.parse(JSON.stringify(resData.advertisementList));for(leti=0;i
