美文网首页
不用vuex的case下,隔代组件间的通信

不用vuex的case下,隔代组件间的通信

作者: JokiZhou | 来源:发表于2019-04-11 21:25 被阅读0次

    原理:参考了Vue.js 1.x中的 dispatch 和 broadcast的特性

    适合开发层级不会很复杂的独立组件

    缺点:依赖组件树的结构,比如需要知道A和B谁是父,谁是子,然后父中broadcast,子中dispatch。

    先列一个简单的case,参考vue文档:
    子组件

    export default {
      methods: {
        handleEmitEvent () {
          this.$emit('test', 'Hello Vue.js');
        }
      }
    }
    

    父组件

    <template>
      <child-component @test="handleEvent">
    </template>
    <script>
      export default {
        methods: {
          handleEvent (text) {
            console.log(text);  // Hello Vue.js
          }
        }
      }
    </script>
    

    子组件触发,父组件监听。
    So, 既然是子组件自己触发的,那它自己也可以监听到,
    即组件自己监听自己的emit。

    <template>
      <div>
        <button @click="handleEmitEvent">触发自定义事件</button>
      </div>
    </template>
    <script>
      export default {
        methods: {
          handleEmitEvent () {
            this.$emit('test', 'Hello Vue.js')
          }
        },
        created () {
          this.$on('test', (text) => {
             console.log(text) // Hello Vue.js
          });
        }
      }
    </script>
    

    乍看多次一举, handleEmitEvent可以直接写逻辑,没必要emit,on

    划重点

    如果handleEmitEvent不是通过该组件自身调用的呢?

    设想这样的场景,A是父组件,B是子组件,中间可能跨多级。
    A向B通信:
    A.vue

    <template>
        <input @focus="handleFocus" />
    </template>
    <script>
      import Emitter from '../mixins/emitter.js'; // 先忽略混入的内容
      export default {
        name: 'componentA',
        mixins: [ Emitter ],
        methods: {
          handleFocus () {
            this.broadcast('componentB', 'sendMessage', '我被点了');
          }
        }
      }
    </script>
    

    B.vue

    <script>
    export default {
      name: 'componentB',
      created () {
        this.$on('sendMessage', this.showMessage)
      },
      methods: {
        showMessage (text) {
          console.log(text); // 我被点了
        }
      }
    }
    </script>
    

    这里B监听的事件触发源是A组件中的input,具体调用emit sendMessage的地方其实还是在B组件中,不然B怎么会监听到呢?
    其中究竟隐藏着怎样的秘密?
    且听下回分解。
    写的比较粗糙..
    要去接人了。

    Core Codes

    to be continued...

    相关文章

      网友评论

          本文标题:不用vuex的case下,隔代组件间的通信

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