vue路由信息对象关于hash的描述如下:
在查阅源码后发现这个hash确实是取自location.hash
完整源码:https://github.com/vuejs/vue-...
beforeEnter (to, from, next) {
console.log(to)
console.log(location.hash)
}
打印结果如下:
此时我的url是:http://localhost:8080/#/2
按照定义来看应该和location一样.hash是#/2啊
但路由的hash是空串,但是location.hash是存在的
如果是没有读取到的话但是fullPath、params等值是存在的
这是什么原因呢?
因为location是对整个路由进行判定,而路由信息对象是对其fullPath进行判定的。
所以一开始遇到问题的路径localhost:8080/#/2是没有路由哈希值得因此返回为空串。
如果是localhost:8080/#/2#222则路由信息对象的hash值为#222
而其location.hash为#/2/2#222
最开始对这个hash值不是很理解在多方查找资料无果后决定自己去查vue源码。源码如下:
vue-router.js
关于location定义如下 文件来自vue-router.js
关于resolve定义如下,定义来自index.js
此处的location的定义来自location.js
normalizeLocation 返回一个对象其中包含hash属性。其中关于hash的定义为
关于parsePath方法定义自path.js
此时可以判断出hash的取值与next有关,next定义如下
如果row是字符串则直接赋值给location,否则取该对象的path值赋值给location。而row取自normalizeLocation的第一个参数。也就是resolve中的to。这个参数是vue-router.js中传进来的this.to。Link调用在同文件中:
其中的to来自于自身的定义:
完整流程为使用router-link时获取参数to进行参数解构拿到to值,如果是字符串直接进行解析取得#号及以后的字符串。如果是对象获取其path值然后获取其#号及以后内容
所以localhost:8080/#/123的路由信息对象的hash是空串
而location.hash是#/123