注册 登录

清河洛

svelte的事件

qingheluo2023-08-29清河洛976
绑定事件使用on:event={handler}属性来为元素绑定指定的事件其中handler可以是函数名,也可以直接编写简单的处理函数<button on:click={func}>num+1</button> <button on:click={()=>num++}>num+1</button> <button on:click={function(){num++}}>num+1</button>事件修饰符使用"|"字符为DOM事件添加修饰符来变更行为,可用的修饰符有preventDefault :取消时间默...

绑定事件

使用on:event={handler}属性来为元素绑定指定的事件

其中handler可以是函数名,也可以直接编写简单的处理函数

<button on:click={func}>num+1</button>
<button on:click={()=>num++}>num+1</button>
<button on:click={function(){num++}}>num+1</button>

事件修饰符

使用"|"字符为DOM事件添加修饰符来变更行为,可用的修饰符有

preventDefault :取消时间默认行为,在运行事件处理程序之前调用event.preventDefault()
stopPropagation :阻止事件冒泡,调用event.stopPropagation()
passive :改善touch/wheel事件的滚动表现,Svelte会在合适的地方自动加上它
capture:在捕获阶段就触发处理程序,而非冒泡阶段
once :在运行一次事件处理后,立即将其移除
self:仅当event.target是元素本身时才触发事件处理程序

修饰符可以链式使用,如:on:click|once|capture={...}

组件事件

父组件组件可以接受子组件传递过来的事件

父组件
<script>
    import Demo from 'path/demo.svelte';

    function myevent(event) {
        alert(event.detail.text);
    }
</script>
<Demo on:diyevent={myevent}/>

子组件
<script>
  import { createEventDispatcher } from 'svelte';

  const dispatch = createEventDispatcher();
  function sunevent() {
    dispatch('diyevent', {
      text: '传递的信息'
    });
  }
</script>

<button on:click={sunevent}>点击触发</button>

要完成子组件向父组件传递事件,需要:

1、需要创建一个事件分发器(dispatcher)
    通过引入的createEventDispatcher类创建
    必须在组件实例化时就调用它来创建分发器
    无法在组件一些特殊位置中创建(如用setTimeout延迟几秒之后创建)
2、某个特定的时刻通过事件分发器向父组件传递自定义的事件
    dispatch(diy_event_name, options)
        其中diy_event_name为我们自定义的事件名称
        options为一个对象,该对象可以在父组件中通过事件对象的detail属性获取
3、父组件通过on:event_name={}属性接受指定事件

事件转发

与DOM事件不同,组件事件不会冒泡。如果要在某个深层嵌套的组件上监听事件,则中间组件必须转发该事件

其实原理很简单,就是中间件也创建一个事件分发器,在接受到指定事件时并通过事件分发器将事件进一步向上传播

不过如果层次过深,这么一层层地转发会产生大量的无用代码

Svelte中有一种简写方式:on:event属性不指定值,就代表“转发所有指定事件”,Svelte自动生成与子组件发送事件的相同代码

<Demo on:diyevent />

同理,在svelte中,DOM事件也可以通过该简写方式进行DOM事件转发



网址导航