
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.5 history库原理
2.5.1 history库的运行流程
无论browserHistory、hashHistory还是memoryHistory,其通用运行流程都如图2-2所示。

图2-2 history库的运行流程
history库统一维护了回调函数数组,用于存放listen的响应函数。当调用push、replace方法时,会确认是否调用过history.block。如果调用过且history.block入参不为false,则在导航行为发生前会进行判定;如果入参为字符串,则会将字符串内容用于提示用户,由用户判定是否执行导航操作。如果history.block调用的入参为false,则会强制阻止导航并且没有任何提示给用户。注意,在源码中仅判断值为false的入参,对于history.block(true)、history.block(null)等的调用,将不会有阻止导航的效果。当导航成功之后,history在内部会收集所有的变动,如location的改变、history.length的改变、action的改变,并将所有的变动更新到history各属性中。在更新完history的状态以后,将触发listen函数的所有回调事件函数,将最新的变动location与action通知给各回调事件函数。注意,对于memoryHistory,由于没有外部浏览器的运行环境,将没有浏览器原生事件监听并允许导航的部分,history.push、history.go等流程与图2-2均一致。