从零开始学习vue-router
时间:2023-03-30 13:28:07
CSS
一、前言学习vue-router,首先要知道这里的路由是什么?为什么我们不能像以前那样直接用标签写链接呢?如何使用vue-router?常见的路由操作有哪些?这些问题等等都是本文要讨论的主要问题。2.什么是vue-router?这里的路由并不是指我们通常所说的硬件路由器。这里的路由是SPA(SinglePageApplication)的路径管理器。通俗地说,vue-router就是WebApp的链接路径管理系统。Vue-router是Vue.js的官方路由插件。它与vue.js深度集成,适用于构建单页应用。Vue的单页应用是基于路由和组件的。路由用于设置访问路径和映射路径和组件。传统的页面应用使用一些超链接来切换和跳转页面。在vue-router单页应用中,就是路径之间的切换,也就是组件的切换。路由模块的本质是建立url和页面之间的映射关系。至于为什么不能使用a标签,是因为Vue是用来做单页应用的(当你的项目准备打包时,当你运行npmrunbuild时,会生成一个dist文件夹,里面只包含static资源和一个index.html页面),所以你写的标签将不起作用,你必须使用vue-router来管理它们。3、vue-router实现原理SPA(单页应用):只有一个完整页面的单页应用;当它加载一个页面时,它不会加载整个页面,而只会更新指定容器中的内容。单页应用(SPA)的核心之一是:在不重新请求页面的情况下更新视图;vue-router在实现单页面前端路由时,提供了两种方式:Hash方式和History方式;根据模式参数决定使用哪一种方法。1.哈希模式:vue-router默认的哈希模式——使用URL的哈希来模拟一个完整的URL,所以当URL改变时,页面不会重新加载。哈希(#)是URL的锚点,代表网页中的一个位置。只需更改#后面的部分,浏览器只会滚动到相应位置而不会重新加载网页,也就是说hash出现在URL中。但是它不会包含在http请求中,对后端根本没有影响,所以改变hash不会重新加载页面;同时,每修改一次#后面的部分,浏览器的访问历史记录中就会添加一条记录,使用“返回”按钮,可以返回到之前的位置;所以Hash模式通过锚点值的变化,根据不同的值在指定的DOM位置渲染不同的数据。hash方式的原理是onhashchange事件(监听hash值的变化),可以在window对象上监听。2.history模式:由于hash模式在url中会有#,如果不想hash难看,我们可以使用路由的history模式,在配置路由规则的时候加上"mode:'history'"即可,这种模式充分利用了html5history接口中新的pushState()和replaceState()方法。这两个方法应用于浏览器记录栈。在已有的back、forward、go的基础上,提供了修改历史的功能。只是当他们进行修改的时候,虽然改变了当前的URL,但是浏览器并不会立即向后端发送请求。//constrouterinthemain.jsfile=newVueRouter({mode:'history',routes:[...]})当你使用历史模式时,url就像一个普通的url,比如http://你的网站。com/user/id看起来更好!不过要玩好这个模式,还需要后台配置支持。因为我们的应用是单页客户端应用,如果后台配置不正确,用户在浏览器中直接访问http://oursite.com/user/id时,会返回404,不好看.所以,你需要在服务器端添加一个涵盖所有情况的候选资源:如果URL没有匹配到任何静态资源,它应该返回相同的index.html页面,也就是你的应用所依赖的页面。exportconstroutes=[{path:"/",name:"homeLink",component:Home}{path:"/register",name:"registerLink",component:Register},{path:"/login",名称:"loginLink",component:Login},{path:"*",redirect:"/"}]这里如果网址输入错误或者网址不匹配任何静态资源,会自动跳转到首页3、使用路由模块实现页面跳转方法方法一:直接修改地址栏方法二:this.$router.push('路由地址')方法三:4.如何使用vue-router1:下载npmivue-router-S2:在main.js中引入importVueRouterfrom'vue-router';3:安装插件Vue.use(VueRouter);4:创建路由对象并配置路由规则letrouter=newVueRouter({routes:[{path:'/home',component:Home}]});5:将其路由对象传递给Vue实例,并在options中添加router:router6:在app.vue中留个洞具体实现请参考以下代码://在main.js文件中引入importVuefrom'vue';importVueRouterfrom'vue-router';//主要importAppfrom'./components/app.vue';importHomefrom'./components/home.vue'//安装插件Vue.use(VueRouter);//挂载属性//创建路由对象并配置路由规则letrouter=newVueRouter({routes:[//oneobject{path:'/home',component:Home}]});//newVue启动newVue({el:'#app',//让vue知道我们的路由规则router:router,//可以简写routerrender:c=>c(App),})最后记得在app.vue中“留洞”//app.vue
五、vue-router参数传递声明式导航和程序化导航router.push(...)都可以传递参数。本文主要介绍前一种传递参数的方法。同样的规则也适用于编程导航。1、使用name传参,在路由文件src/router/index.js中配置name属性routes:[{path:'/',name:'Hello',component:Hello}]inthetemplate(src/App.vue)使用$route.name接收,例如:{{$route.name}}
2该方法的基本语法是通过中的to传递参数tag:valueString比如首先在src/App.vue文件中Hipage1然后在src/router中给hi1配置的路由起个名字/index.js文件,名为hi1.{path:'/hi1',name:'hi1',component:Hi1}最后,在模板中使用$route.params.username(src/components/Hi1.vue)接收。{{$route.params。username}}-{{$route.params.id}}3Useurlpassingparameters----在配置文件中以冒号的形式设置参数。我们在/src/router/index.js文件中配置路由{path:'/params/:newsId/:newsTitle',component:Params}。我们需要传递新闻ID(newsId)和新闻标题(newsTitle)的参数。所以我们在路由配置文件中指定了这两个值。在src/components目录下创建我们的params.vue组件,也可以称之为页面。我们在页面上输出url传过来的新闻ID和新闻标题。{{msg}}
新闻ID:{{$route.params.newsId}}
新闻标题:{{$route.params.newsTitle}}
在App.将我们的标签添加到vue文件中。这时候我们可以直接使用url传值params4。使用path匹配路由,然后通过query传参router-link跳转到Query对应的路由配置:{path:'/query',name:'Query',component:Query}这样我们就可以得到参数:this.$route.query.queryId六、vue-router配置子路由(二级路由)现实生活中的应用界面通常是由多层嵌套的组件组成。同样,URL中动态路径的每一段也按照一定的结构对应每一层嵌套的组件,例如:如何实现下图所示的效果(H1页面和H2页面嵌套在首页)?1.首先使用标签添加两个新的导航链接homepageH1页面H2页面2.在HelloWorld.vue中添加标签为子模板提供插入位置{{msg}}
分区>模板>3。在components目录下创建两个组件模板H1.vue和H2.vue。两者内容相似。以下是H1.vue页面的内容:{{msg}}
修改router/在index.js代码中,通过在原路由配置下添加children字段来编写子路由。routes:[{path:'/',name:'HelloWorld',component:HelloWorld,children:[{path:'/h1',name:'H1',component:H1},//
必须出现在HelloWorld.vue{path:'/h2',name:'H2',component:H2}]}]7.单页多路由区操作我们有两个以上的区域,我们通过配置路由js文件来操作这些区域的内容1.App.vue文件,在下新写两行标签,添加一些CSS样式H1
<路由器-link:to="{name:'H1'}">H2
2.这三个区域需要在路由中配置。配置主要在components字段中导出defaultnewRouter({routes:[{path:'/',name:'HelloWorld',components:{default:HelloWorld,left:H1,//显示H1组件内容'我是H1页面,欢迎光临toH1'right:H2//显示H2组件内容'我是H2页面,欢迎来到H2'}},{path:'/h1',name:'H1',components:{default:HelloWorld,left:H2,//显示H2组件内容right:H1//显示H1组件内容}}]})我们在上面的代码中写了两个路径,一个是默认的'/',一个是'/Hi'。在下面的两个路径组件中,我们分别定义了三个区域的显示内容。最终页面显示如下:8.$route和$router的区别下面打印出两者的console.log:$route是“路由信息对象”,包括path,params,hash,query,fullPath,matched、name等路由信息参数。①$route.path字符串,对应当前路由的路径,总是解析为绝对路径,如“/order”。②$route.params是key/value对象,包含动态分片和全匹配分片。如果没有路由参数,则为空对象。③$route.query是表示URL查询参数的key/value对象。例如,对于路由/foo?user=1,$route.query.user为1,如果没有查询参数则为空对象。④$route.hash当前路由的hash值(不带#),如果没有hash值则为空串。⑤$route.fullPath为解析后的URL,包括查询参数的全路径和hash。⑥$route.matched数组包含当前匹配路由包含的所有分片对应的配置参数对象。⑦$route.name当前路径名$router是一个“路由实例”对象,即使用newVueRouter创建的实例,包括路由跳转方法、钩子函数等$router常用跳转方法:
.....$router.push和$router.replace的区别:使用push方法的跳转会在历史栈中添加一条新记录,当我们点击浏览器的后退按钮时,可以看到上一页。使用replace方法不会在历史记录中增加一条新的记录,而是替换当前的历史记录,即replace跳转到网页后,'返回'按钮无法查看上一页。9.如何设置404页面。用户经常进入错误的页面。当用户进入错误的页面时,我们希望能给他一个友好的提示页面。这个页面就是我们常说的404页面。Vue-router也为我们提供了这样的机制。设置我们的路由配置文件(/src/router/index.js){path:'*',component:Error}其中path:'*'表示当输入地址不匹配时,Error.vue的文件内容自动显示在/src/components/文件夹下新建一个Error.vue文件。只需输入有关错误页面的内容。
{{msg}}
这时候,当我们随意输入错误的地址时,它会自动跳转到404页面。参考文章vue-router实现单页路由原理Vue.js——vue-router60分钟快速入门技术胖Vue-router视频Vue2.0中$router和$route的使用探索之路-vue-router入门vue-router2.0的一些区别教程和总结