vue-router 4使用实例详解

目录
  • 一、安装并创建实例
  • 二、vue-router4 新特性
    • 2.1、动态路由
    • 2.2、与 composition 组合
  • 三、导航守卫
    • 3.1、全局守卫
    • 3.2、路由独享守卫
    • 3.3、组件内的守卫
  • 四、vue-router4 发生破坏性变化
    • 4.1、实例创建方式
    • 4.2、模式声明方式改变
    • 4.3、base属性被合并
    • 4.4、通配符 * 被取消
    • 4.5、isReady() 替代 onReady
    • 4.6、scrollBehavior 变化
    • 4.7、keep-alive 和 transition 必须用在 router-view 内部
    • 4.8、router-link 移除了一部分属性
    • 4.9、route 的 parent 属性被移除
    • 4.11、routes选项是必填项
    • 4.13、缺少必填参数会抛出异常

虽然 vue-router 4 大多数 API 保持不变,但是在 vue3 中以插件形式存在,所以在使用时有一定的变化。接下来就学习学习它是如何使用的。

一、安装并创建实例

安装最新版本的 vue-router

npm install vue-router@4 

或

yarn add vue-router@4

安装完成之后,可以在 package.json 文件查看vue-router的版本

"dependencies": {
 "vue": "^3.2.16",
 "vue-router": "4"
},

新建 router 文件夹,新建 index.js文件:

import { createRouter,createWebHashHistory } from "vue-router";

const routes = [
 {
  path:'',
  component:()=>import("../views/login/index.vue")
 },
 {
  path:'/home',
  component:()=>import("../views/home/index.vue")
 }
]

const router = createRouter({
 history:createWebHashHistory('/'),
 routes
})

export default router

然后在main.js 中引入 router 。

import { createApp } from 'vue'
import App from './App.vue'
import router from "./router/index"

const app = createApp(App)
app.use(router)
app.mount('#app')

注意:之前 component 引入组件的时候,后边可以省略 .vue 后缀,但在 vue-router 4这不能省略后缀,否则就报错了。

二、vue-router4 新特性

2.1、动态路由

addRoute 动态添加路由时,有两种情况,分别为:

//动态添加路由--默认添加到根
router.addRoute({
 path:'/my',
 name:'my',
 component:()=>import("../views/my/index.vue")
})

//动态添加子路由
router.addRoute('my',{
 path:'/info',
 component:()=>import("../views/my/info.vue")
})

添加子路由时,第一个属性值是父级路由的 name 属性值。

2.2、与 composition 组合

在 事件中获取 router ,进行路由跳转等操作。

<template>
  <button @click="backToHome">跳转到首页</button>
</template>

<script>
import { useRouter } from "vue-router"
export default {
 setup(){
  const router = useRouter()
  return{
   backToHome(){
    router.push("/")
   },
  }
 }
}
</script>

通过 useRouter 获取到路由之后再进行操作。也可以对当前路由route进行操作。以下是监听route.query的案例:

<template>
  <div>监听路由变化</div>
</template>

<script>
import { useRouter,useRoute } from "vue-router"
import { watch } from "@vue/runtime-core"
export default {
 setup(){
  const route = useRoute()
  //route时响应式对象,可监控变化
  watch(()=>route.query,query=>{
   console.log('最新的',query)
  })
 }
}
</script>

三、导航守卫

导航守卫主要用来通过跳转或取消的方式守卫导航,有很多种方式植入路由导航中:全局的、单个路由独享的或者组件级的。

3.1、全局守卫

router.beforeEach((to,from,next)=>{
 console.log('全局前置守卫');
})
router.afterEach((to,from)=>{
 console.log('全局后置钩子');
})

与之前的使用都一样,没有任何变化。

3.2、路由独享守卫

router.addRoute({
 path:'/my',
 name:'my',
 component:()=>import("../views/my/index.vue"),
 beforeEnter:(to,from)=>{
  console.log('路由独享守卫');
 }
})

3.3、组件内的守卫

组件内的守卫与之前使用不同,vue-router4中,需要从vue-router内引入需要的插件。

<script>
import {  onBeforeRouteLeave } from "vue-router"
export default {
 setup(){
 onnBeforeRouteLeave((to,from)=>{
  const answer = window.confirm('是否确认离开')
  if(answer){
   console.log('不离开');
   return false
  }
  })
 }
}
</script>

四、vue-router4 发生破坏性变化

4.1、实例创建方式

//以前创建方式
const router = new VueRouter({

})
new Vue({
 router,
 render:h=>h(App)
}).$mount("#app")

//vue-router4创建方式
import { createRouter } from "vue-router"
const router = createRouter({

})
createApp(App).use(router).mount("#app")

4.2、模式声明方式改变

//之前
const router = new VueRouter({
 mode:"hash"
})

//新的
import { createRouter, createWebHashHistory } from "vue-router"
const router = createRouter({
 history:createWebHashHistory()
})

之前的mode替换成了 history ,它的选项变化分别为:

  • history -> createWebHistory
  • hash -> createWebHashHistory
  • abstract -> createMemoryHistory

4.3、base属性被合并

base 选项被移至 createWebHistory 中。

//之前
const router = new VueRouter({
 base:"/"
})

//新的
import { createRouter, createWebHashHistory } from "vue-router"
const router = createRouter({
 history:createWebHashHistory('/')
})

4.4、通配符 * 被取消

//之前
{
 path:'*',
 component:()=>import("../components/NotFound.vue")
}

//vue-router 4
{
 path:'/:pathMatch(.*)*',
 component:()=>import("../components/NotFound.vue")
}
//是一个正则表达式

4.5、isReady() 替代 onReady

//之前
router.onReady(onSuccess,onError)//成功和失败回调

//vue-router 4
router.isReady().then(()=>{
 //成功
}).catch(err=>{
 //失败
})

4.6、scrollBehavior 变化

const router = createRouter({
 scrollBehavior(to, from, savedPosition) {
  // 始终滚动到顶部
  return { top: 0, left:0 }
 },
})
//之前使用的{ x:0, y:0 } 替换成了 { top: 0, left:0 }

4.7、keep-alive 和 transition 必须用在 router-view 内部

//之前
<keep-alive>
 <router-view />
</keep-alive>

//vue-router 4
<router-view v-slot="{component}">
 <keep-alive>
  <component :is="component" />
 </keep-alive>
</router-view>

4.8、router-link 移除了一部分属性

移除 append 属性

//之前
<router-link to="child" append >跳转<router-link>

//vue-router 4
<router-link :to="append( $route.path , 'child' )" append >跳转<router-link>

tag 被移除

//之前
<router-link to="/" tag="span">跳转</router-link>

//vue-router 4
<router-link to="/" custom>
 <span>跳转</span>
</router-link>

event 被移除

4.9、route 的 parent 属性被移除

4.10、pathToRegexpOptions选项被移除,其他内容替换

4.11、routes选项是必填项

4.12、跳转不存在的命名路由报错

之前跳转到不存在的路由,页面是空的,会重定向根路径,这是不合理的,所以vue3报错了。

4.13、缺少必填参数会抛出异常

4.14、命名子路由如果 path 为空的时候,不再追加 /

之前生成的 url 会自动追加一个 / ,如:"/dash/"。副作用:给设置了 redirect 选项的子路由带来副作用。

到此这篇关于vue-router 4 你真的熟练吗?的文章就介绍到这了,更多相关vue-router 4内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue3使用路由VueRouter4的简单示例

    路由 vue-router4保持了大部分API不变,我们只关注变化部分即可. 安装 yarn add vue-router@4 引入 cdn <script src="https://cdn.bootcdn.net/ajax/libs/vue-router/4.0.6/vue-router.cjs.js"></script> 使用 router.js import { createRouter, createWebHistory } from "vue

  • 如何在Vue 3中扩展Vue Router链接详解

    前言 <router-link> 标签是一个很好的工具,可以在你的Vue应用程序的不同页面之间进行导航,但当导航到一个外部链接时,它不是一个工具,为此,你应该使用一个普通的<a> 标签.也许这只是我的问题,但很多时候,我都懒得去理会这其中的差别.其他时候,链接可能是动态的,也就是说,来自数据库或一些用户提供的数据源.在这种情况下,你根本不知道这个链接是外部的还是内部的,而且在每个可能使用这个链接的地方手动做V-if是多么痛苦的事情. 如果只是用一个单一的组件来处理所有的内部和外部链

  • Vue组件选项props实例详解

    前面的话 组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 props 向下传递数据给子组件,子组件通过 events 给父组件发送消息.本文将详细介绍Vue组件选项props 静态props 组件实例的作用域是孤立的.这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据.要让子组件使用父组件的数据,需要通过子组件的 props 选项 使用Prop传递数据

  • vue自定义指令directive实例详解

    下面给大家介绍vue自定义指令directive,具体内容如下所示: 官网截图实例 vue除了一些核心的内部定义的指令(v-model,v-if,v-for,v-show)外,vue也允许用户注册自己的一些功能性的指令,有时候你实在是要对Dom操作,这个时候是自定义指令最合适的了. 来直接看例子:当页面加载时使得元素获得焦点(autofocus 在移动版 Safari 是不支持的),就是当页面加载好了,不做任何的操作使得表单自动获得焦点,光标自动在某个表单上代码如下: Vue.directive

  • vue 组件高级用法实例详解

    一.递归组件 组件在它的模板内可以递归地调用自己, 只要给组件设置name 的选项就可以了. 示例如下: <div id="app19"> <my-component19 :count="1"></my-component19> </div> Vue.component('my-component19',{ name: 'my-component19', //其实当你利用 Vue.component 全局注册了一个组件

  • Vue 中axios配置实例详解

    1.GET 请求 //向具有指定ID的用户发出请求 axios.get('/user?ID=12345') .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); // 也可以通过 params 对象传递参数 axios.get('/user', { params: { ID: 12345 } }) .then(function (respons

  • vue鼠标悬停事件实例详解

    具体代码如下所述: v-bind:title="message" <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue实例化</title> </head> <script src="https://cdn.jsdelivr.net/npm/vue/dis

  • vue interceptor 使用教程实例详解

    二次封装axios,根据参数来实现多个请求多次拦截 1. 新建 axiosTool.js 文件,设置请求拦截和处理的逻辑 import Vue from 'vue' import axios from 'axios' //取消请求 let CancelToken = axios.CancelToken //设置默认请求头,如果不需要可以取消这一步 axios.defaults.headers = { 'X-Requested-With': 'XMLHttpRequest' } // 请求超时的时

  • vue+VeeValidate 校验范围实例详解(部分校验,全部校验)

    搜索很久,没有发现有关于vue+VeeValidate部分校验的.自己写一个. 主要是两个场景: 1. 校验范围内,所有的字段. 2. 校验全局所有字段. 主要方法: 1.validate(fields, scope) 2. validateAll(fields) 场景: 遍历得到多个列表,每一个列表都可以独立保存当前列表.在保存当前列表的时候,需要校验当前列表输入框的合法性. 代码: <div class=" col-xs-12 col-md-6 col-lg-4" v-for

  • vue的过滤器filter实例详解

    前记: 排版记录,点耽误时间,我就简单的来,下面是一个vue 过滤器的写法,demo 演示,限制一个字符串的长度. vue filter 的官网介绍 https://cn.vuejs.org/v2/guide/filters.html 下面就具体拿自己的一个例子介绍: 某个filter.js // 限制汉字的个数 export const limitWordLength = Vue.filter('limitWordLength', (str, length, sufix) => { /* es

  • Vue自定义指令v-focus实例详解

    目录 前言 自定义指令 directive 项目实际使用 技术背景 实际操作 优势 setTimeout(fn, 0) 永远的神 $nextTick(callback) 小结 前言 本文直接参考vue2.0官方文档, 并演示博主项目中的使用 自定义指令 directive 除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令.注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件.然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就

  • Vue 自定义动态组件实例详解

    现在基于vue的UI组件库有很多,比如iview,element-ui等.但有时候这些组件库满足不了我们的开发需求,这时候我们就需要自己写一个插件. 举第一个栗子 用vue-cli搭建好项目目录之后,在src/components下面新建一个文件夹放我们要写的插件,如图所示: index.vue里写我们的组件,代码如下: index.js里面写index.vue的install方法,并用Vue.component注册组件,代码如下: 接下来我们要在默认的main.js里将刚刚写的index.js

随机推荐