Vue页面传参

父子组件

子传父

子组件
通过在方法中使用this.$emit()传出

<template>
  <div>
    <h1>children</h1>
      <button @click="sendTOParent">向父组件传值</button>
  </div>
</template>>
<script>
export default {
  data() {
    return {
      data: "子组件中的信息"
    };
  },
  methods:{
        sendTOParent(){
            this.$emit('listenToChildEvent',this.data)
        }
    }
};
</script>>

父组件
通过v-on接受组件参数

<template>
  <div>
    <children v-on:listenToChildEvent = 'showMsgfromChild' />
  </div>
</template>>
<script>
import Children from "./Children";
export default {
  data() {
    return {
    };
  },
   methods:{
        showMsgfromChild(data){
            console.log(data)
        }
    },
   components: {
    Children
  },
};
</script>

<think>我们正在讨论Vue.js页面跳转传参的方法。根据引用内容,有几种不同的方式可以实现。引用[1]展示了在目标页面使用`this.$route.params`获取参数,并给出了一个模板中的示例。引用[2]提到了使用query传参,类似于GET请求,参数会暴露在URL中,使用`this.$router.push`方法,并指定path和query对象。引用[3]提到了四种传参方式,其中第一种是使用query传参(在链接后加?拼接),第二种是params传参。引用[4]展示了在path中使用模板字符串传递参数(即动态路由匹配)。综合这些引用,我们可以总结出Vue.js页面跳转传参的几种常见方式:1.**query传参**:使用`this.$router.push`方法,传入一个包含path和query对象的配置。参数会以?key=value的形式出现在URL中,在目标页面通过`this.$route.query`获取。2.**params传参**:需要先定义路由的动态路径参数(例如,在路由配置中定义路径为`/user/:id`),然后通过`this.$router.push`传入一个包含name(或path,但path需要匹配动态路径)和params对象的配置。在目标页面通过`this.$route.params`获取。3. **通过路由的props属性**:在路由配置中设置`props:true`,可以将params作为组件的props传入(仅适用于动态路由参数);也可以设置一个函数返回props对象,这样query和params都可以作为props传入。注意:在VueRouter4中,params传参时,如果使用path,则params会被忽略,所以通常使用name来指定路由。下面我将详细说明这几种方式,并给出示例代码。###1. query传参这种方式参数会显示在URL中,适合传递非敏感数据。 **跳转页面(发送参数)**: ```javascript//在Vue组件的方法中this.$router.push({path:'/target',query:{param1: 'value1',param2: 'value2'} })``` **目标页面(接收参数)**:在目标组件中,可以通过`this.$route.query`获取参数。```html<template><div><p>参数1: {{$route.query.param1}}</p><p>参数2:{{ $route.query.param2 }}</p></div></template> ```###2.params传参(动态路由匹配)首先需要在路由配置中定义动态参数。 **路由配置(router/index.js)**:```javascript{path: '/target/:param1?/:param2?',//使用?表示可选参数,如果参数可能不存在name: 'TargetPage', //给路由命名,方便使用component: TargetComponent}``` **跳转页面(发送参数)**:注意,使用params传参时,如果使用path,则不能使用params(除非在path中已经包含了参数),所以通常使用name来跳转。```javascriptthis.$router.push({name: 'TargetPage', //使用路由名称params:{param1: 'value1',param2: 'value2'} })``` **目标页面(接收参数)**:在目标组件中,通过`this.$route.params`获取参数。```html<template><div><p>参数1: {{$route.params.param1}}</p><p>参数2:{{ $route.params.param2 }}</p></div></template> ```注意:params传参时,参数不会显示在URL的查询字符串中,而是作为路径的一部分(如:/target/value1/value2)。但是,如果参数是可选的并且没有传递,则路径中不会显示该参数。 ###3.使用props接收参数在路由配置中,我们可以设置props属性,这样在目标组件中可以直接通过props接收参数,而不是通过`$route.query`或`$route.params`。**路由配置(router/index.js)**:对于动态路由(params),可以设置`props:true`,这样动态参数将作为props传入组件。 ```javascript{path:'/target/:id',name:'TargetPage',component: TargetComponent,props: true//将route.params设置为组件的props} ```也可以设置一个函数,返回一个props对象,这样可以将query和params都作为props传入: ```javascript{path:'/target',name:'TargetPage',component: TargetComponent,props: (route)=> ({param1: route.query.param1,param2: route.params.param2//注意:这里如果路径没有定义动态参数,则route.params.param2可能为undefined})} ```**目标组件(接收props)**:在目标组件中声明props,然后就可以像普通props一样使用。```javascriptexportdefault {props: ['param1', 'param2'],// ...} ```在模板中直接使用:```html<template><div><p>参数1: {{param1}}</p><p>参数2:{{ param2 }}</p></div></template> ```###注意事项-使用params传参时,如果用户刷新页面,参数可能会丢失(因为参数是路径的一部分,所以不会丢失,但如果是通过params传递但不在路径中定义的参数,刷新会丢失)。而query参数在刷新时不会丢失,因为它们在URL中。 -在VueRouter4中,params传参必须使用命名路由(name),不能使用path。-如果参数是敏感信息,不建议使用query,因为URL可见。根据不同的需求,选择合适的方式传递参数。 §§相关问题§§1.Vue.js中query传参和params传参有什么区别?2.如何在使用params传参时避免刷新页面后参数丢失?3.Vue Router中,如何将路由参数作为组件的props传入?4.Vue Router4中传参方式有什么变化?</think>### Vue.js 页面跳转传参方式详解 在 Vue.js 中实现页面间参数传递主要通过 Vue Router 实现,以下是 4 种常用方式: #### 1. **query 传参(URL 显式传参)** - **原理**:参数以 `?key=value` 形式附加在 URL 后 - **发送参数**: ```javascript this.$router.push({ path: '/target', query: { id: '123', name: 'vue' } }) ``` - **接收参数**(目标页面): ```html <template> <div> 参数1: {{ $route.query.id }} 参数2: {{ $route.query.name }} </div> </template> ``` - **特点**:参数可见,刷新不丢失[^2] #### 2. **params 传参(命名路由传参)** - **原理**:通过路由名称和动态参数传递 - **路由配置**: ```javascript { path: '/detail/:id', name: 'DetailPage', component: Detail } ``` - **发送参数**: ```javascript this.$router.push({ name: 'DetailPage', params: { id: 456 } }) ``` - **接收参数**: ```javascript export default { mounted() { console.log(this.$route.params.id) // 输出 456 } } ``` - **注意**:必须使用 `name` 跳转,刷新会丢失未定义在路径中的参数[^3] #### 3. **动态路径传参(URL 路径传参)** - **原理**:参数直接嵌入 URL 路径 - **发送参数**: ```javascript this.$router.push(`/user/${userId}/profile`) ``` - **路由配置**: ```javascript { path: '/user/:userId/profile' } ``` - **接收参数**: ```html <p>用户ID: {{ $route.params.userId }}</p> ``` - **特点**:适合必要参数,刷新不丢失[^4] #### 4. **props 解耦传参(推荐方式)** - **原理**:通过路由配置将参数映射为组件 props - **路由配置**: ```javascript { path: '/product/:id', component: Product, props: true // 自动将 params 转为 props // 或使用函数形式: props: route => ({ searchQuery: route.query.q }) } ``` - **组件接收**: ```javascript export default { props: ['id', 'searchQuery'] } ``` - **优点**:组件与路由解耦,便于复用[^1] ### 参数类型与注意事项 | 方式 | 参数位置 | 刷新保留 | URL 可见 | 参数长度限制 | |--------------|---------------|----------|----------|-------------| | **query** | URL ? 后 | 是 | 是 | 有(URL长度限制) | | **params** | 内存/路径 | 部分 | 部分 | 无 | | **动态路径** | URL 路径中 | 是 | 是 | 路径长度限制 | | **props** | 组件属性 | 依赖传参方式 | 依赖传参方式 | 无 | **最佳实践建议**: 1. 关键参数使用**动态路径**(如资源ID) 2. 筛选条件等非敏感数据用 **query 传参** 3. 复杂对象建议用 Vuex 或 localStorage 4. 优先使用 **props 模式** 保持组件独立性 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值