【Svelte】-(5)DOM事件 / 事件修饰符 / 组件事件 / 事件转发 (组件之间的事件沟通)

简介: 【Svelte】-(5)DOM事件 / 事件修饰符 / 组件事件 / 事件转发 (组件之间的事件沟通)

DOM事件


在Svelte之中,我们如果要绑定DOM上的事件可以添加 on: 关键词进行监听。

<div on:mousemove={handleMousemove}>

这一点和vue很像,但在Svelte中可没有简写。


下面来看一个完整事例:

<script>
  let x = 0, y = 0
  function handleMousemove(e) {
    x = e.clientX
    y = e.clientY
  }
</script>
<div on:mousemove={handleMousemove}>
  鼠标的位置是: {x} x {y}
</div>
<style>
  div {
    width: 100%;
    height: 100vh;
    cursor: default;
  }
</style>


预览


99.gif


当然我们也可以这样写,官方叫这种方式为:内联声明事件处理

<div on:mousemove={e=>{x=e.clientX;y=e.clientY}}>
  鼠标的位置是: {x} x {y}
</div>

效果是一样的,加不加引号也无所谓

<div on:mousemove="{e=>{x=e.clientX;y=e.clientY}}">

对了值得一提的是在Svelte中你不用担心性能问题,怎么方便怎么来。(符合你需要的规范是前提)




事件修饰符


修饰符如名,给事件处理添加独立功能。


首先我们得知道有哪些事件修饰符:

修饰符 

作用

preventDefault 调用 event.preventDefault() ,在运行处理程序之前调用
stopPropagation 调用 event.stopPropagation() ,防止事件到达下一个元素
passive

优化了对 touch/wheel 事件的滚动表现(Svelte 会在合适的地方自动添加滚动条)

nonpassive

显式设置 passive: false

capture

在 capture 阶段而不是 bubbling 阶段触发事件处理程序 (可以简单理解触发父级元素,而不是子元素)

once

运行一次事件处理程序后将其删除

self

仅当 event.target 是其本身时才执行


当然修饰符可以一起用 | 间隔开来。


下面来看一个案例

<div on:mousemove|once={e=>{x=e.clientX;y=e.clientY}}>
  鼠标的位置是: {x} x {y}
</div>

这样就只会触发一次了,再看一个案例

<button on:click|once|self={follower}>
  关注
</button>

这样就可以多个修饰符一起用


组件事件


组件也可以调度事件。但是必须创建一个 event dispatcher,即组件内必须创建一个相同事件并在外部进行分配。

其实就像子组件给父组件事件。


在子组件内我们需要使用 createEventDispatcher function。

const dispatch = createEventDispatcher() 实例化不支持在 setTimeout 之类的事件回调之中使用)。

1.png

我们创建一个 Follower.svelte 组件:

<script>
  import { createEventDispatcher } from 'svelte'
  const dispatch = createEventDispatcher()
  let name = 'uiuing'
  function tellTip() {
    dispatch('tip', {
      name
    })
  }
</script>
<button on:click={tellTip}>关注uiuing</button>

App.svelte

<script>
import Follower from './Follower.svelte'
</script>
<Follower on:tip={e=>console.log(e.detail.name)}/>

点击之后预览


2.png


代码解读


on:tip tip为事件名称,e.detail 内容为子组件 dispatch 内容,dispatch('事件', 传递对象)




事件转发


其实事件转发很简单,其实就是组件嵌套的时候,我们把事件一层一层传递上去。


例如到 Follower 组件和 App 中间再嵌套一个 Send 组件

<script>
  import Follower from './Follower.svelte'
  import { createEventDispatcher } from 'svelte'
  const dispatch = createEventDispatcher()
  function send(e) {
    dispatch('tip', e.detail)
  }
</script>
<Follower on:tip={send} />


我们将获取到的数据往上传,你改变的只是function里接到 event 然后把 e.detail 原封不动传递上去。


如果我们需要把所有 tip 事件都转发呢?


直接简写就可以了

<script>
  import Follower from './Follower.svelte'
</script>
<Follower on:tip />

效果是一样的,贴上 App.svelte 的代码大家自己实验。

<script>
import Send from './Send.svelte'
</script>
<Send on:tip={e=>console.log(e.detail.name)}/>


事件转发也适用于 DOM 事件


例如 on:click


App.svelte

<script>
  import Follower from './Follower.svelte'
</script>
<Follower on:click={()=>{console.log('关注成功!')}} />

Follower.svelte

<button>关注uiuing</button>

这样点击按钮是没有效果的


3.png

我们需要转发一下


Follower.svelte

<button on:click>关注uiuing</button>

4.png

目录
相关文章
|
6月前
|
XML 消息中间件 JavaScript
从0开始学习JavaScript--JavaScript DOM操作与事件处理
在前端开发中,DOM(文档对象模型)是一个至关重要的概念,它为JavaScript提供了一种与HTML和XML文档交互的方法。本文将深入探讨DOM的概念与作用,以及JavaScript与DOM之间的密切关系。
|
2月前
|
JavaScript 前端开发
JavaScript HTML DOM 事件
JavaScript HTML DOM 事件
22 5
|
1月前
|
JavaScript 前端开发 API
深入理解jQuery:高效DOM操作与事件处理
【10月更文挑战第11天】深入理解jQuery:高效DOM操作与事件处理
17 0
|
2月前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
28 2
|
2月前
|
前端开发 JavaScript
CSS中禁用DOM事件
CSS中禁用DOM事件
|
4月前
|
移动开发 JavaScript 前端开发
VUE实现一个列表清单【props 父子组件通信、slot插槽的使用、全局自定义指令的封装、$nextTick解决异步DOM更新、巧用v-model简化父子组件之间的通信、触发事件的事件源event】
VUE实现一个列表清单【props 父子组件通信、slot插槽的使用、全局自定义指令的封装、$nextTick解决异步DOM更新、巧用v-model简化父子组件之间的通信、触发事件的事件源event】
42 0
|
6月前
|
JavaScript 前端开发 API
DOM组件如何实现异步更新?
【5月更文挑战第29天】DOM组件如何实现异步更新?
51 2
|
6月前
|
JavaScript
如何使用requestAnimationFrame实现DOM组件的同步更新?
【5月更文挑战第29天】如何使用requestAnimationFrame实现DOM组件的同步更新?
72 1
|
6月前
|
JavaScript 前端开发 API
DOM组件
【5月更文挑战第29天】DOM组件
42 1
|
6月前
|
JavaScript 数据可视化 容器
easyv平台_过滤器强制修改dom(暴力自定义组件渲染样式)
easyv平台_过滤器强制修改dom(暴力自定义组件渲染样式)
32 0