vue3路由传参获取不到params,获取到为空

注意:从Vue Router的2022-8-22 更新后,我们使用param传参在新页面无法获取数据。可以有其他解决办法:

1、使用query方式传参

注意query传参只能用路由表中的path,不是name,并且所有参数都会显示在URL地址上。

2、使用 History API 方式传递和接收

在跳转前的页面使用 state 参数,获取通过history.state.参数名

代码示例

Home页面

<template>
    <h1>Home</h1> 
    <el-button @click="EditHandle" type="primary" :icon="Edit" circle />
    <el-button @click="CheckHandle" type="success" :icon="Check" circle />
    <br>
    {{ msg }}
</template>
<script lang="ts" setup>
import {Check,Edit} from '@element-plus/icons-vue'
import {ref,onMounted} from 'vue'
import { useRouter,useRoute } from 'vue-router'
let router = useRouter()  //等同于vue2中的this.$router
const route = useRoute()
const EditHandle = () =>{
    window.open('http://127.0.0.1:5173/about','_blank')
}
const CheckHandle = () =>{
    router.push({ path: '/about', query: { plan: 'private' } })
}
let msg = ref()
onMounted(() => {
    msg.value = history.state.name
    
})
</script>

About页面

<template>
    About-------{{ msg }}
    <br>
    <el-button @click="MessageHandle" type="info" :icon="Message" circle />
    <router-link to="/">
        <el-button @click="StarHandle" type="warning" :icon="Star" circle />
    </router-link>
</template>
<script lang="ts" setup>
import {Message,Star} from '@element-plus/icons-vue'

import {ref,onMounted} from 'vue'
import { useRoute, useRouter } from 'vue-router';
 
//2:定义变量
const route = useRoute();
const router = useRouter()
let msg = ref()
onMounted(() => {
    msg.value = route.query.plan
})
const MessageHandle = () =>{
    router.push({name:'home',state:{name:'张三'}})
}
const StarHandle = () =>{
    
}
</script>

router/index.ts

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
export const publicRoutes: Array<RouteRecordRaw> = [
	{
		path: '/',
		name: 'home',
		component: () => import('../views/Home.vue')
	},
  {
    path: '/about',
    name: 'about',
    component: () => import('../views/About.vue')
  }
];
const router = createRouter({
	history: createWebHistory(),
	routes: publicRoutes
});
export default router

main.ts

import { createApp } from 'vue'
import './style.css'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
import router from './router'
createApp(App).use(ElementPlus).use(router).mount('#app')

package.json

{
  "name": "vue_router_ts",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "element-plus": "^2.3.9",
    "vue": "^3.3.4",
    "vue-router": "^4.2.4"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^4.2.3",
    "typescript": "^5.0.2",
    "vite": "^4.4.5",
    "vue-tsc": "^1.8.5"
  }
}

### 回答1: Vue3中的路由传参有两种方式:query和params。 query是通过URL中的查询参数传递参数,例如:/user?id=123&name=张三。在路由配置中,可以使用props属性将query参数映射到组件的props中。 params是通过URL中的路径参数传递参数,例如:/user/123。在路由配置中,需要使用动态路由配置来定义路径参数,例如:/user/:id。在组件中可以通过$route.params获取路径参数。 需要注意的是,query参数是可选的,而params参数是必须的。另外,query参数可以在URL中直接修改,而params参数只能通过路由跳转来修改。 ### 回答2: Vue.js是一款流行的JavaScript框架之一,它具有易用、高效且灵活的特点。在Vue.js中,路由是非常重要的一个模块,而路由传参就是常见的需求。 Vue3版本中,路由传参主要有两种方式:query和params。 1. Query传参 Query传参是通过在URL中添加参数,从而将参数传递给目标组件。比如我们要传递一个名称为“name”,值为“user”的参数,可以在路由链接中添加“?name=user”的参数: ```javascript <router-link :to="{ path: '/user', query: { name: 'user' } }">User</router-link> ``` 在目标组件中,我们可以通过$router对象来访问参数: ```javascript this.$route.query.name // user ``` 2. Params传参 Params传参是通过在路由路径中添加参数,从而将参数传递给目标组件。以用户ID为例,我们可以在路由配置中添加“:id”参数: ```javascript { path: '/user/:id', name: 'User', component: User } ``` 在路由链接中,我们可以通过$router对象来设置参数: ```javascript <router-link :to="{ path: '/user/1' }">User 1</router-link> ``` 在目标组件中,我们可以通过$router对象来访问参数: ```javascript this.$route.params.id // 1 ``` 需要注意的是,我们在路由配置中定义的参数名和在路由链接中传递的参数名必须保持一致。另外,Params传参是不支持通过键值对的方式传递多个参数的。 总结 在Vue3中,路由传参有两种方式:query和params。Query传参是通过在URL中添加参数Params传参是通过在路由路径中添加参数。在使用路由传参时,我们需要注意传递参数的方式和参数名的一致性,以确保传参能够正常工作。 ### 回答3: Vue3 是目前全球使用人数最多的前端框架之一,其中路由也是 Vue3 中非常重要的一个部分。在Vue3中,我们可以使用路由传递参数从一个页面到另一个页面。Vue3 路由传参分为两种方式:query和params。 1. query方式 query方式是通过URL传参的方式将参数进行传递和获取的。在URL后面加上 ?参数名=参数值,可以传递一个或多个参数,多个参数之间使用 & 符号连接。 比如,我们可以这样传递参数: ```javascript <router-link :to="{path:'/user',query:{id:1,name:'Tom'}}">用户</router-link> ``` 在路由中我们可以通过 `$route.query` 获取传递的参数,例如: ```javascript { path: '/user', name: 'user', component: User, query: { id: 1, name: 'Tom' } } ``` 2. params方式 params方式是通过路由路径中的参数参数进行传递和获取的。使用这种方式传递参数时,参数会变成路由路径的一部分。 比如,我们可以这样传递参数: ```javascript <router-link :to="{ path: '/user/1/Tom' }">用户</router-link> ``` 在路由中我们可以通过 `$route.params` 获取传递的参数,例如: ```javascript { path: '/user/:id/:name', name: 'user', component: User, params: { id: 1, name: 'Tom' } } ``` 总的来说,Vue3 路由传参 query 和 params 都有其优劣势。query 参数可以传递任意数量的参数,但是 URL 中传递参数可能会因为长度而受限;params 参数可以在 URL 中优雅地显示要传递的参数,但是只能传递有限的参数,并且参数的顺序也很重要。根据实际情况,我们应该灵活使用不同的方式来进行参数传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值