当前位置: 首页 > Web前端 > HTML5

VueRouter学不会?那就不要错过这篇文章!

时间:2023-04-05 15:29:34 HTML5

入门使用Vue+VueRouter创建单页应用程序非常简单:通过Vue.js,应用程序已经由组件组成。添加VueRouter时,将组件映射到路由并让VueRouter知道在哪里渲染它们。HTML

HelloApp!

转到主页转到关于

router-link这里没有使用常规的a标签,而是使用自定义组件router-link来创建Link。这允许VueRouter在不重新加载页面的情况下更改URL,并处理URL生成和编码。router-viewrouter-view显示url对应的组件。它可以放置在任何地方以适合您的布局。JavaScriptconstHome={template:'
Home
'}constAbout={template:'
About
'}constroutes=[{path:'/',component:Home},{path:'/about',component:About},]constrouter=VueRouter.createRouter({history:VueRouter.createWebHashHistory(),routes,//`routes:routes`的缩写})constapp=Vue.createApp({})app.use(router)app.mount('#app')通过调用app.use(router),可以在任何组件中作为this.$router和作为this.$route访问当前路由:带参数的动态路由匹配很多时候,需要将给定匹配模式的路由映射到同一组件。在VueRouter中,可以通过在路径中使用一个动态字段来实现,这个字段称为路径参数:constUser={template:'
User
',}//这些将被传递给`createRouter`constroutes=[//动态字段以冒号开头{path:'/users/:id',component:User},]现在/users/johnny和/users/jolyne等URL将映射到相同的路由。路径参数用冒号:表示。对路由参数更改的响应使用带参数的路由时需要注意的一点是,当您从/users/johnny导航到/users/jolyne时,将重用相同的组件实例。因为两条路由都渲染相同的组件,所以重用比销毁和重建更有效。然而,这也意味着组件的生命周期钩子将不会被调用。要响应同一组件内参数的变化,只需观察$route对象上的任何属性,在本例中为$route.params:constUser={template:'...',created(){this.$watch(()=>this.$route.params,(toParams,previousParams)=>{//响应路由变化...})},}路由的匹配语法最适用两者都使用静态路由,如/about和动态像/users/:userId这样的路由,就像你刚刚在动态路由匹配中看到的那样,但是VueRouter可以提供更多的方式!参数中的自定义正则表达式当定义像:userId这样的参数时,在内部使用以下正则表达式(如[^/]+)(至少有一个除/之外的字符)从URL中提取参数。当你需要根据参数的内容来区分两条路由时,最简单的方法是在路径中添加一个静态部分来区分它们:constroutes=[//match/o/3549{path:'/o/:orderId'},//匹配/p/books{path:'/p/:productName'},]但在某些情况下,不想添加静态/o/p部分。由于orderId总是一个数字,而productName可以是任何东西,您可以为括号中的参数指定一个自定义规则:constroutes=[///:orderId->onlymatchnumbers{path:'/:orderId(\\d+)'},///:productName->匹配任何其他内容{path:'/:productName'},]现在,转到/25将匹配/:orderId,否则将匹配/:productName。路由数组的顺序并不重要!可重复参数如果需要匹配一个路由有多个部分,比如/first/second/third,应该替换为*(0个或多个)和+(1个或多个)标记为可重复的参数:constroutes=[///:chapters->匹配/one,/one/two,/one/two/three,etc{path:'/:chapters+'},///:chapters->匹配/,/one,/one/two,/one/two/three,etc.{path:'/:chapters*'},]这将提供一个参数数组,而不是字符串,在命名时会使用一个数组,在路由时也需要传递:可选参数可以通过使用?修饰符(0或1)constroutes=[//匹配/users和/users/posva{path:'/users/:userId?'},//匹配/users和/users/42{path:'/users/:userId(\\d+)?'},]请注意,*在技术上也标记参数是可选的,但是?参数不能重复。调试要调查路由如何转换为正则表达式,了解路由未匹配的原因,或者报告错误,请使用路径排名工具。它支持通过URL共享路由。嵌套路由某些应用程序的UI由多层嵌套组件组成。在这种情况下,URL的片段通常对应特定的嵌套组件结构,例如:/user/johnny/profile/user/johnny/posts+------------------++----------------+|用户||用户||+------------+||+-------------+|||简介||+------------>||帖子|||||||||||+--------------+||+------------+|+----------------++--------------+使用VueRouter,可以使用嵌套路由配置来表达这种关系。
constUser={template:'
User{{$route.params.id}}
',}//这些将被传递给`createRouter`constroutes=[{path:'/user/:id',component:User}]其??中是顶级路由器视图。它渲染与顶级路由匹配的组件。同样,渲染的组件也可以包含自己的嵌套。如果在User组件的模板中添加一个:constUser={template:`

User{{$route.params.id}}

`,}要将组件渲染到这个嵌套的路由器视图中,您需要在路由中配置子节点:constroutes=[{path:'/user/:id',component:User,children:[{//当/user/:id/profile匹配成功//UserProfile会被渲染到User的内部路径:'profile',component:UserProfile,},{//当/user/:id/posts匹配成功//UserPosts会被渲染到User的内部路径:'posts',component:UserPosts,},],},]注意以/开头嵌套的路径将被视为根路径。这允许利用组件嵌套而不必使用嵌套的URL。如您所见,子配置只是另一个路由数组,就像路由本身一样。因此,您可以根据需要多次嵌套视图。除了使用创建一个标签来定义导航链接之外,还可以借助路由器实例方法编写代码来实现程序化导航。导航到不同的位置要导航到不同的URL,您可以使用router.push方法。此方法将向历史堆栈添加一条新记录,因此当用户单击浏览器后退按钮时,他们将返回到之前的URL。当点击时,内部会调用这个方法,所以点击相当于调用router.push(...):这个方法的参数可以是字符字符串路径,或描述地址的对象。//stringpathrouter.push('/users/eduardo')//objectwithpathrouter.push({path:'/users/eduardo'})//命名路由,加上参数,让路由建立urlrouter.push({name:'user',params:{username:'eduardo'}})//带查询参数,结果为/register?plan=privaterouter.push({path:'/register',query:{plan:'private'}})//带hash,结果为/about#teamrouter.push({path:'/about',hash:'#team'})如果提供path,params会被忽略,这不是上述查询的情况。取而代之的是,下面的方法需要提供路由的名称或者手写一个带参数的完整路径:constusername='eduardo'//你可以手动创建url,但是你必须自己处理编码router.push(`/user/${username}`)//->/user/eduardo//相同的router.push({path:`/user/${username}`})//->/user/eduardo//使用`nameifpossible`和`params`受益于自动URL编码router.push({name:'user',params:{username}})//->/user/eduardo//`params`不能与`path`router.push({path:'/user',params:{username}})//->/user由于to属性接受与router.push相同的对象类型,因此两者的规则完全相同。router.push和所有其他导航方法返回一个Promise,允许我们等到导航完成后才知道它是成功还是失败。REPLACECURRENTLOCATION这与router.push类似,唯一的区别是它不会在导航时向历史记录添加新记录,顾名思义-它会替换当前条目。你也可以直接在传递给router.push的routeLocation中添加一个属性replace:true:'})