Event || CustomEvent

61 阅读1分钟

Event || CustomEvent

特性EventCustomEvent
定义原生 DOM 基础事件对象继承自 Event,支持自定义数据传递
能否携带数据❌ 不能✅ 能(通过 detail 属性)

原生 Event

// 创建普通事件
const event = new Event('click');

// 通过 dispatchEvent 就能触发element身上监听或绑定的事件,
// 不管是addEventListener添加的 
// 还是 <div id="example1" onclick="say()">example1</div>
element.dispatchEvent(event);

CustomEvent

// 创建带数据的事件
const event = new CustomEvent('update', {
  detail: { id: 123, value: 'trimmed' } // 自定义数据
});
element.dispatchEvent(event);

element.addEventListener('update', (e) => {
   console.log('element---update', e.detail);
 })

项目中的应用场景

譬如针对项目里面的所有输入类表单做 前后空格 去除, 可以使用 自定义指令+触发自定义事件

  • main.js
app.directive('trim', {
  mounted(el) {
    const handler = (e) => {
      const target = e.target 
      target.value = target.value.trim()
      // DOM 的值改变了,但 Vue 的 `v-model` 不会自动更新, 触发`v-model` 本质上监听的是 `input` 或 `change` 事件
      target.dispatchEvent(new Event('input'))
    }
    // 失去焦点 时处理
    el.addEventListener('blur', handler)
  }
})


<a-input 
  v-model:value='submitForm.serviceVersion' 
  v-trim
  placeholder='请输入' 
/>