Svelte 3:事件处理未按预期工作
Svelte 3: Event Handling not Working as Expected
在 Svelte 3.12.1 上,当触发事件处理程序 onFilesChange 时,它会意外触发 onFileClick。
<script>
let files = [];
function previewImage(file) {
return "<img src='" + file.previewURL + "' />";
}
function onFileClick(file) {
console.log("onFileClick");
files.splice(files.findIndex(x => x.name === file.name), 1);
files = files;
}
function onFilesChange(event) {
console.log("onFilesChange");
let inputFiles = event.target.files;
for (var i = 0; i < inputFiles.length; i++)
files.push({inputFile: inputFiles.item(i), previewURL: URL.createObjectURL(inputFiles.item(i))});
files = files;
}
</script>
<input accept="image/*" multiple name="files" type="file" on:change={onFilesChange}/>
{#each files as file}
<figure on:click={onFileClick(file)}>
{@html previewImage(file)}
</figure>
{/each}
但是如果我稍微更改为使用箭头函数,那么它会按预期工作。为什么会发生这种情况,在 Svelte 3 中处理 DOM 事件的正确方法是什么?
<input accept="image/*" multiple name="files" type="file" on:change={(event) => onFilesChange(event)}/>
{#each files as file}
<figure on:click={(file) => onFileClick(file)}>
{@html previewImage(file)}
</figure>
{/each}
on:whatever
事件处理程序值需要是将以 DOM 事件作为参数调用的函数。 on:change={onFilesChange}
很好,因为 onFilesChange
是一个需要事件作为其参数的函数。 on:click={onFileClick(file)}
不是因为它会立即调用 onFileClick(file)
,而来自 的 return 值应该是一个事件处理程序。
您应该使用 on:click={() => onFileClick(file)}
以便事件处理程序是一个函数,它将传递 DOM 事件(被丢弃)然后调用 onFileClick(file)
.
在 Svelte 3.12.1 上,当触发事件处理程序 onFilesChange 时,它会意外触发 onFileClick。
<script>
let files = [];
function previewImage(file) {
return "<img src='" + file.previewURL + "' />";
}
function onFileClick(file) {
console.log("onFileClick");
files.splice(files.findIndex(x => x.name === file.name), 1);
files = files;
}
function onFilesChange(event) {
console.log("onFilesChange");
let inputFiles = event.target.files;
for (var i = 0; i < inputFiles.length; i++)
files.push({inputFile: inputFiles.item(i), previewURL: URL.createObjectURL(inputFiles.item(i))});
files = files;
}
</script>
<input accept="image/*" multiple name="files" type="file" on:change={onFilesChange}/>
{#each files as file}
<figure on:click={onFileClick(file)}>
{@html previewImage(file)}
</figure>
{/each}
但是如果我稍微更改为使用箭头函数,那么它会按预期工作。为什么会发生这种情况,在 Svelte 3 中处理 DOM 事件的正确方法是什么?
<input accept="image/*" multiple name="files" type="file" on:change={(event) => onFilesChange(event)}/>
{#each files as file}
<figure on:click={(file) => onFileClick(file)}>
{@html previewImage(file)}
</figure>
{/each}
on:whatever
事件处理程序值需要是将以 DOM 事件作为参数调用的函数。 on:change={onFilesChange}
很好,因为 onFilesChange
是一个需要事件作为其参数的函数。 on:click={onFileClick(file)}
不是因为它会立即调用 onFileClick(file)
,而来自 的 return 值应该是一个事件处理程序。
您应该使用 on:click={() => onFileClick(file)}
以便事件处理程序是一个函数,它将传递 DOM 事件(被丢弃)然后调用 onFileClick(file)
.