登陆

章鱼彩票老版app-百行代码带你入门 vue-router!

admin 2019-06-04 294人围观 ,发现0个评论

作者 | 浪里行舟

责编 | 胡巍巍

前语

要学习vue-router就要先知道这儿的路由是什么?为什么咱青蒿素们不能像本来相同直接用标签编写链接哪?vue-router怎么运用?常见路由操作有哪些?等等这些问题,便是本篇要讨论的首要问题。

vue-router是什么

这儿的路由并不是指咱们平常所说的硬件路由器,这儿的路由便是SPA(单页运用)的途径办理器。再浅显的说,vue-router便是WebApp的链接途径办理体系。 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,合适用于构建单页面运用。vue的单页面运用是依据路由和组件的,路由用于设定拜访途径,并将途径和组件映射起来。传统的页面运用,是用一些超链接来完结页面切换和跳转的。在vue-router单页面运用中,则是途径之间的切换,也便是组件的切换。路由模块的实质 便是树立起url和页面之间的映射联系。

至于咱们为啥不能用a标签,这是由于用Vue做的都是单页运用(当你的项目预备打包时,运转npm run build时,就会生成dist文件夹,这儿面只要静态资源和一个index.html页面),所以你写的标签是不起作用的,你有必要运用vue-router来进行办理。

vue-router完结原理

SPA(single page application):单一页面运用程序,只要一个完好的页面;它在加载页面时,不会加载整个页面,而是只更新某个指定的容器中内容。单页面运用(SPA)的中心之一是: 更新视图而不从头恳求页面;vue-router在完结单页面前端路由时,供给了两种办法:Hash方式和History方式;依据mode参数来决议选用哪一种办法。1、Hash方式:

vue-router 默许 hash 方式 —— 运用 URL 的 hash 来模仿一个完好的 URL,所以当 URL 改动时,页面不会从头加载。

hash(#)是URL 的锚点,代表的是网页中的一个方位,单单改动#后的部分,阅读器只会滚动到相应方位,不会从头加载网页,也便是说hash 呈现在 URL 中,但不会被包含在 http 恳求中,对后端彻底没有影响,因而改动 hash 不会从头加载页面;

一起每一次改动#后的部分,都会在阅读器的拜访前史中添加一个记载,运用”撤退”按钮,就可以回到上一个方位;

所以说Hash方式经过锚点值的改动,依据不同的值,烘托指定DOM方位的不同数据。hash 方式的原理是 onhashchange 事情(监测hash值改动),可以在 window 目标上监听这个事情。

2、History方式:

由于hash方式会在url中自带#,假如不想要很丑的 hash,咱们可以用路由的 history 方式,只需求在装备路由规矩时,参加"mode: 'history'",这种方式充分运用了html5 history interface 中新增的 pushState() 和 replaceState() 办法。

这两个办法运用于阅读器记载栈,在当时已有的 back、forward、go 根底之上,它们供给了对前史记载修正的功用。仅仅当它们履行修正时,尽管改动了当时的 URL ,但阅读器不会当即向后端发送恳求。

//main.js文件中

constrouter = newVueRouter({

mode: 'history',

routes: [...]

})

当你运用 history 方式时,URL 就像正常的 url,例如 yoursite.com/user/id,比较好…不过这种方式要玩好,还需求后台装备支撑。由于咱们的运用是个单页客户端运用,假如后台没有正确的装备,当用户在阅读器直接拜访 oursite.com/user/id就会回来 404章鱼彩票老版app-百行代码带你入门 vue-router!,这就欠好看了。

所以,你要在服务端添加一个掩盖一切状况的候选资源:假如 URL 匹配不到任何静态资源,则应该回来同一个 index.html 页面,这个页面便是你 app 依靠的页面。

export const routes = [

{path: "/", name: "homeLink", component:Home}

{path: "/register", name: "registerLink", component: Register},

{path: "/login", name: "loginLink", component: Login},

{path: "*", redirect: "/"}]

此处就设置假如URL输入过错或者是URL 匹配不到任何静态资源,就主动跳到到Home页面

3、运用路由模块来完结页面跳转的办法

vue-router运用办法

1:下载 npm i vue-router -S

2:在main.js中引进 import VueRouter from 'vue-router';

3:装置插件Vue.use(VueRouter);

4:创立路由目标并装备路由规矩 let router = new VueRouter({routes:[{path:'/home',component:Home}]章鱼彩票老版app-百行代码带你入门 vue-router!});

5:将其路由目标传递给Vue的实例,options中参加 router:router

6:在app.vue中留坑 <router-view></router-view>

详细完结请看如下代码:

//main.js文件中引进

importVue from'vue';

importVueRouter from'vue-router';

//主体

importApp from'./components/app.vue';

importHome from'./components/home.vue'

//装置插件

Vue.use(VueRouter); //挂载特点

//创立路由目标并装备路由规矩

letrouter = newVueRouter({

routes: [

//一个个目标

{ path: '/home', component: Home }

]

});

//new Vue 发动

newVue({

el: '#app',

//让vue知道咱们的路由规矩

router: router, //可以简写router

render: c=>c(App),

})

最终记住在在app.vue中“留坑”:

//app.vue中

<template>

<div>

<!-- 留坑,非常重要 -->

<router-view></router-view>

</div>

</template>

<>

exportdefault{

data(){

return{}

}

}

</>

vue-router参数传递

声明式的导航<router-link :to="...">和编程式的导航router.push(...)都可以传参,本文首要介绍前者的传参办法,相同的规矩也适用于编程式的导航。

1.用name传递参数

在路由文件src/router/index.js里装备name特点

routes: [

{

path: '/',

name: 'Hello',

component: Hello

}

]

模板里(src/App.vue)用$route.name来接纳 比方:<p>{{ $route.name}}</p>

2 经过<router-link> 标签中的to传参

这种传参办法的根本语法:

<router-link :to="{name:xxx,params:{key:value}}">valueString</router-link>

比方先在src/App.vue文件中:

<router-link:to="{name:'hi1',params:{username:'jspang',id:'555'}}">Hi页面1</router-link>

然后把src/router/index.js文件里给hi1装备的路由起个name,就叫hi1.

{path:'/hi1',name:'hi1',component:Hi1}

最终在模板里(src/components/Hi1.vue)用$route.params.username进行接纳。

{{$route.params.username}}-{{$route.params.id}}

3 运用url传递参数----在装备文件里以冒号的方式设置参数。

咱们在/src/router/index.js文件里装备路由:

{

path

:

'/params/:newsId/:newsTitle'

,

component

:

Params

}

咱们需求传递参数是新闻ID(newsId)和新闻标题(newsTitle).所以咱们在路由装备文件里拟定了这两个值。

在src/components目录下树立咱们params.vue组件,也可以说是页面。咱们在页面里输出了url传递的的新闻ID和新闻标题。

<template>

<div>

<h2>{{ msg }}</h2>

<p>新闻ID:{{ $route.params.newsId}}</p>

<p>新闻标题:{{ $route.params.newsTitle}}</p>

</div>

</template>

<>

exportdefault{

name: 'params',

data () {

return{

msg: 'params page'

}

}

}

</>

在App.vue文件里参加咱们的<router-view>标签。章鱼彩票老版app-百行代码带你入门 vue-router!这时候咱们可以直接运用url传值了

<router-link to="/params/198/jspang website is very good">params</router-link>

4. 运用path来匹配路由,然后经过query来传递参数

<router-link:to="{ name:'Query',query: { queryId: status }}">

router-link跳转Query

</router-link>

对应路由装备:

{

path: '/query',

name: 'Query',

component: Query

}

所以咱们可以获取参数:

this.$route.query.queryId

vue-router装备子路由(二级路由)

实际生活中的运用界面,一般由多层嵌套的组件组合而成。相同地,URL中各段动态途径也按某种结构对应嵌套的各层组件,例如:

怎么完结下图作用(H1页面和H2页面嵌套在主页中)?

1.首先用<router-link>标签添加了两个新的导航链接

<router-link:to="{name:'HelloWorld'}">主页</router-link>

<router-link:to="{name:'H1'}">H1页面</router-link>

<router-link:to="{name:'H2'}">H2页面</router-link>

2.在HelloWorld.vue参加<router-view>标签,给子模板供给刺进方位

<template>

<divclass="hello">

<h1>{{ msg }}</h1>

<router-view></router-view>

</div>

</template>

3.在components目录下新建两个组件模板 H1.vue 和 H2.vue 两者内容相似,以下是H1.vue页面内容:

<template>

<divclass="hello">

<h1>{{ msg }}</h1>

</div>

</template>

<>

exportdefault{

data() {

return{

msg: 'I am H1 page,Welcome to H1'

}

}

}

</>

4.修正router/index.js代码,子路由的写法是在原有的路由装备下参加children字段。

routes: [

{

path: '/',

name: 'HelloWorld',

component: HelloWorld,

children: [{path: '/h1', name: 'H1', component: H1},//子路由的<router-view>有必要在HelloWorld.vue中呈现

{path: '/h2', name: 'H2', component: H2}

]

}

]

单页面多路由区域操作

在一个页面里咱们有两个以上<router-view>区域,咱们经过装备路由的js文件,来操作这些区域的内容

1.App.vue文件,在<router-view>下面新写了两行<router-view>标签,并参加了些CSS款式

<template>

<divid="app">

<imgsrc="./assets/logo.png">

<router-link:to="{name:'HelloWorld'}"><h1>H1</h1></router-link>

<router-link:to="{name:'H1'}"><h1>H2</h1></router-link>

<router-view></router-view>

<router-viewname="left"style="float:left;width:50%;background-color:#ccc;height:300px;"/>

<router-viewname="right"style="float:right;width:50%;background-color:yellowgreen;height:300px;"/>

</div>

</template>

2.需求在路由里装备这三个区域,装备首要是在components字段里进行

exportdefaultnewRouter({

routes: [

{

path: '/',

name: 'HelloWorld',

compon章鱼彩票老版app-百行代码带你入门 vue-router!ents: {default: HelloWorld,

left:H1,//显现H1组件内容'I am H1 page,Welcome to H1'

right:H2//显现H2组件内容'I am H2 page,Welcome to H2'

}

},

{

path: '/h1',

name: 'H1',

components: {default: HelloWorld,

left:H2,//显现H2组件内容

right:H1//显现H1组件内容

}

}

]

})

上边的代码咱们编写了两个途径,一个是默许的‘/’,另一个是‘/Hi’.在两个途径下的components里边,咱们对三个区域都界说了显现内容。最终页面展现如下图:

$route 和 $router 的差异

咱们先将这两者console.log打印出来:

$route 是“路由信息目标”,包含 path,params,hash,query,fullPath,matched,name 等路由信息参数。

① $route.path字符串,对应当时路由的途径,总是解析为绝对途径,如 "/order"。

② $route.params一个 key/value 目标,包含了 动态片段 和 全匹配片段, 假如没有路由参数,便是一个空目标。

③ $route.query一个 key/value 目标,表明 URL 查询参数。 例如,关于途径 /foo?user=1,则有 $route.query.user为1, 假如没有查询参数,则是个空目标。

④ $route.hash当时路由的 hash 值 (不带 #) ,假如没有 hash 值,则为空字符串。

⑤ $route.fullPath完结解析后的 URL,包含查询参数和 hash 的完好途径。

⑥ $route.matched数组,包含当时匹配的途径中所包含的一切片段所对应的装备参数目标。

⑦ $route.name 当时途径姓名

$router 是“路由实例”目标,即运用 new VueRouter创立的实例,包含了路由的跳转办法,钩子函数等。

$router常见跳转办法:

<button @click="goToMenu"class="btnbtn-success">Let'sorder!</button>

.....

<>

export default{

methods:{

goToMenu(){

this.$router.go(-1)//跳转到上一次阅读的页面

this.$router.replace('/menu')//指定跳转的地址

this.$router.replace({name:'menuLink'})//指定跳转路由的姓名下

this.$router.push('/menu')//经过push进行跳转

this.$router.push({name:'menuLink'})//经过push进行跳转路由的姓名下

}

}

}

</>

$router.push和$router.replace的差异:

怎么设置404页面

用户会常常输错页面,当用户输错页面时,咱们期望给他一个友爱的提示页面,这个页面便是咱们常说的404页面。vue-router也为咱们供给了这样的机制。

{

path:'*',

component:Error

}

这儿的path:'*'便是输入地址不匹配时,主动显现出Error.vue的文件内容

<template>

<div>

<h2>{{ msg }}</h2>

</div>

</template>

<>

exportdefault{

data () {

return{

msg: 'Error:404'

}

}

}

</>

此刻咱们随意输入一个过错的地址时,便会主动跳转到404页面。

参阅文章

作者:浪里行舟,硕士研究生,专心于前端,运营有个人大众号前端工匠,致力于打造合适初中级工程师可以快速吸收的一系列优质文章。

【End】

声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间服务。
请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP