vue-router中的参数传递

news2024/11/20 22:40:10

文章目录

  • 前言
  • 一、本文章中练习需要的准备工作
    • 暴力引入bootstrap
    • 安装Vue Router
  • 二、项目基本架构
    • 1. 配置router文件
    • 2. 写入路由组件 一级路由
    • 3. 二级路由 实现传参
      • 3.1 使用params 传参
        • 3.1.1 在router文件下配置二级路由
        • 3.1.2 在view文件下新建二级路由组件
        • 3.1.3 在上一级路由组件配置router-link
        • 3.1.4 运行结果 - params
      • 3.2 使用query传参
        • 3.2.1 在router文件下配置二级路由
        • 3.2.2 在一级路由组件配置router-link
        • 3.2.3 在目的路由组件内 -- Detail.vue
        • 3.2.4 运行效果 -- query
      • 3.2 使用props传参
        • 3.1.1 props 键值对形式 key-value (不推荐使用)
          • 3.1.1.1 修改router/index.js
          • 3.1.1.2 目的路由组件引入
          • 3.1.1.3 实现效果
        • 3.1.2 props 值为布尔值(推荐)
          • 3.1.2.1 修改router/index.js
          • 3.1.2.2 在Vprops组件中
          • 3.1.2.3 在Detail组件中
        • 3.1.3 props 值为函数(推荐)
          • 3.1.3.1 ① 修改router/index.js 完整版
          • 3.1.3.1 ② 修改router/index.js 解构赋值
          • 3.1.3.2 在Vprops组件中
          • 3.1.3.3 在Detail组件中
          • 3.1.3.4 实现效果


前言

希望我能从事web前端开发工作,文章写得啰嗦无厘头还请见谅,个人学习拙见,学得好的朋友能快速找到关键代码,和我一下还在学习阶段的朋友可以慢慢看步骤操作。


一、本文章中练习需要的准备工作

本文章就简单练习在路由中参数传递,样式简单点就好了。

  1. 暴力引入bootstrap
  2. 安装Vue Router

暴力引入bootstrap

  1. 在项目文件中的public文件夹中新建css文件夹。
  2. 把bootstrap.css文件放入新建的css文件夹。
  3. 在public文件夹下的index.html 在head标签内引入下方代码 👇 然后保存。
<link rel="stylesheet" href="<%= BASE_URL %>./css/bootstrap.css">

Bootstrap官方文档 👉Bootstrap v4 中文文档

示例代码:

在这里插入图片描述

安装Vue Router

大致了解一下在vue2项目中的vue-router版本版本是vue-router@3
vue3则是vue-router@4 官方文档👉 安装|Vue Router
本文章是在vue2项目中练习。

在npm下

npm install vue-router@3

在yarn下

yarn add vue-router@3

运行示例图:
在这里插入图片描述

二、项目基本架构

  1. 配置router文件导出并引用
  2. 路由组件分类

基本结构示例图:

在这里插入图片描述

1. 配置router文件

1-1 在src文件下新建router文件夹,在router文件夹下创建index.js文件,基本配置代码如下:

// 引入Vue 和 VueRouter
import Vue from 'vue'
import VueRouter from 'vue-router'
// 引入需要匹配路由规则的一级子组件
import Vparams from '@/view/Vparams'
import Vprops from '@/view/Vprops'
import Vquery from '@/view/Vquery'

// 把router挂载到vue实例对象上
Vue.use(VueRouter)

// 开始匹配路由规则啦
// 记得导出(暴露)去main.js 引用!
export default new VueRouter ({
  routes: [
    // 重定向也是通过 routes 配置来完成,下面例子是从 /vparams 重定向到 / 
    // 重定向可以实现我们已进入时就显示首要展示的页面
    { path: '/', redirect: '/vparams' },
    { path: '/vparams', component: Vparams,},
    { path: '/vprops', component: Vprops },
    { path: '/vquery', component: Vquery }
  ]
})

1-2 在main.js中引入router文件,基本配置代码如下:

import Vue from 'vue'
import App from './App.vue'
// 1. 引入router文件,这里可以省略index.js 默认找文件夹下的index文件
// 完整写法 import router from '@/router/index.js'
import router from '@/router'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  // 2. 挂载
  // 键值对一样可省略,完整写法: router: router 
  router
}).$mount('#app')

2. 写入路由组件 一级路由

2-1 本文章想练习query、params、props传参,所以路由组件按它们三命名。
这里就只展示一个算了。
Vquery.vue 代码示例:

<template>
  <div>
    <h2 style="color:orange">我是Vquery组件</h2>
    <hr/>
    <ol>
      <li v-for="(q, id) in queList" :key="id">{{q.msg}}</li>
    </ol>
  </div>
</template>

<script>
export default {
  name: 'Vquery',
  data() {
    return {
      queList: [
        { id: 1, msg: '跳转路由并携带query参数 to的字符串写法' },
        { id: 2, msg: '跳转路由并携带query参数 to的对象写法' },
      ]
    }
  }
}
</script>

2-2 在App.vue组件中引入
注意:router-link 组件支持用户在具有路由功能的应用中 (点击) 导航。 通过 to 属性指定目标地址,默认渲染成带有正确链接的 a 标签,可以通过配置 tag 属性生成别的标签.。

通过 router-link 进行跳转不会跳转到新的页面,也不会重新渲染,它会选择路由所指的组件进行渲染,避免了重复渲染的“无用功”。

router-view 渲染路径匹配到的视图组件,也可粗略的理解为插槽路由目的地址将在此标签内渲染。

<template>
  <div>
    <!-- 无需路由的组件称为一般组件 -->
    <Jumbotron/>
    <nav class="nav nav-pills flex-column flex-sm-row">
      <router-link class="flex-sm-fill text-sm-center nav-link" active-class="active" to="/vparams">vparams</router-link>
      <router-link class="flex-sm-fill text-sm-center nav-link" active-class="active" to="/vprops">vprops</router-link>
      <router-link class="flex-sm-fill text-sm-center nav-link" active-class="active" to="/vquery">vquery</router-link>
    </nav>
    <!-- 路由占位符 我们点击的组件内容将在这展示 -->
    <router-view></router-view>
  </div>
</template>

<script>
import Jumbotron from '@/components/Jumbotron'
export default {
  name: 'App',
  components: { Jumbotron }
}
</script>

2-3 运行效果 一级路由

在这里插入图片描述

3. 二级路由 实现传参

3.1 使用params 传参

params参数:属性 路径的一部分,需要注意在配置路由的时候需要占位
若指定params参数可传可不传,在配置路由的时候在占位的后面加上一个问号即可:
path: ‘detail/:id/:msg?’
但是这样如果传递是个空串,url会出错,解决方案:
params: {msg: ‘’ || undefind} ,需要传递一个undefind

3.1.1 在router文件下配置二级路由

在原router文件下新增以下代码

// 引入需要匹配路由规则的二级子组件
import Detail from '@/view/Detail'
{
   path: '/vparams', 
   component: Vparams,
   children: [
    // params 传参 在path内带上参数项
    // name 命名路由 为简写路径
    { name: 'Detail', path: 'detail/:id/:msg', component: Detail }
      ]
    },

3.1.2 在view文件下新建二级路由组件

在组件内用钩子函数mounted()
作用:在组件被挂载之后调用
打开控制台找到$route 和 $router 。

$route是“路由信息对象”,包括path,params,hash,query,fullPath,matched,name等路由信息参数。

而$router是“路由实例”对象包括了路由的跳转方法,钩子函数等。

二级路由 Detail.vue 代码:
通过$route.params传参

<template>
  <div class="card" style="width: 18rem;">
    <ul class="list-group list-group-flush">
      <li class="list-group-item">id:{{$route.params.id}}</li>
      <li class="list-group-item">msg:{{$route.params.msg}}</li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'Detail',
  mounted() {
  // 观察$router和$route内的参数
    console.log(this)
  }
}
</script>

3.1.3 在上一级路由组件配置router-link

Vparams组件 – to的字符串写法

<template>
  <div>
    <h2 style="color: red">我是Vparams组件</h2>
    <hr/>
    <ul>
      <li v-for="(m,id) in parList" :key="id">
      <!-- 开始二级路由 并传参 params传参用法 -->
      <!-- 给to动态绑定属性,在字符串模板内${}会解析成属性 -->
       <router-link :to="`/vparams/detail/${m.id}/${m.msg}`">
          {{m.msg}}
        </router-link>
      </li>
    </ul>
    <hr>
    <!-- 二级路由展示区 -->
    <router-view></router-view>
  </div>
</template>

Vparams组件 – to的对象写法 不能用path必须用name

<router-link :to="{
  name: 'Detail',
  params: {
     id: m.id,
     msg: m.msg
  }
}">
  {{m.msg}}
</router-link>

3.1.4 运行结果 - params

在这里插入图片描述

3.2 使用query传参

query参数:不属于路径的一部分,类似ajax中的queryString /home?k=val&k=val 不需要占位

3.2.1 在router文件下配置二级路由

在原来的router文件中新增:

{
  path: '/vquery', component: Vquery,
  children: [
  // name 不要与上一name重名
    {name: 'Detailquery', path: 'detail', component: Detail}
 ]
}

3.2.2 在一级路由组件配置router-link

Vquery组件 – to的字符串写法

参数会以 url string 的形式进行传递,即?后的字符串则为其请求参数,并以&作为分隔符。常用在 GET 请求方式时使用。 其他请求方式也可以使用,拼接在接口地址 url? 后面

形式 : /路由路径/…/路由路径/?key=value&key=value

<template>
  <div>
    <h2 style="color:orange">我是Vquery组件</h2>
    <hr/>
    <ol>
      <li v-for="(m, id) in queList" :key="id">
        <!-- 配置路由导航地址 -->
        <!-- 跳转路由并携带query参数 to的字符串写法 --> 
        <router-link :to="`/vquery/detail?id=${m.id}&msg=${m.msg}`">
          {{m.msg}}
        </router-link>
      </li>
    </ol>
    <!-- 路由占位符 -->
    <router-view></router-view>
  </div>
</template>

<script>
export default {
  name: 'Vquery',
  data() {
    return {
      queList: [
        { id: 1, msg: '跳转路由并携带query参数 to的字符串写法' },
        { id: 2, msg: '跳转路由并携带query参数 to的对象写法' },
      ]
    }
  }
}
</script>

<style lang="less" scoped>

</style>

Vquery组件 – to的对象写法

to和query中可以用path,name和path二选一就好了,路由组件少地址短用path更合适点,路由组件多且长命名路由(name)更好点。

<template>
  <div>
    <h2 style="color:orange">我是Vquery组件</h2>
    <hr/>
    <ol>
      <li v-for="(m, id) in queList" :key="id">
        <router-link :to="{
        // name 和 path 指定路由二选一 
          // name: 'Detailquery',
          path: '/vquery/detail',
          query: {
            id: m.id,
            msg: m.msg
          }
        }">
          {{m.msg}}
        </router-link>
      </li>
    </ol>
    <!-- 路由占位符 -->
    <router-view></router-view>
  </div>
</template>

3.2.3 在目的路由组件内 – Detail.vue

本文是使用了一个目标路由组件,所以若你想同时看三种方式的写法,建议给每个一级路由组件写对应的目的路由组件。

<template>
  <div class="card" style="width: 18rem;">
    <ul class="list-group list-group-flush">
    <!-- $route.query下 -->
      <li class="list-group-item">id:{{$route.query.id}}</li>
      <li class="list-group-item">msg:{{$route.query.msg}}</li>
    </ul>
  </div>
</template>

3.2.4 运行效果 – query

在这里插入图片描述

3.2 使用props传参

3.1.1 props 键值对形式 key-value (不推荐使用)

此方法传递的是假数据,了解即可。再此也简单描述。

3.1.1.1 修改router/index.js
{
  path: '/vprops', component: Vprops,
  children: [
     {
       name: 'Detailprops', path: 'detail', component: Detail, 
       // props 值为对象 该对象中所有key-value都会以props形式传给Detail组件
       props: {id:666, msg: 'abc'}
     }
  ]
},
3.1.1.2 目的路由组件引入

和父传子中的props使用方法一样。
Detail.vue:

<template>
  <div class="card" style="width: 18rem;">
    <ul class="list-group list-group-flush">
      <li class="list-group-item">id:--{{id}}</li>
      <li class="list-group-item">msg:--{{msg}}</li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'Detail',
  props: ['id', 'msg']
}
</script>

3.1.1.3 实现效果

在这里插入图片描述

3.1.2 props 值为布尔值(推荐)

props 值为布尔值, 若布尔值为真,则会把改路由组件收到的所有params值 都会以props形式传给目的路由组件。
注意:此方法只能通过params方式上行得通。

3.1.2.1 修改router/index.js
{
 path: '/vprops', component: Vprops,
 children: [
   { name: 'Detailprops', path: 'detail/:id/:msg', component: Detail, props: true }
   ]
},
3.1.2.2 在Vprops组件中
<router-link :to="{
// params中to对象形式只能用name 命名路由 不能用path
  name: 'Detailprops',
  params: {
     id: p.id,
     msg: p.msg   
}">
    {{p.msg}}
</router-link>
3.1.2.3 在Detail组件中
<template>
  <div class="card" style="width: 18rem;">
    <ul class="list-group list-group-flush">
   <!-- 与params不同,此处引用不需要加 $route.params -->
      <li class="list-group-item">id:--{{id}}</li>
      <li class="list-group-item">msg:--{{msg}}</li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'Detail',
  props: ['id', 'msg']
}
</script>

3.1.3 props 值为函数(推荐)

props 值为函数, 会把该路由组件收到的所有qurey值 都会以props形式传给目的路由组件。

3.1.3.1 ① 修改router/index.js 完整版
{
  path: '/vprops', component: Vprops,
  children: [
    { name: 'Detailprops', path: 'detail', component: Detail,
      props($route) {
        return {
          id: $route.query.id,
          msg: $route.query.msg }
     } 
 }]
},
3.1.3.1 ② 修改router/index.js 解构赋值

注意:props值为函数时,还可以在简写。props传参时用解构赋值。但是语义化不太明确。不太推荐这种写法。

 props({query:{id,msg}}) {
   return {
       id,
       msg
  }
}
3.1.3.2 在Vprops组件中
<template>
  <div>
    <h2 style="color:darkgreen">我是Vprops组件</h2>
    <hr />
    <ol>
      <li v-for="(p,id) in proList" :key="id">
        <router-link :to="{
        // name: 'Detailprops',
          path: '/vprops/detail',
          query: {id: p.id,msg: p.msg}}">
          {{p.msg}}
        </router-link>
      </li>
    </ol>
    <router-view></router-view>
  </div>
</template>
3.1.3.3 在Detail组件中
<template>
  <div class="card" style="width: 18rem;">
    <ul class="list-group list-group-flush">
      <li class="list-group-item">id:--{{id}}</li>
      <li class="list-group-item">msg:--{{msg}}</li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'Detail',
  props: ['id', 'msg']
}
</script>
3.1.3.4 实现效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp**字符串转Json并提取字段值

uniapp字符串转Json并提取字段值 JSON有三种格式&#xff0c;每一种写法都和JS中的数据类型很像&#xff0c;可以很轻松的和JS中的数据类型互相转换 一、简单值的形式&#xff1a;JSON的简单值的格式对应着JS中的基础数据类型&#xff1a;数字 字符串 布尔值 注意事项&#…

这是我见过最牛逼的滑动加载前端框架

文章目录前言一、mescroll简介二、快速开始三、一分钟入门mescroll图片懒加载四、mescroll在vue中的使用五、小结前言 在手机端实现下拉刷新和下拉加载是最常见不过的需求了。今天大师兄就给大家分享一个非常精致的js框架&#xff1a;mescroll. 提示&#xff1a;以下是本篇文…

Cursor:GPT-4 驱动的强大代码编辑器

Cursor &#xff08;https://www.cursor.so/&#xff09;是 GPT-4 驱动的一款强大代码编辑器&#xff0c;可以辅助程序员进行日常的编码。下面通过一个实际的例子来展示 Cursor 如何帮助你编程。这个例子做的事情是网页抓取。抓取的目标是百度首页上的百度热搜&#xff0c;如下…

使用Python进行网站页面开发——HTML

目录 一、HTML基础语法 1.HTML是什么&#xff1f; 2.HTML基本结构 3.HTML注释 二、HTML常用标签介绍 1.文本标签 2.格式化标签 3.图片标签 4.超级链接标签 5.表格标签&#xff08;用来显示数据&#xff09; 6.表单标签&#xff08;用来接收数据&#xff09; 7.行内…

ACM模式下JavaScript(js)的输入输出 V8 Node

OJ在线编程常见输入输出练习场 ACM模式下分V8和node.js node.jsV8内置基本模块&#xff0c;相当于java中的JREJVMjava标准库 node就是带有能操作IO和网络库的V8引擎&#xff0c;提供了很多可调用的API使得JavaScript能够读写文件&#xff0c;网络请求&#xff0c;系统信息等…

【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网穿透」

文章目录1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置4.公网访问测试5.结语1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xff0c;比如网页…

前端项目如何部署到服务器实现网址访问

目录 前言 需要用到的东西 购买云服务器和域名 绑定域名 使用Xshell连接云服务器 下载Nginx 安装nginx 配置nginx 启动nginx 传输文件 配置防火墙 卸载自带的防火墙 安装iptables防火墙 最后 前言 写了那么久的前端&#xff0c;就想着让朋友们欣赏欣赏&#xff0…

ElementUI快速上手(jar包本地下载)

Element-ui是饿了么前端团队推出的基于vue进行开发的前端框架。 最近刚学了Element-ui&#xff0c;迫不及待练练手&#xff0c;却发现现成的组件样式用不了。引用官网的使用方法&#xff0c;如图&#xff1a; 展示的效果也是不尽人意&#xff0c;在百度的过程中发现可能是链接…

相对定位relative、绝对定位absolute、固定定位fixed

注&#xff1a;默认情况下的定位是 postion&#xff1a;static&#xff1b; 使用定位时&#xff0c;常常使用偏移量对位置进行描述&#xff1a;left、right、top、bottom定位时&#xff0c;使用z-indent可以元素的堆叠顺序&#xff0c;例&#xff1a;z-indent&#xff1a;1&…

Spring Security 权限控制

日积月累&#xff0c;水滴石穿 &#x1f604; 前言 项目版本Boot2.3.12.RELEASESecurity5.3.9.RELEASE 官网文档 在前面的文章中&#xff0c;所有的接口只需要登录就能访问。并没有对每个接口进行权限限制。 在正式的系统中&#xff0c;一个用户会拥有一个或者多个角色&#…

三种架构模式——MVC、MVP、MVVM

目录 前言 一、MVC&#xff08;Model-View-Controller&#xff09; 1、简介 2、框架图 二、MVP&#xff08;Model-View-Presenter&#xff09; 1、简介 2、框架图 三、MVVM&#xff08;Model-View-ViewModel&#xff09; 1、简介 2、框架图 四、总结 前言 MV系列框…

微信小程序插件--wxml-to-canvas(生成图片)

一、需求 项目中要实现一个将图片分享到朋友圈的功能&#xff0c;将生成的海报转成图片保存到手机。用到了wxml-to-canvas插件。 二、官方示例使用方法 1.安装wxml-to-canvas npm install --save wxml-to-canvas2.JSON 组件声明 {"usingComponents": {"wxml-t…

多款顶级好用的 Vue 表单设计器测评推荐,可拖拽生成表单

本文完整版&#xff1a;《多款顶级好用的 Vue 表单设计器测评推荐&#xff0c;可拖拽生成表单》 Vue 表单设计器form-generator - 适配 Element Plus UI 框架的表单设计器form-render - 阿里团队开源表单设计器&#xff0c;自家 Antd UI 框架友好form-create - 支持Vue3 及 Ele…

内网npm私有仓库搭建以及使用教程

前言 前端团队沉淀一套通用的UI库、工具类、脚手架&#xff0c;不允许在公网发布&#xff0c;内网npm私有库搭建需求应运而生。如何在内网环境搭建npm私有仓库并使用&#xff1f;主角登场了 —— Verdaccio。接下来我来教大家使用 verdaccio 在内网环境中搭建npm私有仓库。 基…

canvas详细入门教程(1W字 吐血分享)

大家好&#xff0c;我是潘潘 今天为大家带来的是我已经写了很久了的canvas详细教程&#xff0c;对入门canvas很有帮助。 点击跳转原文&#xff1a; canvas详细教程原文 canvas是什么&#xff1f; 简单来说&#xff0c;<canvas> 是HTML5中的标签&#xff0c;它是一个容…

20分钟学会flex布局,熊二都表示学会了,你呢?

✏️ 作者&#xff1a;大二计算机专业学生 ♉ 星座&#xff1a;金牛座 &#x1f3e0; 主页&#xff1a;查看更多文章 &#x1f3c2; 关键&#xff1a;flex 前端布局 熊二都会 大家好&#xff0c;我是小周&#xff0c;今天分享的是熊二都能学会的前端 flex 布局&#xff0c;篇幅…

小程序 getActivePinia was called with no active Pinia. Did you forget to install pinia?

小程序项目使用pinia做状态管理报错&#xff1a; Error: [&#x1f34d;]: getActivePinia was called with no active Pinia. Did you forget to install pinia? const pinia createPinia() app.use(pinia) app运行打包时有个同样的错误 错误原因是&#xff1a;在外部js/t…

Collections类详解

目录 一.Collections概述&#xff1a; 1.1什么是Collections类&#xff1a; 1.2 Collections类和collection的区别和联系&#xff1a; 二. Collections类的主要方法&#xff1a; 一.Collections概述&#xff1a; 1.1 什么是Collections类&#xff1a; Java.util.Collections…

【Node.js】Express框架的基本使用

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 目录 初识Express Express简介 什么是Express 进一步理解 Express Express能做什么 Express的基本使用 …

前端登录退出:处理Token问题(获取、缓存、失效处理)以及代码实现

目录一、什么是Token二、获取token三、Token失效处理注意点1、主动退出2、Token过期① 逻辑图②方案③代码实现3、被人顶号① 逻辑图② 方案③代码实现一、什么是Token Token是服务端生成的一串字符串&#xff0c;当用户第一次登陆成功后&#xff0c;服务器会生成一个token&am…