在vue-cli中使用vue-router的学习笔记

2023-05-16

以前不会vue-cli的时候学过router,当时的写法和在vue-cli中的写法还是有一些不一样的,但是我以后应该还是会用vue的单文件写小程序啊什么的所以我就吧我学习的过程全部记录下来

router创建

那么问题来了main.js是如何接收,接收的是什么,和怎么书写?

下面我们来一一解答

首先我们在src的文件下新建一个router文件,下的index.js我们在js中引入vue组件,配置router,导出router

1.引入的方法 import

2.导出的方法 export default router

代码是:

//第二步引入
import Vue from 'vue'
import VueRouter from 'vue-router'
import Hmoe from '../components/Home.vue'
import Question from '../components/Question.vue'
import Vip from '../components/Vip.vue'
import Course from '../components/Course.vue'


//第三步:作为vue的插件
Vue.use(VueRouter)

//创建实例 加入配置
const router = new VueRouter({
    routes:[
        {
            path:'/home',
            component: Hmoe
        },
        {
            path:'/vip',
            component: Vip
        },
        {
            path:'/coures',
            component:Course
        },
        {
            path:'/question',
            component:Question
        }

    ]
});

//吧router导出,这样外面的main才可以用 
//为模块指定默认输出
export default router

那么大家看到上面的代码可能没有基础的不知道import Course from '../components/Course.vue'他其实就是我们在components文件下写的Course.vue的这个文件,被传到了上面的index.js这个文件

VS code 怎么样在vue文件中有快捷生产HTML格式

1、选择“文件 -> 首选项 -> 用户代码片段”,此时,会弹出一个搜索框,输入vue

     选择vue后,编辑器会自动打开一个名字为vue.json的文件

2.在复制下面的代码,放进去就可以了

  "Print to console": {
    "prefix": "vue",
    "body": [
      "<template>",
      "  <div class='page'>$0</div>",
      "</template>",
      "",
      "<script>",
      "export default {",
      "  data () {",
      "    return {",
      "",
      "    }",
      "  },",
      "  components: {",
      "",
      "  },",
      "}",
      "",
      "</script>",
      "<style>",
      "</style>"
    ],
    "description": "Log output to console"
  }
}

Hash和history模式

在router创建的实例中加入mode属性(以下代码为截取的一部分)

#/<路由地址> hash模式 :无刷新

但是当是以<router-link>来实现路由跳转的时候to属性会自动添加hash模式中的#号to属性的值就是我们路由跳转的地址

/<路由地址> history模式 :会去请求后端接口在用back,forword,go的方法的时候,当是如果使用pushState和reolaceState方法的时候,这两的方法就可以实现前端路由的目的所以vue-router是通过hash和history这两种模式来控制路由

const router = new VueRouter({
    mode: 'hash',  //默认情况
})

router-link的相关配置

1.默认router-link是生成的a标签,tag属性可以自定义我们需要生成的标签

2.自动加上了#(hash模式是要加#的)

3.to属性固定我们需要去的路由,:to动态告诉我们要去的路由

4.默认情况下router-link上加active-class属性是支持点击事件的情况下设置的样式

5.跟换默认的事件 events="事件名"

6.全局设置 链接激活时使用的 CSS 类名。默认值可以通过路由的构造选项 linkActiveClass 来全局配置linkActiveClass:'activeClass',

7.模糊匹配:意思就是 /vip 其实他包含了["/","/vip"]两项所以就是不写/,或者在to=/的项上添加 exact(精准匹配) 就可以了

嵌套路由

这里的定义了一个/vip的路由,但是当我们要嵌套一些子路由就要添加children这个属性在这个属性中定义一个数组在这个数组中在定义一些路由的对象

要注意,以 / 开头的嵌套路径会被当作根路径。 这让你充分的使用嵌套组件而无须设置嵌套的路径

    {
      path: '/vip',
      component: Vip,
      children: [
        {
          path: 'one',    //这里不可以加/他会主动的生成,加了会报错,只有子路由可以这样
          component: VipNoe
        },
        {
          path: 'two',
          component: VipTwo
        },
        {
          path: 'three',
          component: VipThree
        },
      ]
    },

vip.vue文件 

<template>
  <div class='page'>
      <h1>我是Vip</h1>
      <div class="nav">
        <ul>
          <router-link to='/vip/one' tag='li'><a href="#">一级会员</a></router-link>
          <router-link to="/vip/two" tag='li'><a href="#">二级会员</a></router-link>
          <router-link to='/vip/three' tag='li'><a href="#">三级会员</a></router-link>
        </ul>  
      </div>
      <div class="view">
        <router-view></router-view>
      </div>
      
  </div>
</template>

 

命名路由

给某一个路由添加一个name属性

    {
      path: '/question',
      //命名路由
      name: 'wd',
      component: Question
    },

再在<router-link>上这样写

 <!-- <router-link :to="{name:'wd'}">问答</router-link> -->

一般的情况<router-link> 上的to属性值的 为路由的地址,但是也可以是含有name属性的对象

命名路由的好处

通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候。你可以在创建 Router 实例的时候,在 routes 配置中给某个路由设置名称。

const router = new VueRouter({
  routes: [
    {
      path: '/user/:userId',
      name: 'user',
      component: User
    }
  ]
})

要链接到一个命名路由,可以给 router-link 的 to 属性传一个对象:

<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>

这跟代码调用 router.push() 是一回事:

router.push({ name: 'user', params: { userId: 123 }})

这两种方式都会把路由导航到 /user/123 路径。(上面的用法下面会由讲的)

命名视图

在路由上这样写

    {
      path: '/home',
      // component: Hmoe,
      //命名视图editorconfig
      components: {
        default: Home,  //默认的视图显示的组件
        left: HomeLeft, //name为left的视图 显示HomeLeft组件
        right: HomeRight //name为right的视图 显示HomeRighr组件
      }
    },

在<router-view>上这样写,没name代表默认值default

<router-view ></router-view>
<router-view name="left"></router-view>
<router-view name="right"></router-view>

重定向和别名

    //重定向:从A到B 这里是从/hello到/course
    {
      path: '/hello',

      redirect: '/vip', //跳转到的页面,字符串写法

      redirect: '{name:"wd"}', //对象写法

      redirect: (to) => {     //函数的写法
          to 路由信息对象
          if(to.hash) {
              return '/course'
          }else{
              return '/vip'
          }
      }

      //别名:他的另一个名字
      alias: '/hi'   //意思就是不管是/hello 还是 /hi 都指向redirect的值或component的值
    },

component:属性值是某一个vue的组件,上面有些案例

redirect:属性值是要跳转的页面,因为有定义过/vip 这个路由,所以会去/vip这个路由中规定的component的值。

这里的to是路由的信息对象;hash就是/后的值

编程方式导航

通过js的方法去改变,路由的行为

      <div class="main">
        <h1>编程式导航:</h1>
        <p>
          <button @click="pushHandel">push</button>
          <button @click="replaceHandel">replace</button>
          <!-- 回退 -->
          <button @click="backHandle">back</button>  
          <!-- 前进 -->
          <button @click="forwardHandle">forward</button>
          <!-- 在go方法中的参数,正数代表前进,负数代表后退   -->
          <button @click="goHandle">go</button>
        </p>
      </div>
    </div>

Vue({})中参数对象的值

  methods: {
    pushHandel () {
      //console.log(this.$router)
      //$router写在了main.js中所以可以使用了就跟使用this.$data是同一个道理
      //这里的this.$router中有很多方法
      //方法一
      //push是给浏览器记录栈(history)添加一项,表意为跳转了一下,但是是有新纪录的
      this.$router.push('/question');
    },
    replaceHandel(){
      //replace是给浏览器记录栈(history)添加一项,表意为跳转了一下,但是不会有新纪录的,他只是替换了记录
      this.$router.replace('/question')
    },
    backHandle(){
      //后退
      this.$router.back();
    },
    forwardHandle(){
      //前进
      this.$router.forward();
    },
    goHandle(){
      //在go方法中的参数,正数代表前进,负数代表后
      this.$router.go(2);
    }
  }

多种写法

// 字符串
router.push('home')

// 对象
router.push({ path: 'home' })

// 命名的路由
router.push({ name: 'user', params: { userId: '123' }})

// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})

注意:如果提供了 pathparams 会被忽略,上述例子中的 query 并不属于这种情况。取而代之的是下面例子的做法,你需要提供路由的 name 或手写完整的带有参数的 path

params:一个 key/value 对象,包含了动态片段和全匹配片段,如果没有路由参数,就是一个空对象,当匹配到一个路由时,参数值会被设置到 this.$route.params,可以在每个组件内使用

$route.query:一个 key/value 对象,表示 URL 查询参数。例如,对于路径 /foo?user=1,则有 $route.query.user == 1,如果没有查询参数,则是个空对象。

const userId = '123'
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// 这里的 params 不生效
router.push({ path: '/user', params: { userId }}) // -> /user

同样的规则也适用于 router-link 组件的 to 属性。

动态路由匹配

    {
      // 动态路径参数 以冒号开头,这里的id类型与一个变量,
      path: '/user/:id?', //?:代表0或1
      component: user,
      props: true, //当这个的props的值为true的时候,这个ID属性就可以传给组件
    },

那么这样我就可以不管   /user/*     /后面的*是什么都可以匹配,没有值也是可以的

那么在子组件接收的方式有

1.$route.params.id

const User = {
  template: '<div>User {{ $route.params.id }}</div>'
}
const router = new VueRouter({
  routes: [
    { path: '/user/:id', component: User }
  ]
})

2.通过props

const User = {
  props: ['id'],
  template: '<div>User {{ id }}</div>'
}

动态路由监听

方法一:beforeRouteUpdtate

方法二:使用watch监听改变

    //动态监听一

//   //就是相/user/1 -> 向/user/2切换的是触发的全局钩子事件
  beforeRouteUpdate(to, from, next) {
    //to: Route: 即将要进入的目标 路由对象
    //from: Route: 当前导航正要离开的路由
    //next:进行管道中的下一个钩子(也就是我们点击的)
    this.userInfo = this.userList.filter(item => {
      return item.id === to.params.id;
    })[0];
    // console.log(this.userInfo);不知道为什么会警告
    next();
  },
  //改变后触发事件
    watch: {
        $route () {
            //console.log(this.$route) 这个就是上面的 to 参数的值一样都是路由信息对象
        }
    }

 

全局钩子和路由元信息meta字段

路由元信息meta字段是在配置rouer中的数组对象中添加的用来给一个依据,以便钩子函数来做判断

    {
      path: '/vip',
      component: Vip,
      //路由元信息meta字段
      meta: {
        require: true //这里只是为了判断他是否要登录
      },
挂载进入路由之前,是在进入路由之前执行 全局钩子会影响所有的路由
router.beforeEach((to, from, next) => {
    //console.log('进入路由之前执行',to.meta);
     //导航守卫
    if (to.meta.require) {
        //需要登入
        //判断是否已经登录
        //跳转next(参数为需要跳转的路由)
        next(); //没有这个无法进入我们点击的路由,所以我们通过控制他来实行导航守卫
    }else{
        next()
    }
})
挂载进入路由之后,是在进入路由之后执行
router.afterEach((to , from) => {
    if(to.meta.title){
        document.title = to.meta.title;
    }else{
        document.title = '曾皙的第二个router';
    }
})

路由里的钩子

    {
      path: '/coures',
      component: Course,
      // 写在路由里面的钩子函数
      // beforeEnter(to,from,next){
      //     //进入之前执行,和全局的写法不一样
      //     next();
      // }
    },

组件里的钩子

export default {
  data () {
    return {

    }
  },
  components: {

  },
  //组件中的钩子函数
  // befoerRouteEnter(to,from,next){
  //   //进入之前调用
  // },
  // beforeRouterLeave (to,from,next){
  //   //离开后执行
  // }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在vue-cli中使用vue-router的学习笔记 的相关文章

  • js中的预编译和作用域链

    预编译目的 1 定义作用域中的初始化词法环境 xff0c 而词法环境中有定于作用域 xff0c 从而规定了变量的作用域 2 先是在为undefined xff0c 减少运行时报错 形参去实参的区别 1 形参变量只有在被调用时才分配内存单元
  • ffmpeg视频处理神器学习基础笔记

    FFmpeg文档汇总 xff1a https ffmpeg org documentation html FFmpeg filters文档 xff1a https ffmpeg org ffmpeg filters html 视频处理 视频
  • Vue.js动画和过渡

    vue中的过渡与动画 过滤 把需要添加动画效果的DIV放到transition标签 之后就会发生以下3个步骤 自动嗅探目标元素是否应用了 CSS 过渡或动画 xff0c 如果是 xff0c 在恰当的时机添加 删除 CSS 类名 等下要写的6
  • Vue.js使用keyframes动画

    lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt Vue中css动画的原理 lt title gt lt scrip
  • Vue.js使用animate.css框架

    1 如何使用animate框架 lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt Vue中css动画的原理 lt t
  • vue.js中添加动画

    通过触发事件 xff0c 改变data中的值 xff0c 或者改变点击标签元素上的属性值 lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 6
  • 多个元素和列表的过渡

    多个元素 lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt title gt 多个元素的组件的过渡动
  • flex弹性布局的学习

    布局的传统解决方案是基于盒状模型 xff0c 依赖 display 43 position 43 float 方式来实现 xff0c 灵活性较差 2009年 xff0c W3C提出了一种新的方案 Flex xff0c Flex是Flexib
  • 震惊!Ajax项目中的使用

    啊啊 xff01 实习第一天写了个移动端的分享列表 就在第三天我们的技术大佬亲自教我们如何对接后台 当然用的是我写的移动端的分享列表 虽然这次应用不是很深入 xff0c 但还是比较广泛 用到了Ajax xff0c sui框架 zepto x
  • 关于viewport视口的学习

    简单来说 lt meta name 61 34 viewport 34 content 61 34 width 61 device width initial scale 61 1 0 34 gt content属性值 width 可视区域
  • 淘宝的H5布局

    利用viewport和rem布局实现的淘宝布局 下面先看看em布局的原理 em作为font size的单位时 xff0c 其代表父元素的字体大小 xff0c em作为其他属性单位时 xff0c 代表自身字体大小 MDN em作为字体单位 x
  • css的优先级

    优先级 浏览器通过优先级来判断哪些属性值与一个元素最为相关 xff0c 从而在该元素上应用这些属性值 优先级是基于不同种类选择器组成的匹配规则 优先级是如何计算的 优先级就是分配给指定的 CSS 声明的一个权重 xff0c 它由 匹配的选择
  • Django设置分享到微信好友和朋友圈时的标题、摘要、链接和图片

    主要参考官方文档 1 前端分享给好友和朋友圈的js代码 share html lt DOCTYPE html gt lt html lang en gt lt head gt lt meta charset UTF 8 gt lt meta
  • 孙其功陪你学之——如何将shell命令的返回值赋值给应用程序的变量

    如何将shell命令的返回值赋值给应用程序的变量 博主最近做了个路由器的项目 xff0c 需要得到路由器现在网络状态和参数 xff0c 使用UCI get 获得 xff0c 但是使用了system xff08 UCI get xff09 之
  • shell编程2条件语句

    文章目录 shell编程之条件语句1 条件测试1 1 返回值1 2 test 2 文件测试3 整数值比较4 逻辑测试5 if语句5 1 单分支 if 语句5 2 双分支 if 语句5 3 多分支 if 语句 6 case 语句7 实验7 1
  • html和css的hack的学习

    在整理基础的时候总结 html和css的hack的学习 hack是什么 xff1f 就是针对不同的浏览器写不同的css样式让各浏览器能达到一致的渲染效果 xff0c hack分为HTML和CSS HTML hack lt if lte IE
  • 数组的迭代与归并的方法

    迭代的作用 xff1a 减少代码量 xff1a 例如因为map xff0c filter方法会自动生产数组不用自己在for创建 xff0c 有利于性能优化 xff1b 和无需知道对象的长度 补充19 6 11 xff1a 迭代的方法是表达式
  • js数组的常见属性和方法

    属性 strong length strong 是Array的实例属性 返回或设置一个数组中的元素个数 该值是一个无符号 32 bit 整数 xff0c 并且总是大于数组最高项的下标 xff0c 不只是可读 Array prototype
  • js闭包的作用和应用的学习

    什么是闭包 一个函数和对其周围状态 xff08 lexical environment xff0c 词法环境 xff09 的引用捆绑在一起 xff08 或者说函数被引用包围 xff09 xff0c 这样的组合就是闭包 xff08 closu
  • css面试题布局

    不试试怎么知道自己行不行 昨天加了张鑫旭的微信 xff0c 我草贼开心 xff0c 发现他星期六会直播 xff0c 一下就是我看直播学到的一些总结 那么是什么呢 xff1f 其实就是一个简单的左右排版 xff0c 在张老师的讲了4种不是很好

随机推荐

  • 获取css的方法区别

    不试试怎么知道自己不可以 xff1f 对吧 首先我们要知道css在HTML中有多少总方法 xff1f 呵呵大家都知道的 行内 xff1a 顾名思义就是和标签在同一行 lt div class 61 34 text 34 style 61 3
  • 关于offsetLeft和offsetTop的兼容性问题

    不试一下怎么知道自己不可以 xff1f 首先我们要看下offsetLeft和offsetTop他们两的API的作用 xff1b 元素相对于offsetParent的左边距和上边距 xff08 为什么没有bottom xff0c right呢
  • js深度拷贝和浅度拷贝的深入理解

    首先我们来说说什么是拷贝 xff1a 就是复制的同时加上了传值 然后问题就来了什么是有深度的什么是浅度的 xff0c 在想要了解我们这个问题之前我们先来了解一下下面的一个知识点 基本类型传递 xff0c 引用类型传递 首先我们来看下基本类型
  • npm的基本使用

    npm的下载 npm的下载其实就是把node js 百度下node官网 下载好了那么npm就附带下载好了 检查是否下载好 window 43 r 后输入cmd打开终端 xff0c 在终端中输入node v xff1b npm v 他们会输出
  • 从 (a==1&&a==2&&a==3) 成立中看javascript的隐式类型转换

    几天上班看到一个题目就是 if a 61 61 1 amp amp a 61 61 2 amp amp a 61 61 3 console log 34 a等于什么才会输出这一句话呢 xff1f 34 当a为什么的时候输出 xff1a a等
  • Bootstrap实用功能总结

    导航栏 xff1a navbar 导航栏容器可以包含以下几个常用组成 xff1a 1 品牌LOGO xff08 navbar brand xff09 2 导航菜单 xff08 navbar nav xff09 3 导航文本 xff08 na
  • 微信小程序的AJAX初次体验

    GET请求 微信小程序用GET传送数据 微信小程序通过 wx request发送ajax请求 wx request url app globalData pubSiteUrl 43 39 user information get infor
  • vue总结系列 ------ 组件之间的传值

    原因 半年前开始学Vue学到了今天 xff0c 也没有机会好好整理一下自己的知识点 xff0c 因为上公司的项目不是依赖于Vue xff0c 还是在用JQ 和文件之间来传递代码 xff0c 所以其实在对vue的学习成面上来讲对我的帮助并不大
  • vue总结系列 --- 插槽slot

    前因 这个是我这个系列的第二篇 这一篇文章我也修改过三次 xff08 2019 9 10 xff09 我是想以vue官方文档为基础 xff0c 来进行理解 xff0c 有人说有官方文档 xff0c 还要写自己的文章干嘛 xff0c 我的用意
  • vue总结系列 --- 生命周期

    前言 在总结其他的时候发现还是应该先复习vue的生命周期 xff0c 所以就先把生命周期先复习完了 经过一系列的视频 xff0c 文档我把我的总结写一下生命周期分为3个阶段 xff1a 创建 xff0c 更新 xff0c 和销毁 我们看图说
  • vue总结系列 ---- 响应式原理

    检测变化 vue是数据驱动的视图框架DOM是通过数据映射的 xff0c 只有数据改变 xff0c DOM才改变 那么数据是怎么来的呢 xff1f 1 来自父元素的属性 xff08 prop xff09 2 来自组件的自身状态 xff08 d
  • Object.defineProperty()的学习了解

    背景 最近在总结vue系列的时候是看到响应原理的时候 看到一个新的知识点也就是我们的标题Object defineProperty 的时候 xff0c 好了话不多说 xff0c 我们来看看这个是怎么使用的 开始 strong Object
  • vue总结系列 ----- 单向数据流

    可能很多人都以为vue的双向绑定其实是错误的 xff0c vue真正的是单向数据流 xff0c vue的双向绑定只不过是语法糖 我的理解是 xff1a model层 xff1a data对象中的数据 xff0c 或后台传过来的数据 view
  • vue总结系列 ---- 在组件上的v-model单向数据流

    背景 目前是在复习vue原理的过程中 xff0c 前端负责人知道我最近在复习vue xff0c 跟我说要我看组件上的v model 我一听本来是不想放在心上的 xff0c 刚好那天晚上没什么事干想看一下 xff0c 毕竟负责人 xff0c
  • ES6 函数扩展

    参数默认值 也就是说现在ES6对函数中的参数添加了默认值 我们在ES5种的处理 function Fn a b b 61 b 34 nodeing 34 return a 43 b console log Fn 34 hello 34 这样
  • ES6 对象扩展

    对象简写 对象中又分了属性和方法的简写 在es5中 xff0c 有这样一种写法 var name 61 34 xiaoqiang 34 var age 61 12 var obj 61 name name age age 在es6中 xff
  • Bootstrap基础学习笔记

    网格系统 row定义一行 col均分列数 xff0c 最多一行12列 每列左右间隙各15px col 1到12 定义在所有屏幕下的列宽 col sm md lg xl 1到12 定义在指定屏幕下该列占据的列宽 xff0c sm 屏幕 gt
  • ES6 Symbol用法

    Symbol用法 什么是Symbol Symbol是es6中一种新增加的数据类型 xff0c 它表示独一无二的值 es5中我们把数据类型分为基本数据类型 xff08 字符串 数字 布尔 undefined null xff09 和引用数据类
  • img标签中的src在绝对引用的时候的问题

    昨天晚上我一个朋友目前在培训 xff0c 他在群里问了下img标签如何绝对路径引用 xff0c 我当时就笑了这个就是培训机构的老师 xff0c 就大概看了一下就告诉我朋友那里错了 xff0c 但是却出来不 xff0c 我就想自己写一个dem
  • 在vue-cli中使用vue-router的学习笔记

    以前不会vue cli的时候学过router xff0c 当时的写法和在vue cli中的写法还是有一些不一样的 xff0c 但是我以后应该还是会用vue的单文件写小程序啊什么的所以我就吧我学习的过程全部记录下来 router创建 那么问题