加入收藏 | 设为首页 |

安博电竞网页版-百行代码带你入门 vue-router!

海外新闻 时间: 浏览:375 次

作者 | 浪里行舟

责编 | 胡巍巍


前语


要学习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文件中
const router = new VueRouter({
  mode: 'history',
  routes: [...]
})

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

所以,你要在服务端增加一个掩盖一切状况的候选资源:假如 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、运用路由模块来完结页面跳转的办法

  • 办法1:直接修正地址栏

  • 办法2:this.$router.push(‘路由地址’)

  • 办法3:<router-link to="路由地址"></router-link>


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}]}); 

5:将其路由目标安博电竞网页版-百行代码带你入门 vue-router!传递给Vue的实例,options中参加 router:router

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

详细完结请看如下代码:

//main.js文件中引进
import Vue from 'vue';
import VueRouter from 'vue-router';
//主体
import App from './components/app.vue';
import Home from './components/home.vue'
//装置插件
Vue.use(VueRouter); //挂载特点
//创立路由目标并装备路由规矩
let router = new VueRouter({
    routes: [
        //一个个目标
        { path'/home'component: Home }
    ]
});
//new Vue 发动
new Vue({
    el'#app',
    //让vue知道咱们的路由规矩
    router: router, //可以简写router
    render: c => c(App),
})

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

//app.vue中
<template>
    <div>
        <!-- 留坑,非常重要 -->
&nb安博电竞网页版-百行代码带你入门 vue-router!sp;       <router-view></router-view>
    </div>
</template>
<script>
    export default {
        data(){
            return {}
        }
    }
</script>


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>
<script>
export default {
  name'params',
  data () {
    return {
      msg'params page'
    }
  }
}
</script>

在App.vue文件里参加咱们的<router-view>标签。这时候咱们可以直接运用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>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <router-view></router-view>
  </div>
</template>

3.在components目录下新建两个组件模板 H1安博电竞网页版-百行代码带你入门 vue-router!.vue 和 H2.vue 两者内容相似,以下是H1.vue页面内容:

 <template>
  <div class="hello">
    <h1>{{ msg }}</h1>
  </div>
</template>
<script>
  export default {
    data() {
      return {
        msg'I am H1 page,Welcome to H1'
      }
    }
  }
</script>

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>
  <div id="app">
    <img src="./assets/logo.png">
       <router-link :to="{name:'HelloWorld'}"><h1>H1</h1></router-link>
       <router-link :to="{name:'H1'}"><h1&g多动症t;H2</h1></router-link>
    <router-view></router-view>
    <router-view name="left" style="float:left;width:50%;background-color:#ccc;height:300px;"/>
    <router-view name="right" style="float:right;width:50%;background-color:yellowgreen;height:300px;"/>
  </div>
</template>

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

export default new Router({
    routes: [
      {
        path: '/',
        name: 'HelloWorld',
        components: {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="btn btn-success">Let's order!</button>
.....
<script>
  export default{
    methods:{
      goToMenu(){
      安博电竞网页版-百行代码带你入门 vue-router!  this.$router.go(-1)//跳转到上一次阅读的页面
        this.$router.replace('/menu')//指定跳转的地址
        this.$router.replace({name:'menuLink'})//指定跳转路由的姓名下
        this.$router.push('/menu')//经过push进行跳转
        this.$router.push({name:'menuLink'})//经过push进行跳转路由的姓名下
      }
    }
  }
</script>

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

  • 运用push办法的跳转会向 history 栈增加一个新的记载,当咱们点击阅读器的回来按钮时可以看到之前的页面。

  • 运用replace办法不会向 history 增加新记载,而是替换掉当时的 history 记载,即当replace跳转到的网页后,‘撤退’按钮不能检查之前的页面。


怎么设置404页面


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

  1. 设置咱们的路由装备文件(/src/router/index.js)

{
   path:'*',
   component:Error
}

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

  1. 在/src/components/文件夹下新建一个Error.vue的文件。简略输入一些有关过错页面的内容。

<template>
    <div>
        <h2>{{ msg }}</h2>
    </div>
</template>
<script>
export default {
  data () {
    return {
      msg'Error:404'
    }
  }
}
</script>

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

参阅文章

  • vue-router 2.0一些差异

  • 技能胖的Vue-router视频教程

  • vue-router完结单页面路由原理

  • vue中$router以及$route的运用

  • Vue.js——vue-router 60分钟快速入门

  • Vue2.0 探究之路——vue-router入门教程和总结

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

【End】

作为码一代,想教码二代却无从下手:

传闻少儿编程很火,可它有哪些优点呢?

孩子多大开端学习比较好呢?又该怎么学习呢?

最新的编程教育方针又有哪些呢?

下面给我们介绍CSDN新成员:极客宝宝(ID:geek_baby)

戳他了解更多↓↓↓

 热 文 推 荐 

不得了!这个 AI 让企业家、技能人员、投资人同台“互怼”

“拳打”苹果“脚踢”三星,荣耀 20 DXO 全球第二,仅次华为 P30!

直接拿来用!前端怎么快速完结跨渠道开发?

谷歌临时工达 12 万,外包程序员的出路在哪里?

☞直接拿来用!灵跃模组机器人硬核评测(编程篇)

IEEE 回应制止华为系审稿人;WiFi联盟、蓝牙联盟已康复华为成员资历;我国计算机学会:暂时中止与IEEE通讯学会协作……

敲诈团伙将黑手伸向宅男, 你在家看不行描绘的视频, 竟被骗走100万美元!

各方最新回应!怎么看待IEEE官方声明“学术禁令”?

代码整齐之道-编写 Pythonic 代码

☞敲代码时,程序员戴耳机究竟在听什么?

你点的每个“在看”,我都仔细当成了喜爱