Vue 父子组件通信

几种常见的通信方式:

1、prop 属性

父组件通过绑定属性的方式,给子组件传值,同时子组件通过设置 props 来接收

<div id="app">
  <child :content="msg"></child>
</div>

<script>

  let Child = Vue.extend({
    template: '<h1>{{content}}</h1>',
    props: {
      content: {
        type: String,
        default: () => { return 'from child' }
      }
    }
  })

new Vue({
    el: '#app', 
    data: {
      msg: 'hello'
    },
    components: {
      Child
    }
  })
</script>

 2、$emit

子组件通过调用 this.$emit(‘事件’,‘参数’) 给父组件通信,父组件通过监听 子组件的事件,来获取

<div id="app">
  <v-button @parent="handleParent"></v-button>
</div>

<script>

let vButton = Vue.extend({
  template: '<button @click="handleClick"></button>',
  data: {
    tragger: 'hello vue'
  },
  methods: {
    handleClick() {
      this.$emit('parent', this.tragger)
    }
  }
})

new Vue({
  el: '#app',
  data: {
    content: ''
  },
  methods: {
    handleParent(val) {
      this.content = val
    }
  },
  components: {
    vButton
  }
})
</script>

 3、属性attrs 和 $listeners

 

4、EventBus (bus 总线)

思路就是声明一个全局Vue实例变量 EventBus , 把所有的通信数据,事件监听都存储到这个变量上。这样就达到在组件间数据共享了,有点类似于 Vuex,但复杂的项目还是用 Vuex

子组件通过 EventBus.$emit() 向外触发事件,父组件通过EventBus.$on() 来监听该事件,变量保存在EventBus

 

5、Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式

 

6、通过ref 属性

//父组件

<template>
    <div>
        <Button @click="handleClick">点击调用子组件方法</Button>
        <Child ref="child"/>
    </div>
</template>    

<script>
import Child from './child';

export default {
    methods: {
        handleClick() {
              this.$refs.child.navigate();
        },
    },
}
</script>


//子组件

<template>
  <div>我是子组件</div>
</template>
<script>
export default {
  methods: {
    navigate() {
      console.log('我是子组件的方法');
    },
  },
};
</script>

  

 

posted @ 2020-02-27 11:09  XLLANG  阅读(239)  评论(0编辑  收藏  举报