单页应用程序url管理



通常在单页应用程序(spa)中,我确实有一个单页,其中有一个侧导航菜单。在该菜单中,有多个定位标记
这些锚点标签的url将由angular/rect/sammy js路由器处理,主div将根据控制器返回的html进行刷新
很简单,对吧
但是想象一个场景,用户通过浏览器地址栏直接访问锚点标签url。则只有返回的html段将被加载到整个页面
有什么办法处理这种情况吗;我的意思是,每当用户直接访问url时,他/她都会得到正确的地址?

编辑:可能我对问题陈述不太清楚。让我详细说明一下:

  • 假设我的页面url是:abc.com/dashboard
  • 这个页面有一个导航菜单和一个类名为"main container"的div部分
  • 用户单击导航菜单中的链接,路由器将url移动到例如abc.com/view/listofXYZ。因此,我们的"主容器"div将加载url abc.com/view/listofXYZ的响应
  • 现在,另一位用户,直接访问abc.com/view/listofXYZ url并点击eneter。然后,页面将只包含url的响应html,即所有的nav菜单和div都不见了


我的问题是,我们能否实现一些设计方法,使这两种方法都能很好地工作?

最好选择角度ui-router而不是sammy js router,当然我不知道。但在angular-ui-router中,我们使用ui-router$stateProvider来定义状态和URL。即使用户直接在浏览器中输入url,也只有在状态中定义的url匹配的情况下,才能正确寻址。

https://github.com/angular-ui/ui-router/tree/legacy请参阅此处了解更多信息。

这里有一个例子,

$stateProvider.state('',{
url: '/',
tempate: 'path/to/.html',
controller: 'controllerToHandle'
})
.state('home', {
url: '/home',
template: 'path/to/home.html',
controller: 'HmeCtrl'
})
.state('home.list',{  //defines child states with dot
url: '/list', //shows url as home/list because it is a child state
template: 'path/to/list.html'
})

如果没有匹配的路径,则使用$urlRouterProvider.otherwise('/')同样,用户可以从home遍历到list例如,www.my-app.com是您的主机名。如果他输入www.my-app.com/home/list作为与/home/list匹配的url,他将被带到home/list页面,如果他输入了任何错误的url,那么他将被带入home页面,因为otherwise方法。

如果react/sammy路由器中有类似的东西,请这样做以获得更好的解决方案

使用React路由器,您可以简单地处理onEnter事件,该事件在用户给出新URL时触发。你可以这样做,即:

const onEnter = (e) => {
console.log(e.location.pathname);
}
/* ... */
<Route path="/" onEnter={onEnter} component={MyComponent} />

这个示例应该在控制台中记录新的URL。你可以进一步解释它,因为你想要做出适当的突变。

最新更新