Vue-router原理

    科技2024-05-11  103

    vue-router和vuex有一点是一样的 都是需要先下载再import导入然后使用vue.use(Router)

    vue-router一共是两种方式,hash和history 之前整理过两个的区别hash有#,锚点,改变url的时候只能修改#后面的内容,hash不会重新加载页面,而history则很自由,不过如果没有路由全覆盖,history更容易报错

    **

    hash

    ** “#”的符号本来作用是加在URL中指示网页中的位置;

    http://www.example.com/index.html#print

    # 后面的字符叫做 hash,可以通过window.location.hash读取 特点:写在url内容中,但是不包括在http请求中,他是用来指导浏览器动作的,对服务端无用

    hash的改变可以使用事件监听

    window.addEventListener("hashchange",funcRef,false

    每一次改变hash,都会在浏览器的访问记录增加一个记录 由此可以实现前端路由“更新视图但不重新请求页面”的功能

    HashHistory.push()

    push (location: RawLocation, onComplete?: Function, onAbort?: Function) { this.transitionTo(location, route => { pushHash(route.fullPath) onComplete && onComplete(route) }, onAbort) } function pushHash (path) { window.location.hash = path } replace (location: RawLocation, onComplete?: Function, onAbort?: Function) { this.transitionTo(location, route => { replaceHash(route.fullPath) onComplete && onComplete(route) }, onAbort) } function replaceHash (path) { const i = window.location.href.indexOf('#') window.location.replace( window.location.href.slice(0, i >= 0 ? i : 0) + '#' + path ) }

    主要就是两个方法改变路由,一个push,一个replace,push是推入浏览器记录的栈中,replace是直接替代的,也就是修改后网页无法进行前进或者后退,上面是两种方法的源码实现,可以直接看到他们的内部调用的函数是pushHash和replaceHash。 这些是通过函数执行的改变路由,而日常我们除了点击按钮进行路由跳转,还可以通过直接修改地址栏的内容进行网页的跳转,所以还需要一个监听地址栏的功能 在HashHistory中是使用了setupListener实现

    setupListeners () { window.addEventListener('hashchange', () => { if (!ensureSlash()) { return } this.transitionTo(getHash(), route => { replaceHash(route.fullPath) }) }) }

    hashchange这个浏览器监听事件,然后再调用了replace方法

    **

    History

    **

    有一个History interface的接口,通过back( ),forward( ) ,go( )等方法,可以读取浏览器你是记录栈的信息,进行各种跳转操作

    h5有两个新的方法:pushState(),replaceState()使得我们可以对浏览器你是记录栈进行修改

    window.history.pushState(stateObject, title, URL) window.history.replaceState(stateObject, title, URL)

    stateobject:当浏览器跳转到新的状态时,将触发popState时间,该事件携带这个stateObject参数的副本 title:所添加记录的标题 url:所添加记录的url

    总结和hashhistory的函数区别: push功能: window.hash -> history.pushState replace功能: window.replace -> history.replaceState

    Processed: 0.016, SQL: 9