美文网首页
Vue中组件之间的数据传递之eventBus

Vue中组件之间的数据传递之eventBus

作者: 都江堰古巨基 | 来源:发表于2019-07-26 22:59 被阅读0次

    今天去面试,被碾压了,面试官提到了一个组件间数据传递的方式eventBus,趁热赶紧学一下。
    首先在工程中要使用eventBus可以这么干:
    先在main.js中指定eventBus:
    Vue.prototype.$EventBus = new Vue()
    相当于挂载一个Vue的实例。
    下面开始尝试使用:
    先编写comA用于触发一个事件在父组件中响应减操作并接受B组件的传过来的数据最后console.log出来:

    <template>
      <button @click="increment()">+ 加并接受另一个组件的值!</button>
    </template>
    
    <script>
    export default {
      name: 'IncrementCount',
      data() {
        return {
          num: 1,
          deg: 1
        };
      },
      methods: {
        increment() {
          this.$EventBus.$emit("incremented",{
            num: this.num,
            deg: this.deg
          });
        }
      },
      mounted() {
        // 这是响应change事件
        this.$EventBus.$on("change", test => {
          console.log(test)
        })
      }
    }
    </script>
    

    然后我们编写comB,用于触发一个事件在父组件中响应加操作并传递值到comA:

    <template>
      <button @click="decrease()"> -减 </button>
    </template>
    
    <script>
    export default {
      name: 'DecreaseCount',
      data() {
        return {
          num: 1,
          deg: 1,
          show_data: 1000
        }
      },
      methods: {
        decrease() {
          this.$EventBus.$emit("decreased", {
            num: this.num,
            deg: this.deg,
            show_data: this.show_data  // show_data就是要传递到组件A的值
          })
        }
      }
    }
    </script>
    

    最后我们编写一个父组件,将A、B组件组合在一起:

    <template>
        <div id="root">
          <IncrementCount />
          <DecreaseCount />
          <div>{{ degValue }}</div>
          <div>{{ fontCount }}</div>
          <div>{{ backCount }}</div>
        </div>
    </template>
    
    <script>
    import IncrementCount from '../components/add_event_bus';
    import DecreaseCount from '../components/decrease_event_bus';
    
    export default {
      name: 'App',
      components: {
        IncrementCount,
        DecreaseCount
      },
      data() {
        return {
          degValue: 0,
          fontCount: 0,
          backCount: 0
        };
      },
      mounted() {
        // 接收A组件的incremented事件
        this.$EventBus.$on("incremented", ({num, deg}) => {
          this.fontCount += num
          this.$nextTick(() => {
            this.backCount += num
            this.degValue += deg
          })
        })
        // 接收B组件的decreased事件
        this.$EventBus.$on("decreased", ({num, deg}) => {
          this.fontCount -= num
          this.$nextTick(() => {
            this.backCount -= num
            this.degValue -= deg
            // 这里触发change事件
            this.$EventBus.$emit("change", 1000)
          })
        })
      }
    }
    </script>
    

    相关文章

      网友评论

          本文标题:Vue中组件之间的数据传递之eventBus

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