首页 > 其他分享 >Vue组件中的父子传参,子父传参,兄弟传参,以及事件总线

Vue组件中的父子传参,子父传参,兄弟传参,以及事件总线

时间:2023-02-15 11:48:59浏览次数:50  
标签:传参 Vue 子父 name default Son1 export 组件

转载自:https://blog.csdn.net/weixin_56818823/article/details/124309134

父子传参

父组件中的代码

<template>
  <div>
    <!-- :getname 是自定义的 -->
    <son-1 :getname="name"></son-1>
  </div>
</template>
 
<script>
import Son1 from '@/components/Son1.vue'
export default {
  components: { Son1 },
  data() {
    return {
      //父组件的值
      name: '荷兰猪冯',
    }
  },
}
</script>

子组件通过props接收父组件的值

<template>
  <div>
    <div>{{ getname }}</div>
  </div>
</template>
 
<script>
export default {
  props: ['getname'],
}
</script>

子父传参

在子组件中的代码如下

<script>
export default {
  data() {
    return {
      name: '我是一只荷兰猪',
    }
  },
  methods: {
    goTo() {
      //通过$emit的进行传递
      //toFather:自定义事件名称
      //this.name 要传递给父组件的值
      this.$emit('toFather', this.name)
    },
  },
  mounted() {
    this.goTo()
  },
}
</script>

在父组件中接收方式如下

<template>
  <div>
    <div>子组件的值:{{ name }}</div>
    <!-- @toFather:子定义的事件名称 getname:父定义的事件处理函数 -->
    <son-1 @toFather="getname"></son-1>
  </div>
</template>
 
<script>
import Son1 from '@/components/Son1.vue'
export default {
  components: { Son1 },
  data() {
    return {
      name: '',
    }
  },
  methods: {
    //处理事件函数,此时参数就是子组件传递的值
    getname(e) {
      this.name = e
    },
  },
}
</script>

当然还可以通过 this.$parent.父组件变量名称 最为简单粗暴的方式来完成子父传参,违背了官方的 单向数据流原则, 但好用
this.$parent.fatherName = this.name

兄弟组件传参的方式

我们可以通过 兄弟组件依赖共同的父元素 实现中转

son1通过.$emit的方法传递给父元素,然后父元素在传递给son2 ,最后son2通过父子传参的方式,用props接收参数,代码如下

<template>
  <div>
    <div>This is son1</div>
    <div>son1的name:{{ name }}</div>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      name: '吃荷兰猪啊',
    }
  },
  methods: {
    toFather() {
      this.$emit('gotoFather', this.name)
    },
  },
  mounted() {
    this.toFather()
  },
}
</script>

然后父组件接收son1传递的参数,最后父组件再传递给son2,就是实现了兄弟组件的传参

<template>
  <div>
    <div>父亲获取儿子1的值{{ fatherName }}</div>
    <!-- gotoFather:son1定义的事件 -->
    <!-- getname:处理gotoFather的函数 -->
    <son-1 @gotoFather="getname"></son-1>
    <hr />
    <hr />
    <!-- :name给son2传递的方法名 -->
    <!-- fatherName:传递的值 -->
    <son-2 :name="fatherName"></son-2>
  </div>
</template>
 
<script>
import Son1 from '@/components/Son1.vue'
import Son2 from '@/components/Son2.vue'
export default {
  components: { Son1, Son2 },
  data() {
    return {
      fatherName: '',
    }
  },
  methods: {
    getname(e) {
      this.fatherName = e
      console.log(e)
    },
  },
}
</script>
 
<style lang="scss" scoped></style>

还有一种就是通过事件总线的方式来进行传递

加入son3组件要传值给所有组件,以前父组件

事件总线- 实现任意关系的组件传参

通过 this.$root.$emit('bus', '事件总线:' + newValue)的方式来进行传递,第一个参数"bus"是自定义的事件名,第二参数是传递给事件的具体参数,.$emit:触发自定义事件

<template>
  <div>
    <button @click="num++">num:{{ num }}</button>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      num: 1,
    }
  },
  watch: {
    num(newValue, oldValue) {
      this.$root.$emit('bus', '事件总线:' + newValue)
    },
  },
}
</script>

其他组件或者父组件接收方式如下

// $on: 当 参数1 名称的事件触发时, 触发参数2的函数

此外$off是关闭事件总线,不触发函数

<script>
export default {
  data() {
    return {
      num: '',
    }
  },
  mounted() {
    this.$root.$on('bus', value => {
      this.num = value
      console.log(value)
    })
  },
}
</script>

标签:传参,Vue,子父,name,default,Son1,export,组件
From: https://www.cnblogs.com/gyh907368/p/17122200.html

相关文章

  • 【前端】vue之父子组件传值
    方式1:props+$emit父传子:父组件向子组件传递参数是通过props属性的形式传入子组件配置props属性,其中填入父组件传入的参数名称父组件写入子组件,并在子组件中加入需要传......
  • 解决vue和idea端口号不同-即跨域问题
    当vue端口号为:8081,idea端口号为8080  网页响应Request解决方法在idea的在Controller类上加上如下注解:@CrossOrigin(origins={"*","null"})   ......
  • CentOS中使用Docker+nginx部署Vue打包的dist项目
    场景CentOS7中Docker的安装与配置首先按照上面在CentOS7中安装Docker注:关注公众号霸道的程序猿获取编程相关电子书、教程推送与免费下载。实现1、首先打包Vue项目成dist文......
  • vue 组件通信方式 ,父子、隔代、兄弟 三类通信,六种方法
    (1)props/$emit 适用父子组件通信(2) ref 与 $parent/$children 适用父子组件通信(3)$attrs/$listeners 适用于隔代组件通信(4)provide/inject 适用于隔代组......
  • 解决 Vue3 中路由切换到其他页面再切换回来时 Echarts 图表不显示的问题
    问题复现:正常状态下:切换到其他页面再切换回来:问题解决:其实这个问题的解决方式官网写得清清楚楚,我们看看官网怎么解决的:接下来我用代码解释下这句话(正确的做法是,在......
  • Vue+Electron开发跨平台桌面应用实践
    背景公司去年对 CDN 资源服务器进行了迁移,由原来的通过 FTP 方式的文件存储改为了使用 S3 协议上传的对象存储,部门内@柴俊堃同学开发了一个命令行脚本工具 Rapi......
  • vue-2 插值语法
    插值语法mvm演示<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scriptsrc="js/vue.js"></script></head><bod......
  • vue-1
    drf回顾#1drf入门规范-前后端分离模式-前后端混合-postman-restful规范-drf:django的app#2序列化类(重点)-Serializer-字段类-字段参数-局部钩子-全局钩......
  • vue 父子组件加载顺序(生命周期钩子)
    父组件的实例化过程(包括父组件的beforeCreate和created钩子函数)父组件的模板编译和渲染过程子组件的实例化过程(包括子组件的beforeCreate和created钩子函数)子组件的模......
  • Vue - 2 插值语法与指令系统
    目录Vue-2插值语法与指令系统一、插值语法语法案例二、指令1.什么是指令系统?2.文本指令v-htmlv-textv-show:显示/隐藏任务v-if:显示/删除任务3.属性指令4.事件指令5.class......