MST

星途 面试题库

面试题:Vue侦听器与跨组件通信替代方案的实践应用

在一个电商购物车项目中,购物车组件和商品列表组件需要通信,当商品数量在商品列表中改变时,购物车总价要实时更新。请结合Vue侦听器和一种跨组件通信的替代方案来实现这个功能,并说明这样做的优势和可能遇到的问题。
30.7万 热度难度
前端开发Vue

知识考点

AI 面试

面试题答案

一键面试

使用Vue侦听器和事件总线实现

  1. 事件总线(Event Bus)
    • 创建一个事件总线实例,通常在main.js中:
    import Vue from 'vue';
    export const eventBus = new Vue();
    
    • 在商品列表组件中,当商品数量改变时,通过事件总线触发一个事件:
    <template>
      <div>
        <input type="number" v-model="product.quantity" @input="updateQuantity">
      </div>
    </template>
    <script>
    import { eventBus } from '@/main';
    export default {
      data() {
        return {
          product: {
            quantity: 1,
            price: 10
          }
        };
      },
      methods: {
        updateQuantity() {
          eventBus.$emit('quantityChanged', this.product);
        }
      }
    };
    </script>
    
    • 在购物车组件中,监听事件总线的quantityChanged事件,更新购物车总价:
    <template>
      <div>
        <p>购物车总价: {{ totalPrice }}</p>
      </div>
    </template>
    <script>
    import { eventBus } from '@/main';
    export default {
      data() {
        return {
          totalPrice: 0
        };
      },
      created() {
        eventBus.$on('quantityChanged', product => {
          this.totalPrice += product.price * product.quantity;
        });
      }
    };
    </script>
    
  2. Vue侦听器
    • 在商品列表组件中,可以使用侦听器监听商品数量的变化:
    <template>
      <div>
        <input type="number" v-model="product.quantity">
      </div>
    </template>
    <script>
    export default {
      data() {
        return {
          product: {
            quantity: 1,
            price: 10
          }
        };
      },
      watch: {
        'product.quantity': {
          immediate: true,
          handler(newVal) {
            // 这里可以做一些本地的逻辑,比如验证数量是否合法等
            // 然后触发事件总线事件
            this.$emit('quantityChanged', this.product);
          }
        }
      }
    };
    </script>
    

优势

  1. 事件总线
    • 灵活性高:不同层级的组件之间都可以方便地通信,不需要通过props层层传递数据,适合非父子组件间的通信。
    • 解耦性好:组件之间的依赖关系降低,商品列表组件不需要知道购物车组件的具体实现,只需要触发事件即可。
  2. Vue侦听器
    • 方便监听数据变化:可以方便地在数据变化时执行一些逻辑,比如验证数据的合法性,或者在数据变化后执行一些副作用操作,然后再触发跨组件通信的事件。

可能遇到的问题

  1. 事件总线
    • 命名冲突:如果项目中有大量组件通过事件总线通信,可能会出现事件名称冲突的问题,导致错误的事件被触发。
    • 难以调试:由于事件总线是全局的,当出现问题时,很难确定是哪个组件触发了事件,排查问题比较困难。
  2. Vue侦听器
    • 性能问题:如果侦听器过多或者处理逻辑复杂,可能会影响性能,特别是在频繁触发数据变化的场景下。另外,如果侦听器设置不当,可能会导致死循环,比如在侦听器中修改被监听的数据,又触发侦听器。