父传子,子传父

1.父传子,子传父

简单介绍组件通信

在现在的开发环境下,不管前后端开发都是组件化模块化,这是因为组件的优势无比的巨大,可以进行多次的复用增加开发效率,也可以分类鲜明,便于维护,而我今天所写的就是开发中分割成不同的组件互相传递数据和互动

我的工作中常用地组件通信大致分为三类: 父传子 , 子传父 , 跨组件传值

 父子组件的确认方法:我将 B 组件import引入到 A 组件中,那么 B 就是 A 的子组件,A 就是 B 的父组件

1.父传子 props

<template>
  <div id="app">
    <!-- 
      这里的text就是子组件props里定义的text,这两个名字得一致
      并且传递的数据也要符合 type 规定的数据类型
      text就是传递字符串,:text就是传递动态数据
      -->
    <Son text="我是引入过来的子组件" />
    <Son :text="Son" />  //Son子组件
  </div>
</template>
 
<script>
import Son from './components/son.vue';
export default {
  data () {
    return {
      Son: '我是引入过来的子组件'
    }
  },
  components: {
    Son
  }
}

2.子传父 $emit

<template>
  <div>
    <h2>son组件</h2>
    <p>props:{{ text }}</p>
    <button @click="changeTextFn">改变文字</button>
  </div>
</template>
 
<script>
export default {
  // 在此处定义props
  props: {
    // props中定义 接收父组件数据的自定义属性,叫什么都可以,我随便起了个text
    text: {
      type: String,    // type 是用来规定此属性接收到的数据的数据类型
      default: "未传递时默认的文字"    // 这个default是当这个 text 没有接收到传递的数据时的默认值
    }
  },
 
  methods: {
    // 按钮点击事件
    changeTextFn () {
      // 发起自定义事件,名字叫什么都行,第一个参数是事件名,之后再跟着的都是传递的参数
      this.$emit('changeFn', '传递的参数')
    }
  }
}
</script>

        我先在原有的代码上添加了一个<button>按钮,在点击调用的函数中,通过 $emit 来发起事件并且可以传递参数

格式:        this.$emit('changeFn', '我想变成三娃') 

格式:        this.$emit('自定义事件名', 传递的参数) 

父组件:        行内监听子组件的 自定义事件名(函数上不用写参数,在 methods 中直接写形参就行)

<template>
  <div id="app">
    <Son :text="Son" @changeFn="changeFn" />
  </div>
</template>
 
<script>
import Son from './components/son.vue';
export default {
  data () {
    return {
      Son: '我是引入过来的子组件'
    }
  },
 
  components: {
    Son
  },
 
  methods: {
    // 监听子组件自定义事件
    changeFn (newText) {
      // 这里的形参接受到的就是子组件中 第二个参数传递的数值
      this.Son= newText
    }
  }
}
</script>

3.跨组件通信 event-bus
        如果两个组件的关系非常的复杂或者没有未产生直接联系,那么通过父子组件通讯是非常麻烦的。这时候可以使用通用的组件通讯方案:事件总线(event-bus)

        按照我的习惯,我会将事件总线创建到 main.js 中,这个使用原理是将bus挂载到Vue原型上,这样就可以保证所有的组件都能通过 this.bus 访问到事件总线,从而通过同一个事件总线监听同一个事件,具体原理和父子传参差不多,都是 $emit 传递数据, 只不过接收变成了$on 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值