美文网首页前端Vue专辑Vue.js
Vue系列-再聊聊组件通信

Vue系列-再聊聊组件通信

作者: 前端切克闹 | 来源:发表于2019-10-28 23:41 被阅读0次

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

    相关文章

      网友评论

        本文标题:Vue系列-再聊聊组件通信

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