svelte - Svelte:使用调度程序进行事件转发与传入处理函数,哪个是最佳实践?
问题描述
假设一个 Outer 组件包含一个 Inner 组件,并且我们希望将来自 Inner 组件的事件传播到 Outer 组件。在不使用商店的情况下,有两种方法可以做到这一点:
方法一:使用dispatcher进行事件转发
Inner.svelte:使用 Svelte 的调度程序调度原始事件的重新打包版本:
<input type="text" on:input={callDispatcher} />
const dispatcher = createEventDispatcher();
function callDispatcher(e) {
dispatcher("mymsg", {
foo: e.target.value
});
}
Outer.svelte:监听 Inner 的调度事件:
<Inner on:mymsg={handler} />
function handler(e) {
alert(e.detail.foo);
}
方法2:将Outer的handler直接传给Inner
Inner.svelte:接受由 Outer 传入的处理程序:
export let externalHandler;
<input type="text" on:input={externalHandler} />
Outer.svelte:当 Inner 感兴趣的事件发生时,它会调用 Outer 的处理程序:
<Inner externalHandler={handler} />
function handler(e) {
alert(e.target.value);
}
问题
哪一个是更好的做法?方法一的调度器似乎是一个不必要的中间层,不仅增加了更多的代码,而且丢失了原有的事件信息。但奇怪的是,Svelte 教程提到了方法 1 而不是方法 2。
解决方案
没有真正的区别,您确实可以同时使用两者。但是,方法 2 不适用于本机元素,让您混合使用这两种方法,您会得到如下代码:
<Child clickHandler="{childClick}" />
<button on:click="{buttonClick}">click</button>
您总是必须记住何时使用哪个,而如果您使用调度程序方法,这将始终相同
<Child on:click="{childClick}" />
<button on:click="{buttonClick}">click</button>
额外的调度程序代码是一种权衡。
推荐阅读
- python - Tensorflow:数组activation1,它是Div运算符的输入,产生输出数组dropout/div,缺少最小/最大数据
- pandas-groupby - Python Pandas groupby
- angular - MVC .Net 角度未启动
- javascript - 运行 eslint 后出现语法错误
- mysql - 如何将一个查询结果(通过变量)发送到另一个查询
- php - 将数据从 js 输入到文本框中,当 sql 运行时索引未定义错误
- c# - 我找不到按钮点击甚至方法
- python - 如何在循环中追加字符串变量?
- node.js - 使用 'ws' 包从 Node.js 服务器连接到 socket.io 服务器
- c# - C# RGB[,] 到图片框