美文网首页H5技术栈vuejsWeb前端之路
VUE专题(三)组件之间的传值(父传子,子传父,非父子组件之间通

VUE专题(三)组件之间的传值(父传子,子传父,非父子组件之间通

作者: 腿毛崩你一脸 | 来源:发表于2017-02-28 19:34 被阅读16614次
    vue

    今天我来讲一下vue组件之间的传值。
    组件实例的作用域是孤立的。
    这意味着不能并且不应该在子组件的模板内直接引用父组件的数据。
    可以使用 props 把数据传给子组件。
    先说一下场景:
    我在App.vue中引用serList组件,现在他们父子关系。
    这是我在App.vue中的代码
    <pre>
    <serList class="serListPad" :services="services" @services-change="servicesChange"></serList>
    </pre>
    serList 是在components中定义好的
    <pre>
    import serList from './components/ser_list.vue';
    components: {
    serList
    }
    </pre>
    services也是在data中定义好的
    <pre>
    import service from './components/service.vue';
    data () {
    return {
    services: [service],
    }
    }
    </pre>
    我现在用bind的方式把我想要传给子组件的值给传过去,:services="services",: 是bind的缩写。
    现在我们来注意看子组件serList.vue:
    父组件传过来的值子组件要用props接收
    <pre>
    props: ['services']
    </pre>
    我们接收过来的这个值怎么使用呢?
    我们可以直接像data中的数据一样,用this.services,也可以像我一样再data中再定义一个新的data当做桥梁
    <pre>
    data () {
    return {
    myServices: this.services
    }
    }
    </pre>
    到目前为止,父传子就是这样的
    现在讲一下子传父:
    vue2.0中可以使用$emit来向父组件派发事件,父组件中用$on来监听自定义的事件
    <pre>
    watch: {
    services(val) {
    this.myServices = val;
    },
    myServices(val) {
    this.$emit('services-change', val);
    console.log('打印myServices');
    console.log(this.myServices);
    }
    },
    </pre>
    在services中监听一下变化,然后把最新的变化赋值给myServices
    同样mySercices的变化也要通知父级
    'sercices-change'自定义事件传递给父级,父级接收到这个事件,然后执行具体的方法。
    <pre>
    <serList class="serListPad" :services="services" @services-change="servicesChange"></serList>
    </pre>
    然后在methods中定义servicesChange方法
    <pre>
    servicesChange (val) {
    this.services = val;
    }
    </pre>

    现在讲一下非父子组件之间的通信(但是太复杂的情况,建议还是使用状态管理: vuex)
    使用空的vue实例作为中央事件总线
    <pre>
    var bus = new Vue();

    // 触发组件 A 中的事件
    bus.$emit('id-selected', 1)

    // 在组件 B 创建的钩子中监听事件
    bus.$on('id-selected', function (id) {
    // ...
    })
    </pre>
    这些就是我目前用到的传值。
    欢迎交流。

    vue交流群

    相关文章

      网友评论

      • 间阳幕宾:非父子组件通信写得和文档一样,新手一脸懵逼。
        dmhb:抄来抄去,真垃圾
        腿毛崩你一脸: @间阳幕宾 嗯嗯 我今天修改下,好长时间没动了
      • bh_cql:能不能把文件名标明. 看的好费劲
        腿毛崩你一脸: @bh_cql 好嘞
        bh_cql:我是说把文件名用注释写在代码里面,

      本文标题:VUE专题(三)组件之间的传值(父传子,子传父,非父子组件之间通

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