vue组件间的通信

父子组件之间的传值

  子组件向父组件传值时,在子组件内部添加事件,当事件触发时进行数据操作,在事件处理函数中通过$emit触发父组件的自定义事件,实质上是子组件的事件触发后会触发父组件的自定义件,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。父组件向子组件传值利用props自定义一个属性,将需要传递的数据赋值给该属性,子组件就可以接收到数据。
总结:父子组件之间的传值都是通过对一个媒介,父传子是通过子组件定义的属性,子传父是通过父组件的自定义事件

    <div id="app">
      <p>{{ sum }}</p>
      <button-counter :title='msg' @add='changeSum'></button-counter>
      <button-counter @add='changeSum'></button-counter>
    </div>
    Vue.component ('button-counter', {
      template: `<button @click='clickHandel'>{{ this.count }}</button>`,
      data () {
        return {
          count: 0
        }
        props: ['title']
      },
      methods: {
        clickHandel () {
          this.count ++,
          this.$emit('add')
            console.log(this.title)
        }
      }
    })
      new Vue ({
        el: '#app',
        data () {
          return {
            sum: 0
          }
        },
        methods: {
          changeSum () {
            this.sum ++
          }
        }
      })
非父子组件之间的传值(在一个组件中通过$on监听一个自定义事件,在另一个组件中通过$emit 触发该自定义事件,并传递参数数据)在简单的场景下,可以使用一个空的 Vue 实例作为事件总线:
// bus.js
import Vue from 'vue'
var bus = new Vue()
export default bus
// module.exports = bus

两个非父子组件

// A
<template>
    <div>
        <button @click="sendToB">toB</button>
    </div>
</template>

<script>
import Bus from './bus'
export default {
    methods:{
        sendToB: function () {
            Bus.$emit('toBFlag','hello')
        }
    }

}
</script>

<style>

</style>

// B
<template>
  
</template>

<script>
import Bus from './bus'
export default {
  created: function () {
      Bus.$on('toBFlag',function (data) {
          console.log(data)
      })
  }
}
</script>

<style>

</style>

posted @ 2018-03-08 21:01  沐荍  阅读(158)  评论(0编辑  收藏  举报