vue父子组件传值

1、父子组件传值:

(1)先在父组件中给子组件的自定义属性绑定一个父组件的变量

<template class="father">		
  <child :自定义属性名="父组件的变量"></child>
</template>

(2)在子组件的props属性中可以提取出父组件给的值,props中的变量用法和data中变量用法完全一样,只不过值的来源不同

export default { 
  name:"child", 
  props: ["自定义属性名"], 
  data() {} 
}

2、子父组件传值:

(1)先在父组件中给子组件的自定义属性绑定一个父组件的函数

<template class="father">  
  <child  @自定义事件="父的处理函数">
  <template >
    export default {
      name: "father",
      data() {}
      methods:{
	父的处理函数(参数){
           //参数:得到子组件触发事件($emit)时,传递过来的数据
         }
      }
    })

(2)在子组件中 this.$emit(“父的处理函数”,this.数据) 触发父组件中的函数进行传参

在子组件里用$emit向父组件触发一个事件,父组件监听这个事件

父组件:

<template>
  <div>
    <child @fMethod="fatherMethod"></child>
  </div>
</template>
<script>
  import child from '~/components/dam/child';
  export default {
    components: {
      child
    },
    methods: {
      fatherMethod(data) {
        console.log(data);
      }
    }
  };
</script>

子组件:

<template>
  <div>
    <button @click="childMethod()">点击</button>
  </div>
</template>
<script>
  export default {
    methods: {
      childMethod() {
        this.$emit('fMethod',data);
      }
    }
  };
</script>

3、兄弟组件传值:

方法概括:先创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件

(1)创建全局空Vue实例:eventBus

import Vue from 'vue';
const eventBus= new Vue()  //创建事件总线
export default eventBus;

(2)具体页面使用$emit发布事件 - 传递值

import eventBus from '@u/eventBus'
eventBus.$emit('send',‘hello’)

(3)具体页面使用$on订阅事件 - 接收组件值

import eventBus from '@u/eventBus'
eventBus.$on('send', msg => { console.log(msg)  //控制台输出 hello }

注意:onemit发布事件后所有组件都可以onemit事件放在mounted钩子函数中,等待子组件创建并onemit发布事件

(4)$off()移除事件监听

import eventBus from '@u/eventBus'
eventBus.$off('send')  

注意:事件订阅功能oneventBus对象完成的,与组件无关,如果用v-if销毁组件的时候,会形成闭包,造成内存泄漏,所有要在销毁组件的时候进行取消监听事件

parentchildrenu与ref的区别:

(1)$parent方法是在子组件中可以直接访问该组件的父实例或组件。

在父组件中定义一个切换显示页面执行中的显示方法。

switchLoadPage(msg) {
  if(!this.loading && msg)
  this.loadtext=msg;
  this.loading = !this.loading;
},
​####在子组件中直接通过$parent去调用该方法
`this.$parent.switchLoadPage();`
###(2)$children方法是在父组件中可以直接访问子组件的实例,但是不保证子组件的顺序。
###(3) ref 被用来给DOM元素或子组件注册引用信息。引用信息会根据父组件的 $refs 对象进行注册。如果在普通的DOM元素上使用,引用信息就是元素; 如果用在子组件上,引用信息就是组件实例。
例如:在父组件中自定义一个表格组件,给子组件加上 ref 属性
`<result ref="result" :config="dgConfig" ></result>`
​例如:在父组件中就可以通过this.$refs.result去找到result子组件进行操作,比如把父组件的sdata直接放入子组件中

methods: {
info(){
this.$refs.result.sdata = this.sdata;
},
}

父组件给子组件传值
子组件给父组件传值
兄弟组件中使用EventBus传参
路由间传值
通过refs传参
通过

##1. 父组件给子组件传值
示例:子组件

// children

父组件
``` @@2.子组件给父组件传值 父组件 ``` // parent ``` 子组件 ``` // children ``` ##3.兄弟组件中使用EventBus传参 父组件 ``` // parent ``` EventBus.js ``` // EventBus.js import Vue from 'vue' export default new Vue() ``` 子组件一 ``` // childrenOne ``` 子组件二 ``` // 组件二 ``` ##4. 路由间传值 ###(1)使用?传值 ``` // a页面(?后传参) this.router.push(/B?name=demo);//bqueryurlvarname=this.route.query.name ``` ###(2)使用:传值 ``` // 路由配置 { path: '/B/:name', name: B, component: () => import('../views/B.vue') } // 通过this.$route.params.name获取 ``` ###(3)父子传值 ``` // parent页面 // children页面 // 由于name更新之后并没有刷新路由,所以在mounted中无法监听到name的变化,得使用watch监听 props: ['name'], watch: { name(oldVal,newVal) { console.log(newVal) } } ``` ##5. 通过refs传参 parent页面(通过ref调用子组件的方法并传入参数) ```
children页面(通过setMsg函数获取传入的参数值)
``` ##6. 通过依赖注入provide和inject给后代 父组件 ``` ``` 子组件 ``` ``` ##7.祖传孙使用$attrs ``` // GrandParent

// parent

// children
``` ##8. 孙传祖使用$listeners GrandParent.vue ``` // GrandParent ``` parent.vue ``` // parent ``` children.vue ``` // children ``` ##9. parentparent获取父组件的实例,拿到父组件data中的参数 父组件 ``` ``` 子组件 ``` ```

posted @   Ericup  阅读(628)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示