首页 > 其他分享 >Vue3中路由传参的几种方式实践

Vue3中路由传参的几种方式实践

时间:2024-09-14 15:29:14浏览次数:14  
标签:传参 title route 中路 Vue3 content props 组件 id


【1】RouterLink+query

父组件脚本如下:

<script setup lang="ts" name="News">
  import {reactive} from 'vue'
  import {RouterView,RouterLink} from 'vue-router'

  const newsList = reactive([
    {id:'asfdtrfay01',title:'很好的抗癌食物',content:'西蓝花'},
    {id:'asfdtrfay02',title:'如何一夜暴富',content:'学IT'},
    {id:'asfdtrfay03',title:'震惊,万万没想到',content:'明天是周一'},
    {id:'asfdtrfay04',title:'好消息!好消息!',content:'快过年了'}
  ])

</script>

第一种写法,直接拼接路径

<ul>
  <li v-for="news in newsList" :key="news.id">
    <!-- 第一种写法 -->
    <RouterLink :to="`/news/detail?id=${news.id}&title=${news.title}&content=${news.content}`">
    	{{news.title}}
    </RouterLink>

  </li>
</ul>
<div class="news-content">
  <RouterView></RouterView>
</div>

在 Vue.js 中,反引号(``)通常用于模板字符串(Template literals)。模板字符串是 ES6 引入的一种新的字符串类型,允许将表达式嵌入到字符串中。在 JavaScript 中,你可以使用反引号来创建一个字符串,并在其中使用${}语法来插入变量或表达式的值。

子组件接收:

<template>
  <ul class="news-list">
    <li>编号:{{ query.id }}</li>
    <li>标题:{{ query.title }}</li>
    <li>内容:{{ query.content }}</li>
  </ul>
</template>

<script setup lang="ts" name="About">
  import {toRefs} from 'vue'
  import {useRoute} from 'vue-router'
  let route = useRoute()
  //解构
  let {query} = toRefs(route)
</script>

第二种写法,对象

<ul>
 <li v-for="news in newsList" :key="news.id">
   <!-- 第二种写法 -->
   <RouterLink 
     :to="{
       name:'xiang',
       query:{
         id:news.id,
         title:news.title,
         content:news.content
       }
     }"
   >
     {{news.title}}
   </RouterLink>

 </li>
</ul>

【2】RouterLink+params

第一种写法,直接拼路径

<template>
  <div class="news">
    <!-- 导航区 -->
    <ul>
      <li v-for="news in newsList" :key="news.id">
        <!-- 第一种写法 -->
        <RouterLink :to="`/news/detail/${news.id}/${news.title}/${news.content}`">{{news.title}}</RouterLink>
      </li>
    </ul>
    <!-- 展示区 -->
    <div class="news-content">
      <RouterView></RouterView>
    </div>
  </div>
</template>

路由配置需要进行占位:

{
  name:'xinwen',
  path:'/news',
  component:News,
  children:[
    {
      name:'xiang',
      path:'detail/:id/:title/:content?',
      component:Detail
    }
  ]
},

子组件接收:

<template>
  <ul class="news-list">
    <li>编号:{{ route.params.id }}</li>
    <li>标题:{{ route.params.title }}</li>
    <li>内容:{{ route.params.content }}</li>
  </ul>
</template>

<script setup lang="ts" name="About">
  import {useRoute} from 'vue-router'
  const route = useRoute()
  // 这里没有对route 进行解构得到params
</script>

第二种写法,对象

<RouterLink 
  :to="{
    name:'xiang',
    params:{
      id:news.id,
      title:news.title,
      content:news.content
    }
  }"
>
  {{news.title}}
</RouterLink>

相比params,个人推荐使用query,更为直接明了。

【3】路由的props配置

作用:让路由组件更方便的收到参数(可以将路由参数作为props传给组件)

{
	name:'xiang',
	path:'detail/:id/:title/:content',
	component:Detail,

  // props的对象写法,作用:把对象中的每一组key-value作为props传给Detail组件
  // props:{a:1,b:2,c:3}, 

  // props的布尔值写法,作用:把收到了每一组params参数,作为props传给Detail组件
  // props:true
  
  // props的函数写法,作用:把返回的对象中每一组key-value作为props传给Detail组件
  props(route){
    return route.query
  }
}

修改params传参

路由组件修改:

{
    name:'xinwen',
    path:'/news',
    component:News,
    children:[
      {
        name:'xiang',
        path:'detail',
        component:Detail,
        props:true,
      }
    ]
  }

detail组件修改:

<template>
  <ul class="news-list">
    <li>编号:{{id}}</li>
    <li>标题:{{title}}</li>
    <li>内容:{{content}}</li>
  </ul>
</template>

<script setup lang="ts" name="About">
  defineProps(['id','title','content'])
</script>

修改query传参

{
	name:'xiang',
	path:'detail/:id/:title/:content',
	component:Detail,
  // props的函数写法,作用:把返回的对象中每一组key-value作为props传给Detail组件
	  props(route){
	    return route.query
	  }
}

detail组件修改:

<template>
  <ul class="news-list">
    <li>编号:{{id}}</li>
    <li>标题:{{title}}</li>
    <li>内容:{{content}}</li>
  </ul>
</template>

<script setup lang="ts" name="About">
  defineProps(['id','title','content'])
</script>


标签:传参,title,route,中路,Vue3,content,props,组件,id
From: https://blog.51cto.com/Janusel/12017052

相关文章

  • Vue2/Vue3中编程式路由导航实践总结
    【1】Vue2编程式路由导航①router.push除了使用<router-link>创建a标签来定义导航链接,我们还可以借助router的实例方法,通过编写代码来实现。router.push(location,onComplete?,onAbort?)注意:在Vue实例内部,你可以通过$router访问路由实例。因此你可以调用this.$router......
  • vscode下vue3+vite+ts+eslint项目配置
    一、创建项目pnpmcreatevue@latest注意:是否引入ESLint用于代码质量检测?选择否二、安装依赖pnpmi-Deslint@antfu/eslint-config三、在项目根目录创建文件:eslint.config.js//eslint.config.jsimportantfufrom'@antfu/eslint-config'exportdefaultantfu({......
  • Vue3 + Echarts 实现中国地图
    基本概念    echarts是一个基于JavaScript的开源可视化库,用于创建和展示各种交互式图表和图形。它可以用于数据分析、数据可视化、数据探索和数据报告等方面。我们一般使用echarts来实现数据可视化,本文我们使用vue3+echars来实现中国地图。准备echarts基本结构首......
  • vue3 登录页视频背景 开发
    方法比较笨,可以参考,思路如下:    我把这个页面看成三层。最里面是视频,中间挂个蒙板,然后最上层放内容,这样简单粗暴的达到效果 然后来说说中间这个蒙板吧,主要是两个想法,      一个就是客户,领导们的想法比较多,如果仅仅只是说有个视频虚化啥的,有可能并不能完全解......
  • 程序员的 AI 启蒙:ChatGPT+ Copilot开发Vue3 仿简书项目 90%代码AI生成
    在人工智能技术日益成熟的今天,程序员们正在迎来一场全新的编程革命。ChatGPT和Copilot等AI工具的出现,让代码生成不再是遥不可及的梦想。本文将带你体验如何利用这些先进技术,仅用90%的代码量,开发出一个基于Vue3的仿简书项目,感受AI在编程领域的革新力量。一、引言ChatGPT和C......
  • vue3/provider 和 inject实现跨组件动态数据传递。
    实现跨层传递在Vue中,provider和inject是一种用于实现依赖注入的高级特性,允许一个祖先组件向其所有子孙组件注入一个依赖,而不论组件层次有多深,并在起上下游关系成立的时间里始终生效。这在某些场景下非常有用,比如当你需要跨多个组件层级传递数据时。定义provide对象:在父组......
  • vue3API /watch
    1.watch侦听在Vue3中,watch是一个用于观察和响应Vue实例上的数据变动的函数。它可以用来观察几乎所有类型的数据,包括ref、reactive、响应式对象的属性,甚至是计算属性。当被观察的数据变化时,watch会触发一个回调函数。<scriptsetup>import{ref,watch}from'vue......
  • 从零开始一步一步搭建 Vue3 + Webpack5 项目脚手架指南
    **......
  • 尤雨溪推荐的拖拽插件,支持Vue2/Vue3 VueDraggablePlus
    大家好,我是「前端实验室」爱分享的了不起~今天在网上看到尤雨溪推荐的这款拖拽组件,试了一下非常不错,这里推荐给大家。说到拖拽工具库,非大名鼎鼎的的Sortablejs莫属。它是前端领域比较知名的,且功能强大的工具。但我们直接使用Sortablejs的情况很少,一般都是使用基于它的......
  • vue3 tsx中使用hook
    代码使用方组件import{defineComponent,PropType,h,computed,ref,watch}from'vue';importuseMyHooksfrom'./hooks/useMyHooks';exportdefaultdefineComponent({setup(props,{slots}){const{count,increment,decrem......