React router内是如何做到监听history改变的


问题背景

今天面试的时候,被问到这么个问题。在html5的history情况下,pushstate和replacestate是无法触发pushstate的事件的,那么他是怎么做到正确的监听呢?我当时给懵住了,对哦,这怎么监听的到吗?
于是今晚在旅馆,啊,没电脑啊,只能手机打开google搜索了,好像没搜到,于是我自己去github扒源码了。啊,没带电脑看代码好吃力啊,吐槽下┐(‘~`;)┌

源码解析在此

  • 首先,你用router就得用history.push啊replace啊等来操作历史记录,依次看下面两个图高亮处你就懂了:
    图片发自简书App

图片发自简书App
图片发自简书App

图片发自简书App

首先,第一副图中,push方法内部会去调用setState方法,而第二幅图setState方法中又去调用了notifyxxxxx方法,到了第三幅图,notifyxxx方法内部会遍历一个listeners数组来调用。再来到第四幅图,每次history listen方法都会调用那个append方法往第三幅图中的listeners数组中push一个listerner。

所以,原理其实很简单啊,就是一个最最最简单的observer模式啊。哎哟我去-_-||


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM