Vue系列-再聊聊组件通信

基于职责单一原则,在做应用开发时要尽量倾向于功能最小粒度的组件封装
不可避免的,我们的大应用就会被切割成很多小组件, 这也是利于后续维护和开发。
而应用总是一体的,组件之间也是联系不断,组件之间的通信就必不可少,在Vue中有如下几种组件通信方式

属性/事件

用于父子组件之间通信,是最常用的组件通信方式:

  • 子组件可以在props定义属性扩展,供父组件传入用以接收父组件信息,在子组件中可通过watch来监听变化
  • 父组件在子组件上做事件捕获,通过子组件的事件触发接收子组件信息
<list>
      <list-item @del='actDel(index)' :item="item" v-for="(item,index) in list"></list-item>
</list>

list组件
{
    data(){
        return {
              list:[
                      {name:"test1"}, {name:"test2"}, {name:"test3"}
              ]
        }
    },
    methods:{
        actDel(index){
                this.list.splice(index,1)
        }
    }
}
list-item 组件
{
    template: `<div><span v-html="item.name"></span><button @click="$emit('del')">删除</button></div>`,
    props:["item"]
}

状态机

通过vuex状态机来管理应用统一状态,状态数据可以在应用的各组件中访问,并监听变化

store.js
{
    state:{
        userName:"test"
    },
    mutations:{
          changeUName(state,name){
              this.userName=name;
        }
    }
}

{
    template: `<div v-html="$store.state.userName"></div>`
}

新建Vue实例

新建多一个Vue实例来做统一事件订阅发布

event.js
var Event=new Vue();
export default Event;

a.js
<template>
  <div></div>
</template>
<script>
import Event from "event";
export default{
  mounted(){
      Event.$on("test",function(){console.log('test')})
  }
}
</script>
b.js
<template>
  <div><button @click="emitTest">Test</button></div>
</template>
<script>
import Event from "event";
export default{
  methods:{
        emitTest(){
            Event.$emit("test")
        }
  }
}
</script>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装...
    youins阅读 9,570评论 0 13
  • 摘要: 总有一款合适的通信方式。 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有。 前言 组件是 v...
    Fundebug阅读 15,606评论 3 57
  • 此文基于官方文档,里面部分例子有改动,加上了一些自己的理解 什么是组件? 组件(Component)是 Vue.j...
    陆志均阅读 3,883评论 5 14
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,273评论 0 6
  • 【想要获得他人赞美,就需要自身美得光芒四射】 生活中你若找不到坚持下去的理由,那就找一个从新开始的理由,生活就是这...
    时代文化阅读 319评论 0 0