总结这一周遇到的难点

316 阅读3分钟

一:绍一下React的路由,需求是这样的;在一个页面要往另一个页面进行跳转,跳转的页面判断有没有id传递进来,有则是对跳转前的那个页面进行修改的功能,没有id则是新建,于是想到的是动态路由,首先想到的是

<Route path = "/test component = {Test} />
<Route path = "/test/:id component = {Test} />

这就是我随手都能写出来的代码,看似没什么问题,页面上面也能正常跳转,实则问题可大了,有了动态路由,其主要目的是为了获取其路由携带的id
由于是params传参,对应获取的方式是this.props.match.params.id,于是在控制中打印输出,发现params对象中竟然是空的,这是通过一步步排查发现上述路由的配置是有问题的,根据路由的匹配规则,满足则不会再继续往下走了,于是就会造成params对象是空的情况出现
解决办法:一定要把动态路由写在前面

二:这次的需求是,我已经开发完一个活动的页面,功能是用于下载对应的插件,回到这个页面就发放对应的奖励

由于这个功能是在webview里面的,这里介绍一下webview,webview其实就是在web网页外面套着一个安卓的外壳,最后打包成apk就可以在安卓手机进行安装了
回到上述的需求吧,由于我是做前端的,是无法判断用户是否已经下载了对应的插件,需要结果安卓开发给出的接口进行判断,看似挺简单的,在应用商店下载完成这个插件,重新进入这个页面,的确成功的发放了奖励

看似没问题的的日子并不长久,终于出现问题的case来了,我现在完成,不是重新点击这个软件进去的,而是我下载这个插件的时候,我这个软件是在后台挂着的,然后通过手机查看后台软件的按键进去的,然后奖励就不能正常的发放

看到这个bug之后,我于是赶紧检查代码,由于我是用React Hooks 编写的组件,我是在 useEffect() 对接口返回用户是否已经下载了插件对应的转态值,来进行奖励发放的判断,果不其然,页面切出去,在切回来,这个useEffect(()=>{},[]) 里面的代码根本没有执行,于是我想起来需要监听一下页面的切换
方案是:

document.addEventListener('visibilitychange', 监听的函数)

确实能解决,但是紧接着问题有出现了,当你来回切换的时候,大概是切换四五次的样子,调用函数的次数就会呈现出指数大爆炸的形式调用,从调用2次,到,4,8,12,24的方式调用,这显然对页面性能影响极大
于是我又有另外一种解决方案了:
先定义一个初始状态

   const [windowChangeState, setWindowChangeState] = useState(false)
    if(document.hidden){ // 意思是,为true,则切换了页面
        setWindowChangeState(true)
    }else{
        setWindowChangeState(false)
    }
    
    React.useEffect(()=>{
        document.addEventListener('visibilitychange', 监听的函数)
    },[windowChangeState])

这样自测发现,解决了指数翻倍的形式调用函数的问题了