当前位置:首页 > 技术文章 > 正文内容

Vue3开发极简入门(12):params传参&props传参

zonemu3个月前 (07-25)技术文章26

params传参

与前文的query传参,代码基本一致,只列出不一样的地方。

Staff.vue:

<router-link 
  :to="{
    name: 'staffInfo',//只能用name,别用path
    params: {
      id: staff.id,
      name: staff.name,
      age: staff.age
    }
  }">{{ staff.name }}</router-link>

注意:与query不同,params传参,必须使用name,不能使用path!

前文设置路由的时候说每个路由的“name”是选配,但还是都给配上,就是为了此处使用。

StaffInfo.vue:

const { params } = toRefs(route)

{{ params.id }}

前文toRefs出来的是query,这里就是params。

修改路由配置router/index.ts:

{
  path: '/staff',
  name: "staff",
  component: Staff,
  children: [
    {
      path: 'info/:id/:name/:age?',
      name: "staffInfo",
      component: StaffInfo
    }
  ]
}

StaffInfo的路由配置写法有了不同,主要是path。?代表可选。

query与params传参的区别以及适用场景,大家有兴趣可以搜一下或者问AI,我就不在这里水字数了。

不过大家只需要记住一点,二者的根本区别在于URL形成的最终形式,即:

  • query传参:/staff/info?id=1&name=leo&age=35
  • params传参:/staff/info/1/leo/age

props传参

前面使用了query、params传参,在页面显示的时候基本上就是:

const route = useRoute()
{{ route.query.id }}
//或者
const { query } = toRefs(route)
{{ query.id }}

属性前面总是有前缀,如果我们想直接用{{id}}这种形式,就需要用到props。

不过涉及到props的知识点,应该放在本文前面讲比较合适,主要涉及到组件基础、组件通信。而组件通信又有很多方案,要花不少篇幅来讲,而且又能衍生出状态管理器(Vuex、Pinia),太多了。

本节就简单地说一下如何用props传参。

修改router/index.ts:

children: [
  {
    path: 'info/:id/:name/:age?',
    name: "staffInfo",
    component: StaffInfo,
    props: true
  }
]

在路由上设置`props: true`,props只能映射params参数,但不能映射query。

Staff.vue的写法与上节params传参的写法相同。

StaffInfo.vue:

<template>
    <div class="staffInfo">
        <ul>
            <li>主键:{{ id }}</li>
            <li>姓名:{{ name }}</li>
            <li>年龄:{{ age }}</li>
        </ul>
    </div>
</template>
<script lang='ts' setup name='StaffInfo'>
defineProps(['id', 'name', 'age'])
</script>

如果想prpos能映射query,修改router/index.ts:

children: [
  {
    path: 'info/:id/:name/:age?',
    name: "staffInfo",
    component: StaffInfo,
    props(route: any) {
      return route.query
    }
  }
]

Staff.vue的写法与上节query传参写法相同。StaffInfo.vue不变。

还可以更复杂一些,使用函数类型:

children: [
  {
    path: 'info/:id/:name/:age?',
    name: "staffInfo",
    component: StaffInfo,
    props:(router:any)=>({
      id:router.params.id,
      name:"默认姓名",
      age:router.query.age
    })
  }
]

可以传params、query、静态常量。实际工作中应该没这么写的,我这里就是展示一下可能性。

注意:无论是params、query还是props方式传参,都无法传递复杂的对象、对象数组。可以传string、number、boolean或者这些类型的数组。

如果非要传对象或对象数组,要么将其转为JSON字符串,接收方再反序列化(JSON.stringify、JSON.parse)。要么用URLSearchParams手工处理。这两种方法大家可以搜一下具体的代码实现,本文就不赘述了。

不过这些都太麻烦,也不优雅。实际工作中,多是传递唯一标识(id),接收方从状态管理库(Vuex、Pinia)或者通过API从服务端获取具体的数据。

相关文章

Vue状态管理:Pinia完整指南(状态管理vuex)

概述本文专注于Vue的状态管理。我们将深入探讨如何使用Pinia来管理Vue应用程序的状态。状态管理使用props和emit进行父子组件间的数据协作虽然方便,但在以下情况下可能不够充分,数据传递往往会...

学习ES6- 入门Vue(大量源代码及笔记,带你起飞)

ES6学习网站: https://es6.ruanyifeng.com/箭头函数普通函数//普通函数 this 指向调用时所在的对象(可变) let fn = function fn(a, b) {...

Vue2的16种传参通信方式(vue传参数)

前言先直入主题列出有哪些传参方式,下面再通过事例一一讲解。props(父传子)$emit与v-on (子传父)EventBus (兄弟传参).sync与update: (父子双向)v-model (父...

同事git push到主分支上了,技术总监怒了

事情是这样的,同事前几天提交使用git提交代码的时候不小心提交到主分支上了,关键还提交成功了,这可是他自己开发的模块,还没测试的呢。技术总监也知道了,这下他慌乱了。最后还是技术总监给他兜底了。为了防止...

02.Web大前端时代之:HTML5+CSS3入门系列~H5结构元素

Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html1.结构元素 可以理解为语义话标记,比如:以前这么写<...

2个将HTML5打包成app的方法(h5打包成android)

越来越多的开发者热衷于使用html5+JavaScript开发移动Web App。不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数。那么,有什么办法,既可以使用H...