svelte教程(5)事件

简介: DOM 事件事件绑定<script> let m = { x: 0, y: 0 }; function handleMousemove(event) { m.x = event.clientX; m.

DOM 事件

事件绑定

<script>
  let m = { x: 0, y: 0 };
  function handleMousemove(event) {
    m.x = event.clientX;
    m.y = event.clientY;
  }
</script>

<style>
  div {
    margin: 0 auto;
    width: 500px;
    height: 500px;
    background: seagreen;
  }
</style>

<div on:mousemove={handleMousemove}>The mouse position is {m.x} x {m.y}</div>

您还可以内联声明事件处理程序,并且因为svelte实际上是一个编译器,所以并不会影响性能。

<script>
  let m = { x: 0, y: 0 };
</script>

<style>
  div {
    margin: 20px auto;
    width: 500px;
    height: 500px;
    background: seagreen;
  }
</style>
<div
  on:mousemove={e => {
    m.x = e.clientX;
    m.y = e.clientY;
  }}>
  The mouse position is {m.x} x {m.y}
</div>

事件修饰符

事件可以拥有改成其行为的修饰符。

  • preventDefault:阻止默认事件
  • stopPropagation:停止事件的传播
  • passive:改善了触摸/滚轮事件的滚动性能(Svelte会在安全的地方自动添加)
  • capture:事件在捕获阶段触发
  • once:事件运行一次后取消监听
  • self:仅当event.target是元素本身时才触发

您可以将修饰符链接在一起,例如on:click|once|capture={...}

组件事件

组件也可以触发事件。

Inner.svelte
<script>
    import { createEventDispatcher } from 'svelte';

    const dispatch = createEventDispatcher();

    function sayHello() {
        dispatch('message', {
            text: 'Hello!'
        });
    }
</script>

<button on:click={sayHello}>
    Click to say hello
</button>

index.svelte
<Inner on:message={e=>{alert(e.detail.text)}}/>

createEventDispatcher必须在首次实例化组件时调用它-稍后无法在内部(例如setTimeout回调)进行调用。

事件转发

createEventDispatcher方法触发的事件不会进行冒泡。我们可以通过在外层组件监听message方法再转发到index.svelte。

// outer.svelte
<script>
  import Inner from "./Inner";
  import { createEventDispatcher } from "svelte";

  const dispatch = createEventDispatcher();

  function forward(event) {
    dispatch("message", event.detail);
  }
</script>
<Inner on:message={forward} />

// index.svelte
<Outer on:message={e => {
    alert(e.detail.text);
  }} />

如果on:message没有值可以转发所有message事件:

// outer.svelte
<script>
  import Inner from "./Inner";
</script>
<Inner on:message/>

// index.svelte
<Outer on:message={e => {
    alert(e.detail.text);
  }} />

DOM 事件转发

事件转发一样可以用在dom事件上:

// FancyButton.svelte
<style>
    button {
        font-family: 'Comic Sans MS';
        font-size: 2em;
        padding: 0.5em 1em;
        color: royalblue;
        background: gold;
        border-radius: 1em;
        box-shadow: 2px 2px 4px rgba(0,0,0,0.5);
    }
</style>

<button on:click>
    Click me
</button>

// index.svelte
<script>
    import FancyButton from './FancyButton.svelte';

    function handleClick() {
        alert('clicked');
    }
</script>

<FancyButton on:click={handleClick}/>

本教程的所有代码均上传到github有需要的同学可以参考 https://github.com/sullay/svelte-learn

目录
相关文章
|
消息中间件 存储 Java
手动实现 Spring Boot 日志链路追踪:提升调试效率的利器
【8月更文挑战第8天】在复杂的分布式系统中,日志是诊断问题、追踪系统行为的重要工具。然而,随着微服务架构的普及,服务间的调用链路错综复杂,传统的日志记录方式往往难以快速定位问题源头。今天,我们将探讨如何在不依赖外部组件(如Zipkin、Sleuth等)的情况下,手动实现Spring Boot应用的日志链路追踪,让日志定位更加便捷高效。
813 1
|
存储 缓存 API
Vulkan 围炉夜话4
Vulkan 围炉夜话
338 5
|
前端开发 测试技术 开发者
精通Playwright的元素定位和CSS技巧
精通Playwright的元素定位和CSS技巧
1037 0
|
前端开发 JavaScript Shell
|
存储 JSON Java
java小技能:Swagger (RESTful 风格的 Web 服务框架)
后端修改了接口,需要手动维护api文档,加大了开发的工作量和困难,而swagger的出现就是为了解决这一系列的问题。
322 0
java小技能:Swagger (RESTful 风格的 Web 服务框架)
|
22天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
33061 131
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
17天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
7053 21
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手

热门文章

最新文章