【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>

预览

在这里插入图片描述

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

<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
capturecapture 阶段而不是 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 之类的事件回调之中使用)。

我们创建一个 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)}/>

点击之后预览

在这里插入图片描述

代码解读

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>

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

在这里插入图片描述
我们需要转发一下

Follower.svelte

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

在这里插入图片描述



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Svelte-routing 是一个基于 Svelte 的轻量级路由库,它提供了基本的路由功能,包括路由参数、嵌套路由、重定向等特性。使用 Svelte-routing 非常简单,你可以按照以下步骤进行配置: 1. 安装 Svelte-routing 你可以使用 npm 或 yarn 安装 Svelte-routing: ``` npm install --save svelte-routing ``` 或 ``` yarn add svelte-routing ``` 2. 导入 Router 和 Route 组件Svelte 应用中,你需要使用 Router 和 Route 组件来定义路由规则。你可以在需要使用路由的组件中导入这两个组件: ```js import { Router, Route } from 'svelte-routing'; ``` 3. 定义路由规则 使用 Router 和 Route 组件,你可以定义应用的路由规则。例如,你可以在 App.svelte 文件中定义两个路由规则,分别对应着应用的 / 和 /about 路径: ```html <Router> <Route path="/" component={Home} /> <Route path="/about" component={About} /> </Router> ``` 在这个例子中,Home 和 About 分别是两个 Svelte 组件,它们会在对应的路由被匹配时被渲染。 4. 使用路由参数 Svelte-routing 支持路由参数,你可以在路由规则中使用冒号(:)来定义动态参数。例如,你可以定义一个 /user/:id 路径,其中 :id 表示一个动态参数。当用户访问 /user/123 时,Svelte-routing 会自动将参数传递给对应的组件。你可以在组件中使用 $routeParams.id 来获取该参数。例如: ```html <!-- 定义路由规则 --> <Route path="/user/:id" component={User} /> <!-- User 组件中获取参数 --> <script> export let $routeParams; console.log($routeParams.id); </script> ``` 5. 使用重定向 Svelte-routing 还支持重定向功能,你可以在路由规则中使用 redirect 属性来实现重定向。例如,你可以将 /about 路径重定向到 /about-us 路径: ```html <Route path="/about" redirect="/about-us" /> ``` 以上就是使用 Svelte-routing 实现基本路由功能的步骤。Svelte-routing 还支持嵌套路由、路由守卫等高级功能,你可以查阅官方文档来学习更多内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我想养只猫 •͓͡•ʔ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值