<div id="app">
  <div class="p-5">
    <h6>預設情境</h6>
    <a href="https://javascript.info/bubbling-and-capturing">冒泡事件參考文章</a>
    <div class="p-3 bg-success" @click="trigger('div')">
      <span class="box d-flex align-items-center justify-content-center" @click="trigger('box')">
        <button class="btn btn-outline-secondary" @click="trigger('button')">按我</button>
      </span>
    </div>

    <h6 class="mt-3">stopPropagation (防止向外尋找)</h6>
    <div class="p-3 bg-success" @click="trigger('div')">
      <span class="box d-flex align-items-center justify-content-center" @click.stop="trigger('box')">
        <button class="btn btn-outline-secondary" @click="trigger('button')">按我</button>
      </span>
    </div>

    <h6 class="mt-3">事件偵聽器時使用 capture 模式 (事件改為由外而內)</h6>
    <div class="p-3 bg-success" @click.capture="trigger('div')">
      <span class="box d-flex align-items-center justify-content-center" @click.capture="trigger('box')">
        <button class="btn btn-outline-secondary" @click.capture="trigger('button')">按我</button>
      </span>
    </div>

    <h6 class="mt-3">事件偵聽器時使用 self 模式 (只會觸發自己範圍內的)</h6>
    <div class="p-3 bg-success" @click.self="trigger('div')">
      <span class="box d-flex align-items-center justify-content-center" @click.self="trigger('box')">
        <button class="btn btn-outline-secondary" @click.self="trigger('button')">按我</button>
      </span>
    </div>
    <hr>
    <h3 class="mt-3">事件偵聽器只觸發一次 once</h3>
    <div class="p-3 bg-success" @click.once="trigger('div')">
      <span class="box d-flex align-items-center justify-content-center" @click.once="trigger('box')">
        <button class="btn btn-outline-secondary" @click.once="trigger('button')">按我</button>
      </span>
    </div>
    <hr>
  </div>
</div>
html{
  
}
.box {
  display: block;
  background-color: var(--bs-light);
  border: 1px solid var(--bs-gray);
  width: 80px;
  height: 80px;
}
.box {
  transition: all .5s;
}
.box.rotate {
  transform: rotate(45deg)
}
const App = {
  data() {
    return {
      text: '小明',
      isTransform: true,
      num: 10,
      event: 'click',
    }
  },
  methods: {
    trigger: function(name) {
      console.log(name, '此事件被觸發了')
    }
  }
};
Vue.createApp(App).mount('#app');
Run Pen

External CSS

  1. https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.0.2/css/bootstrap.min.css

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/vue/3.2.37/vue.global.prod.min.js