You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository has been archived by the owner on Nov 12, 2024. It is now read-only.
传统的URL处理:
直接修改URL页面肯定刷新,如果做到不刷新就只有使用hash的形式或pushState,如上述的URL切换,使用hash后会变成这样:
(关于hash中的叹号可搜索hashbang获取更多内容)
那对于上述的URL Magix中是如何处理的?
Magix解析出来的对象是这样的:
可以看出query与hash各自解析,然后把query与hash合并后再给出path与params
合并后的path是采用hash中的,因为当hash有值时,应当以hash中的值为准,那如果页面进入时没有hash,如最开始的:
这个url的path如何确定?
这个时候需要看Magix.config中是如何配置的:
取决于defaultPath如何配置。那么上述URL解析出来的对象就是:
如果未配置defaultPath呢?如果未配置则使用空字符串。
所以在使用hash做为保存页面状态URL时,忽略query中的path,统一使用hash中的path
那相同参数时如何处理?如:
这时候会把hash中的参数merge到query中,合并出来的即是最终的。相同参数则覆盖。最终解析的结果为:
以上是传统URL的处理,HTML5新加入了history.pushState相关的API,可以更友好的改变URL而不刷新页面。如果使用该功能需要启用edgerouter模块重新编译magix
启用该功能后,在支持HTML5 API的浏览器上,如URL的切换
不使用hash,直接改变
使用hash来保存url的变化
那么这时候的解析结果是如何的,尤其是path如何确定?
解析结果首先确定url中是否存在hash,如果存在hash则优先使用hash中的path。(为什么要优先使用hash中的?假设从不支持HTML5的浏览器上拷贝URL,则很有可能带有hash部分,粘贴到不管是支持HTML5还是不支持HTML5的浏览器上,都需要使用hash中的path,因为hash中的才是正确的)
如果没有hash则使用query中的path,对于参数更容易处理,如果存在hash,则把hash中的merge到query中,同名覆盖即可,原因同上。
以上就是hash和html5之间的解析差异,接下来再说一些使用上的细节
假设初始url是这样的:
使用Magix.Router的to方法进行导航:
假设我们使用pushState,并且当前浏览器支持,于是url会变成:
page参数改变,同时丢掉了rows参数,这是合理的
当在不支持history state的浏览器上时,url会变成:
根据前面讲到的参数合并规则,虽然2种解析出来的结果并非严格一致,前者解析出来的参数为:
{page:1}
,后者为:{page:1,rows:''}
,相对于原来的url解析出来的参数{page:20,rows:30}
,都是改变了参数page和rows,这是没问题的只是从参数中取rows时,第1种是undefined,第2种是空字符串,严格来讲这是有问题的,不过在具体使用上并不会引入太大的问题(从地址栏中拿到的参数都是需要校验的),所以暂忽略掉这个风险
The text was updated successfully, but these errors were encountered: