在vue3+ts项目里使用query和params传参

这篇具有很好参考价值的文章主要介绍了在vue3+ts项目里使用query和params传参。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 query 传参 (类似get请求)

query 传参方式①

传递方组件

home.vue

<template>

<div class='c'>
    <p>query传参</p>
    <el-button type="success" @click="toList"> to list</el-button>
</div>

</template>

<script lang='ts' setup>

import { ref } from 'vue'
// 1 引入路由跳转方法useRouter
import { useRouter } from 'vue-router'
// 2 拿到实例
const router = useRouter()
// 3 ref定义基本类型数据
const name = ref('梨花白')
// 4 query传参
const toList = ()=>{
    router.push({
        //这种对象式传参写法 query除开和path搭配外还可以和name一起使用
        path:'/list',
        //或者这样 path和name任选其一
        //name:'List',
        query:{
            name:name.value
        }
    })
}

</script>

<style scoped>
.c{
    width: 80%;
    padding: 20px;
    margin: 0 auto;
    border:1px solid red;
}
.c>p>span{
    color:coral;
}
</style>

看下 router/index.ts 文件

import { createRouter,createWebHistory,RouteRecordRaw } from 'vue-router'

const routes:Array<RouteRecordRaw> = [
    {
        path:'/',
        component:()=>import('../pages/home.vue')
    },{
        path:'/home',
        name:'Home',//路由命名
        component:()=>import('../pages/home.vue')
    },{
        path:'/list',
        name:'List',//路由命名 为路由跳转作准备
        component:()=>import('../pages/list.vue')
    },{
        //定义404页面
        path:'/404',
        component:()=>import('../pages/notfound.vue')
    },{
        //匹配未定义路由 然后重定向至404页面
        path:'/:pathMath(.*)',
        redirect:'/404'
    }
]

const router = createRouter({
    routes,
    history:createWebHistory()
})

export default router

有两个注意点

① ref定义响应式基本类型数据后,修改和赋值要带上 .value

② query是一个对象类型 所以我们定义的基本类型数据不能直接赋值 要给对象式写法 {}

像以下两种写法都是报错的

<script lang='ts' setup>

import { ref } from 'vue'

// 1 引入路由跳转方法useRouter
import { useRouter } from 'vue-router'
// 2 拿到实例
const router = useRouter()
// 3 ref定义基本数据
const name = ref('梨花白')
// 4 query传参
const toList = ()=>{
    router.push({
        path:'/list',
        query:name //报错 不能将类型“Ref<string>”分配给类型“LocationQueryRaw”。
                   //类型“Ref<string>”中缺少类型“string”的索引签名
    })
}

</script>
<script lang='ts' setup>

import { ref } from 'vue'

// 1 引入路由跳转方法useRouter
import { useRouter } from 'vue-router'
// 2 拿到实例
const router = useRouter()
// 3 ref定义基本数据
const name = ref('梨花白')
// 4 query传参
const toList = ()=>{
    router.push({
        path:'/list',
        query:name.value //报错 不能将类型“string”分配给类型“LocationQueryRaw”
                   
    })
}

</script>

接收方组件

list.vue

<template>
    
<div class='c'>
    <p>query接参</p>
    <!-- 4 展示数据 -->
    <p>name: <span>{{ name }}</span></p>
</div>

</template>

<script lang='ts' setup>

// 1 引入useRoute路由信息方法
import { useRoute } from 'vue-router'
// 2 获取实例
const route = useRoute()
// 3 解构赋值
const { query:{name} } = route

</script>

<style scoped>
.c{
    width: 80%;
    padding: 20px;
    margin: 0 auto;
    border:1px solid red;
}
.c>P>span{
    color:coral;
}
</style>

效果:

vue3获取query参数,vue.js,javascript,前端,typescript

动态效果:

vue3获取query参数,vue.js,javascript,前端,typescript

 以上 我们可以得知 当使用query传参时,参数的详细内容都会在地址栏完整的展示出来。

这对于数据安全来说是致命的

当然也有它自有的优势:刷新不会丢失数据

下面看看使用query传参的另一种形式:?传参

query 传参方式②

传递方组件

home.vue

<template>

<div class='c'>
    <p>query传参</p>
    <el-button type="success" @click="toList"> to list</el-button>
</div>

</template>

<script lang='ts' setup>

import { toRefs,ref,reactive } from 'vue'
// 1 引入路由跳转方法useRouter
import { useRouter } from 'vue-router'
// 2 拿到实例
const router = useRouter()
// 3 ref定义基本数据
const name = ref('桃花夭')
// 4 query ?传参 
const toList = ()=>{
    router.push('/list?name=' + name.value)
    //也可以使用ES6里的模板字符串
    //router.push(`/list?name=${name.value}`)
}

</script>

<style scoped>
.c{
    width: 80%;
    padding: 20px;
    margin: 0 auto;
    border:1px solid red;
}
.c>p>span{
    color:coral;
}
</style>

效果:

vue3获取query参数,vue.js,javascript,前端,typescript

 动态效果:

vue3获取query参数,vue.js,javascript,前端,typescript

两者效果别无二致 也有同学说我在传入引用类型数据时老是报错 怎搞嘞

好的 下面开始传递引用类型数据

传递方组件

home.vue

<template>

<div class='c'>
    <p>query传参</p>
    <el-button type="success" @click="toList"> to list</el-button>
</div>

</template>

<script lang='ts' setup>

import { ref,reactive } from 'vue'
// 1 引入路由跳转方法useRouter
import { useRouter } from 'vue-router'
// 2 拿到实例
const router = useRouter()
// 3 定义数据接口类型
interface props {
    id:number,
    content:string
}
// 4 reactive定义引用类型数据
const arr:props[] = reactive([
    {
        id:1,
        content:'关山难越,谁悲失路之人?'
    },{
        id:2,
        content:'萍水相逢,尽是他乡之客!'
    }
])
// 4 或这样
// const arr = reactive([
//     {
//         id:1,
//         content:'关山难越,谁悲失路之人?'
//     },{
//         id:2,
//         content:'萍水相逢,尽是他乡之客!'
//     }
// ] as props[])

// 5 query ?传参 
const toList = ()=>{
    router.push('/list?arr=' + JSON.stringify(arr))
    //也可以使用模板字符串
    // router.push(`/list?arr=${JSON.stringify(arr)}`)
}

</script>

<style scoped>
.c{
    width: 80%;
    padding: 20px;
    margin: 0 auto;
    border:1px solid red;
}
.c>p>span{
    color:coral;
}
</style>

接收方组件

list.vue

<template>

  <div class="c">
    <p>query接参</p>
    <!-- 4 展示数据 -->
    <p v-for="item in arr" :key="item.id">
      <span>{{ item.content }}</span>
    </p>
  </div>

</template>

<script lang="ts" setup>

// 1 引入useRoute方法
import { useRoute } from "vue-router";
// 2 获取实例
const route = useRoute();
// 3 使用JSON.parse()方法把传过来的字符串参数转回对象
const arr = JSON.parse(route.query.arr as string);

</script>

<style scoped>
.c {
  width: 80%;
  padding: 20px;
  margin: 0 auto;
  border: 1px solid red;
}
.c > P > span {
  color: coral;
}
</style>

效果:

vue3获取query参数,vue.js,javascript,前端,typescript

动态效果:

vue3获取query参数,vue.js,javascript,前端,typescript

所以是

在使用?传参传入引用类型数据时 传递时要使用JSON.stringify()方法转成字符串类型

在接收时 要使用JSON.parse()方法再转回最初的类型

易错点如下:

vue3获取query参数,vue.js,javascript,前端,typescript

vue3获取query参数,vue.js,javascript,前端,typescript

vue3获取query参数,vue.js,javascript,前端,typescript

 query 传参方式③

其实也就是声明式路由跳转时带参

传递方组件

home.vue

<template>

<div class='c'>
    <p>query传参</p>
    <router-link 
    //to的对象式写法 与编程式路由跳转传参的对象式写法相对应
    :to="{
        path:'/list',
        //或 name:'List'
        query:{
            arr:JSON.stringify(arr)
        }
    }">
    <el-button type="success"> to list</el-button>
</router-link>

//<router-link 
    //to的字符串写法 与编程式路由跳转的?传参写法相对应
//    :to="`/list?arr=${JSON.stringify(arr)}`">
//    <el-button type="success"> to list</el-button>
//</router-link>
    
</div>

</template>

<script lang='ts' setup>

import { toRefs,ref,reactive } from 'vue'
// 1 引入路由跳转方法useRouter
import { useRouter } from 'vue-router'
// 2 拿到实例
const router = useRouter()
// 3 定义数据接口类型
interface props {
    id:number,
    content:string
}
// 4 ref定义基本数据 但未定义数据类型
const arr:props[] = reactive([
    {
        id:1,
        content:'关山难越,谁悲失路之人?'
    },{
        id:2,
        content:'萍水相逢,尽是他乡之客!'
    }
])
// 4 或这样
// const arr = reactive([
//     {
//         id:1,
//         content:'关山难越,谁悲失路之人?'
//     },{
//         id:2,
//         content:'萍水相逢,尽是他乡之客!'
//     }
// ] as props[])

</script>

<style scoped>
.c{
    width: 80%;
    padding: 20px;
    margin: 0 auto;
    border:1px solid red;
}
.c>p>span{
    color:coral;
}
</style>

效果:

vue3获取query参数,vue.js,javascript,前端,typescript

二 params 传参 (类似post请求)

params 传参 方式①

传递方组件

home.vue

<template>

 <div class="c">
    <p>params 传参</p>
    <el-button type="warning" @click="toList"> to list page</el-button>
 </div>

</template>

<script lang='ts' setup>

import { toRefs,ref,reactive } from 'vue'
// 1 引入路由跳转方法useRouter
import { useRouter } from 'vue-router'
// 2 拿到实例
const router = useRouter()
// 3 ref定义基本类型数据 
const str = ref('月出于东山之上,徘徊于斗牛之间。')
// 4 params 传参 只能搭配name使用 path会忽略params带参
const toList = ()=>{
    router.push({
        name:'List',
        params:{
            str:str.value
        }
    })
}
</script>

<style scoped>
.c{
    width: 80%;
    padding: 20px;
    margin: 0 auto;
    border:1px solid red;
}
.c>p>span{
    color:coral;
}
</style>

接收方组件

list.vue

<template>

  <div class="c">
    <p>params接参</p>
    <!-- 4 展示数据 -->
    <p>str: <span>{{ str?str:'刷新我就不见啦!' }}</span></p>
  </div>

</template>

<script lang="ts" setup>

// 1 引入useRoute路由信息方法
import { useRoute } from "vue-router";
// 2 获取实例
const route = useRoute();
// 3 解构赋值 刷新页面 参数丢失 
const { params:{str} } = route;

</script>

<style scoped>
.c {
  width: 80%;
  padding: 20px;
  margin: 0 auto;
  border: 1px solid red;
}
.c > P > span {
  color: coral;
}
</style>

效果:

vue3获取query参数,vue.js,javascript,前端,typescript

 在使用params传参时 参数详情在请求体里 不会展示在地址栏中 这对数据安全来说是友好的

但弊端就是刷新页面数据丢失

其实在实际项目里,数据多是请求数据赋值来的

所以接下来我们尝试home.vue组件里请求数据后传递给list.vue组件展示数据

传递方组件

home.vue

<template>

 <div class="c">
    <p>params 传参</p>
    <el-button type="warning" @click="toList"> to list page</el-button>
 </div>

</template>

<script lang='ts' setup>

import { toRefs,ref,reactive } from 'vue'
// 引入接口
import { tt } from '../request/api'
// 1 引入路由跳转方法useRouter
import { useRouter } from 'vue-router'
// 2 拿到实例
const router = useRouter()
// 3 定义接口数据
interface props {
    userId:number,
    city:string,
    address:string,
    name:string,
    zip:number,
    region:string,
    date:string
}
// 4 reactive定义数据
let list:props[] = reactive([])
// 5 params 传参 必须搭配name使用 path会忽略params带参
const toList = ()=>{
    tt().then((res:any)=>{
        if(res && res.data.code === 200){
            list = res.data.data.list
            router.push({
        name:'List',
        params:{
            list:JSON.stringify(list)
        }
    })
        }else{
            alert(res.data.msg)
        }
    })
    
}
</script>

<style scoped>
.c{
    width: 80%;
    padding: 20px;
    margin: 0 auto;
    border:1px solid red;
}
.c>p>span{
    color:coral;
}
</style>

接收方组件

list.vue

<template>

  <div class="c">
    <p>params接参</p>
    <!-- 4 展示数据 -->
    <div class="c" v-for="item in list" :key="item.userId">
          <p>名称:<span>{{ item.name }}</span></p>
          <p>城市:<span>{{ item.city }}</span></p>
          <p>地区:<span>{{ item.region }}</span></p>
          <p>地址:<span>{{ item.address }}</span></p>
          <p>日期:<span>{{ item.date }}</span></p>
          <p>编号:<span>{{ item.zip }}</span></p>
      </div>
      </div>

</template>

<script lang="ts" setup>

// 1 引入useRoute路由信息方法
import { useRoute } from "vue-router";
// 2 获取实例
const route = useRoute();
// 3 声明赋值 刷新页面 参数丢失 这里报错
const  list  = JSON.parse(route.params.list as string);

</script>

<style scoped>
.c {
  width: 80%;
  padding: 20px;
  margin: 0 auto;
  border: 1px solid red;
}
.c > P > span {
  color: coral;
}
</style>

效果:

vue3获取query参数,vue.js,javascript,前端,typescript

那我们在使用params传参时 如何避免页面刷新导致参数丢失问题呢?

那就是 params 的第二种传参方式了:动态路由传参

params 传参方式②

1 既然名叫动态路由传参 那首先第一步就是在router/index.ts里配置动态路由

 router/index.ts

import { createRouter,createWebHistory,RouteRecordRaw } from 'vue-router'

const routes:Array<RouteRecordRaw> = [
    {
        path:'/',
        component:()=>import('../pages/home.vue')
    },{
        path:'/home',
        name:'Home',//路由命名
        component:()=>import('../pages/home.vue')
    },{
        path:'/list/:arr',//接收方路由配置
        name:'List',//路由命名 为路由跳转作准备
        component:()=>import('../pages/list.vue')
    },{
        //定义404页面
        path:'/404',
        component:()=>import('../pages/notfound.vue')
    },{
        //匹配未定义路由 然后重定向至404页面
        path:'/:pathMath(.*)',
        redirect:'/404'
    }
]

const router = createRouter({
    routes,
    history:createWebHistory()
})

export default router

2 传递方组件

home.vue

<template>

 <div class="c">
    <p>params 传参</p>
    <el-button type="warning" @click="toList"> to list page</el-button>
 </div>

</template>

<script lang='ts' setup>

import { toRefs,ref,reactive } from 'vue'
// 引入接口
import { tt } from '../request/api'
// 1 引入路由跳转方法useRouter
import { useRouter } from 'vue-router'
// 2 拿到实例
const router = useRouter()
// 3 定义接口数据
interface props {
    userId:number,
    city:string,
    address:string,
    name:string,
    zip:number,
    province:string,
    date:string
}
// 4 ref定义基本数据 但未定义数据类型
let list:props[] = reactive([])
// 5 params 传参 必须搭配name使用 path会忽略params带参
const toList = ()=>{
    tt().then((res:any)=>{
        if(res && res.data.code === 200){
            list = res.data.data.list
            router.push({
        name:'List',
        params:{
            //动态路由配置/:arr 这里就是arr
            arr:JSON.stringify(list)
        }
    })
        }else{
            alert(res.data.msg)
        }
    })
    
}
</script>

<style scoped>
.c{
    width: 80%;
    padding: 20px;
    margin: 0 auto;
    border:1px solid red;
}
.c>p>span{
    color:coral;
}
</style>

接收方组件

list.vue

<template>

  <div class="c">
    <p>params接参</p>
    <!-- 4 展示数据 -->
    <div class="c" v-for="item in list" :key="item.userId">
          <p>名称:<span>{{ item.name }}</span></p>
          <p>城市:<span>{{ item.city }}</span></p>
          <p>地区:<span>{{ item.region }}</span></p>
          <p>地址:<span>{{ item.address }}</span></p>
          <p>日期:<span>{{ item.date }}</span></p>
          <p>编号:<span>{{ item.zip }}</span></p>
      </div>
      </div>

</template>

<script lang="ts" setup>

// 1 引入useRoute路由信息方法
import { useRoute } from "vue-router";
// 2 获取实例
const route = useRoute();
// 3 声明赋值 刷新页面 参数不会丢失
const  list  = JSON.parse(route.params.arr as string);

</script>

<style scoped>
.c {
  width: 80%;
  padding: 20px;
  margin: 0 auto;
  border: 1px solid red;
}
.c > P > span {
  color: coral;
}
</style>

效果:

vue3获取query参数,vue.js,javascript,前端,typescript

可! 这和query传参有毛区别?参数都会在地址栏显示

从效果上看是这样的 没有区别

只是query传参有长度限制,而params无

params的声明式路由跳转传参就不赘述了,会了编程式路由跳转传参,那声明式就不在话下

注意query和path或name都可搭配使用,而params只能和name搭配就行了

在尝试写vue3+ts项目时,遇到的绝大多数问题都是数据类型定义相关的 也就是ts问题突出

都说any大法好,这也就失去了类型限定即ts的意义 这又和js毫无分别了

所以ts还是重点学习的方面

最后提醒一句:

如果你在vue3+ts项目里使用params传参时,尽管代码核实几遍都是对的,可还是报错,

那可能不是你的问题,尝试下载 vue-router@4.0.1 版本,然后重启项目,你可能就惊奇的发现

参数就这么展示在自己眼前了文章来源地址https://www.toymoban.com/news/detail-799046.html

到了这里,关于在vue3+ts项目里使用query和params传参的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3路由跳转params传参接收不到?

    一、之前的用法 这样路由可以跳转过去,但接收到了params是一个空对象。 二、解决方法 通过查找资料,发现了原因。 https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22 由于之前的params传参在页面刷新之后,参数会丢失,所以vue将这种方法移除了。 vue推荐的路

    2024年02月12日
    浏览(45)
  • vue - vue中使用this.$route.params获取不到参数的原因

    1,误区: 如果想要 this.$route.params 获取到 this.$route.push()传的参数 ,一定要使用name属性来指定路由 不要用path属性; 如果使用path属性传参,那么需要 :this.$route.query来获取(参数以问号拼接到路由后面) 2,this.$route 和 this.$router 的区别: this.$route 是路由 【参数对象】 ,所有

    2024年02月13日
    浏览(47)
  • Vue2路由:手动配置使用路由&路由嵌套、路由动态传参(:参数,query、props)、编程式导航(back、go)、导航守卫

    过了一遍vue2的router,整理一下小结 目录 一、前端路由的概念与原理 1.1 什么是路由 1.2 路由的工作方式 二、vue-router的基本使用 2.1 安装、配置、使用router 2.2 redirect重定向 三、嵌套路由 3.1 声明子路由的规则 3.2 默认子路由 四、动态路由 4.1 动态路由的概念 4.2 动态路由取参方

    2024年02月05日
    浏览(45)
  • 配置Vite获取内网IP(Vue3项目​ts版本获取本机局域网IP地址)

    参考文章:vue项目获取本机局域网IP地址(vue.config.js版本) 在Vite中,没有vue.config.js文件,而是使用vite.config.js(或vite.config.ts,如果项目使用TypeScript)来配置项目; 1.获取 IP 需要借助  os  模块,需要先安装依赖: 2.其次在vite.config.ts中引用模块  3.接着,添加一个获取本机内

    2024年02月05日
    浏览(45)
  • uniapp 小程序 使用vue3+ts运行项目

    uniapp官网教程:uni-app官网 创建方式有2种 第一种:通过HBuilderX可视化界面创建 第二种:通过vue-cli命令行 注意:若不能直接使用命令下载,可去gitee下载模板使用 下载完模板后进行解压,利用vscode打开文件,会发现报这样的错误👇主要原因是没有下载依赖 解决以上错误:使

    2024年02月13日
    浏览(57)
  • 使用 Vite + Vue3 + Element-Plus + Pinia + Ts 搭建 Vue3 项目

    Vite 需要 Node.js 版本 14.18+,16+。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。 首先 npm 输入: Project name :项目名称 Select a framework :选择一个框架 Select a variant :选择 ts 或者 js 输入项目名称后选择 vue 选择

    2024年02月09日
    浏览(64)
  • vite+vue3+ts搭建项目八(打包性能优化三:使用CDN)

    使用vite-plugin-cdn-import 下载npm包 官方github:https://github.com/MMF-FE/vite-plugin-cdn-import 开发环境使用本地的npm包,cdn是打包时候才生效 在vite.config.ts中通过importToCDN引入 注意事项 :网上很多教程,还需要在 build 的 rollupOptions 添加对应的 external ,如上注释所示,其实是不需要的,

    2024年02月02日
    浏览(103)
  • Vue3项目(Vite+TS)使用Web Serial Api全记录

    之前写了一个vue+django的一个通过串口控制的上位机系统。但是实际生产中,不如部署到服务器上,这样可以更好的节约成本。但是这样就需要弄一个客户端来控制处理串口信息。那我就在想能不能通过网页直接拿到客户端的串口信息。所以问了万能的chatgpt,得到了以下答案

    2024年02月02日
    浏览(45)
  • vue3 ts element plus form表单二次封装详细步骤 (附参数、类型详细介绍及简单使用示例)

    上篇table 表格封装 讲到项目中经常会用到 table 表格,所以做了封装。当然,form 表单使用的频率依然很高,所以和封装 table 表格的思路相似,对 form 表单也做了一个二次封装的组件。 查看国内预览站 查看国外预览站 1. EasyForm 表单组件封装 src/components/EasyForm/index.vue Form 表单

    2024年02月07日
    浏览(61)
  • 使用VS Code创建编写uniapp项目(vue3+ts 微信小程序)

    uni-create-view :用于快速创建 uni-app 页面 uni-helper uni-app :代码提示 uniapp 小程序扩展 :鼠标悬停查文档 1.在types属性中添加属性名 @types/wechat-miniprogram 和  @uni-helper/uni-app-types. 2.添加vueCompilerOptions选项 ①在VS Code中找到设置 ②在设置中搜索文件关联 ③添加这两个文件名,值为

    2024年04月27日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包