vue2.0父子组件间通信

作者: JackWhite | 来源:发表于2017-04-18 15:36 被阅读6187次

    父子通信目前有四种方式:

    1.父组件传递数据给子组件

    父组件数据如何传递给子组件呢?可以通过props属性来实现
    父组件:
    <parent> <child :child-msg="msg"></child>//这里必须要用 - 代替驼峰</parent>data(){ return { msg: [1,2,3] };}

    子组件通过props来接收数据:
    方式1:
    props: ['childMsg']

    方式2 :
    props: { childMsg: Array //这样可以指定传入的类型,如果类型不对,会警告}

    props: { childMsg: { type: Array, default: [0,0,0] //这样可以指定默认的值 }}
    这样呢,就实现了父组件向子组件传递数据.

    2.子组件与父组件通信

    那么,如果子组件想要改变数据呢?这在vue中是不允许的,因为vue只允许单向数据传递,这时候我们可以通过触发自定义事件来通知父组件改变数据,从而达到改变子组件数据的目的.

    使用 v-on 绑定自定义事件
    每个 Vue 实例都实现了事件接口(Events interface),即:
    使用 $on(eventName) 监听事件
    使用 $emit(eventName) 触发事件

    父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。

    子组件:
    <template> <div @click="up"></div></template>methods: { up() { this.$emit('resultChange','hehe'); //主动触发resultChange方法,'hehe'为向父组件传递的数据 }}

    父组件:
    <div> <child @on-result-change="mychangHandle" :msg="msg"></child> //监听子组件触发的upup事件,然后调用change方法</div>methods: { mychangHandle(msg) { this.msg = msg; }}

    触发事件使用驼峰格式的自定义事件名称,在父组件中就可以使用on-evnet-name的形式来监听。

    3.任意组件间通信

    如果2个组件不是父子组件那么如何通信呢?这时可以通过eventHub来实现通信.
    所谓eventHub就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件.
    使用一个空的 Vue 实例作为中央事件总线:
    let Hub = new Vue(); //创建事件中心,注意Hub要放在全局

    组件1触发:
    <div @click="eve"></div>methods: { eve() { Hub.$emit('change','hehe'); //Hub触发事件 }}

    组件2接收:
    <div></div>created() { Hub.$on('change', () => { //Hub接收事件 this.msg = 'hehe'; });}

    4. $refs

    尽管有 props 和 events ,但是有时仍然需要在 JavaScript 中直接访问子组件。为此可以使用 ref 为子组件指定一个索引 ID 。

    <div id="parent">
      <user-profile ref="profile"></user-profile>
    </div>
    
    var parent = new Vue({ el: '#parent' })
    // 访问子组件
    var child = parent.$refs.profile
    

    当 ref 和 v-for 一起使用时, ref 是一个数组或对象,包含相应的子组件。
    $refs 只在组件渲染完成后才填充,并且它是非响应式的。它仅仅作为一个直接访问子组件的应急方案——应当避免在模版或计算属性中使用 $refs 。

    相关文章

      网友评论

        本文标题:vue2.0父子组件间通信

        本文链接:https://www.haomeiwen.com/subject/ebyfzttx.html