<template> <el-button @click="goToDetail">跳转到详情页</el-button> </template> <script setup> import { useRouter } from 'vue-router' const router = useRouter() const goToDetail = () => { router.push({ path: '/detail', query: { id: '123', name: '示例数据' } }) } </script>接收参数组件
<template> <div> <h3>详情页</h3> <p>ID: {{ $route.query.id }}</p> <p>名称: {{ $route.query.name }}</p> </div> </template> <script setup> import { useRoute } from 'vue-router' const route = useRoute() // 在脚本中获取参数 console.log('接收的ID:', route.query.id) console.log('接收的名称:', route.query.name) </script>1.3 优缺点及适用场景
• 适用场景:适用于传递简单的、非敏感的数据,如页面的 ID、页码、筛选条件等。
<template> <el-button @click="goToEditor">跳转到编辑页</el-button> </template> <script setup> import { useRouter } from 'vue-router' const router = useRouter() const goToEditor = () => { const row = { description: '这是一段描述', code: 'CODE123', value: '示例值' } router.push({ name: 'EditorButton', state: { description: row.description, code: row.code, value: row.value } }) } </script>接收参数组件
<template> <div> <h3>编辑页</h3> <p>描述: {{ editInfo.description }}</p> <p>编码: {{ editInfo.code }}</p> <p>值: {{ editInfo.value }}</p> </div> </template> <script setup> import { reactive } from 'vue' // 从 history 中获取 state 数据 const editInfo = reactive(history.state || {}) // 堆代码 duidaima.com // 处理页面刷新可能导致的参数丢失问题 if (!editInfo.code) { console.warn('参数可能因页面刷新而丢失') // 可以在这里添加相应的处理逻辑,如跳回上一页 } </script>2.3 优缺点及适用场景
• 适用场景:适用于传递中等规模的数据,且不希望参数暴露在 URL 中的场景,如编辑页面所需的表单数据等。
3.2 代码示例
Pinia store 文件(store.js)
import { defineStore } from 'pinia' export const useDataStore = defineStore('data', { state: () => ({ sharedData: null }), actions: { setSharedData(data) { this.sharedData = data }, clearSharedData() { this.sharedData = null } } })跳转组件
<template> <el-button @click="goToDetailPage">跳转到详情页</el-button> </template> <script setup> import { useRouter } from 'vue-router' import { useDataStore } from './store' const router = useRouter() const dataStore = useDataStore() const goToDetailPage = () => { const data = { id: '456', name: '通过Pinia传递的数据', content: '这是一段较长的内容...' } dataStore.setSharedData(data) router.push('/detailPage') } </script>接收参数组件
<template> <div> <h3>详情页</h3> <p>ID: {{ dataStore.sharedData?.id }}</p> <p>名称: {{ dataStore.sharedData?.name }}</p> <p>内容: {{ dataStore.sharedData?.content }}</p> </div> </template> <script setup> import { onUnmounted } from 'vue' import { useDataStore } from './store' const dataStore = useDataStore() // 组件卸载时清理数据,避免影响其他页面 onUnmounted(() => { dataStore.clearSharedData() }) </script>
• 适用场景:适用于传递复杂数据,或者需要在多个组件、多个页面中共享的数据,如用户信息、购物车数据等。
• 面对复杂数据或需要跨组件、跨页面共享的数据,选择 Pinia(或 Vuex)传参,借助状态管理库实现可靠的数据共享。