Svelte 脚本错误:切换元素单击事件不会触发
Svelte script bug: Switch element click event does not fire
我是 Svelte 的新手,有些事情我认为应该很容易做,但它们给我带来了麻烦。在一个小型 Svelte 应用程序中,我有这个 HTML:
<div class="mt-5 mb-6">
<Switch on:click={toggle} /> <span>{stat}</span>
</div>
我需要在跨度元素中显示“开”或“关”,具体取决于开关的“状态”。为此,我有:
import Switch from './Switch.svelte';
let stat = 'off';
let status = false;
function toggle () {
status = !status;
stat = status ? "on" : "off";
}
参见 REPL here。
由于我无法理解的原因,即使控制台没有错误,跨度始终显示“关闭”。为什么?
你把事情搞得太复杂了。您可以轻松绑定到底层组件的检查值:
<script>
import Switch from './Switch.svelte';
let status;
</script>
<div>
<Switch bind:checked={status} /> <span>{status ? "on" : "off"}</span>
</div>
之前,您尝试监听 click 事件,而您的 Switch
组件没有,这就是它不起作用的原因。但由于它是一个复选框,所以它已选中 属性。查找更多信息 here。
另一个版本,HTML 中没有任何逻辑(并且所有内容都在 <script>
标签内):
<script>
import Switch from '../ui/Switch.svelte';
let stat = 'off';
let status = false;
$:stat = status ? "On" : "Off";
</script>
<div>
<Switch bind:checked={status} /> <span>{stat}</span>
</div>
另一个版本,使用子组件的事件分发器向父组件发出点击事件:
//Switch.svelte
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
</script>
<label class="switch">
<input type="checkbox" on:click="{() => dispatch('toggle')}"/>
<span class="slider" />
</label>
...
//App.svelte
<script>
import Switch from './Switch.svelte';
let stat = 'off';
let status = false;
function toggle () {
status = !status;
stat = status ? "on" : "off";
}
</script>
<div class="mt-5 mb-6">
<Switch on:toggle={toggle} /> <span>{stat}</span>
</div>
我是 Svelte 的新手,有些事情我认为应该很容易做,但它们给我带来了麻烦。在一个小型 Svelte 应用程序中,我有这个 HTML:
<div class="mt-5 mb-6">
<Switch on:click={toggle} /> <span>{stat}</span>
</div>
我需要在跨度元素中显示“开”或“关”,具体取决于开关的“状态”。为此,我有:
import Switch from './Switch.svelte';
let stat = 'off';
let status = false;
function toggle () {
status = !status;
stat = status ? "on" : "off";
}
参见 REPL here。
由于我无法理解的原因,即使控制台没有错误,跨度始终显示“关闭”。为什么?
你把事情搞得太复杂了。您可以轻松绑定到底层组件的检查值:
<script>
import Switch from './Switch.svelte';
let status;
</script>
<div>
<Switch bind:checked={status} /> <span>{status ? "on" : "off"}</span>
</div>
之前,您尝试监听 click 事件,而您的 Switch
组件没有,这就是它不起作用的原因。但由于它是一个复选框,所以它已选中 属性。查找更多信息 here。
另一个版本,HTML 中没有任何逻辑(并且所有内容都在 <script>
标签内):
<script>
import Switch from '../ui/Switch.svelte';
let stat = 'off';
let status = false;
$:stat = status ? "On" : "Off";
</script>
<div>
<Switch bind:checked={status} /> <span>{stat}</span>
</div>
另一个版本,使用子组件的事件分发器向父组件发出点击事件:
//Switch.svelte
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
</script>
<label class="switch">
<input type="checkbox" on:click="{() => dispatch('toggle')}"/>
<span class="slider" />
</label>
...
//App.svelte
<script>
import Switch from './Switch.svelte';
let stat = 'off';
let status = false;
function toggle () {
status = !status;
stat = status ? "on" : "off";
}
</script>
<div class="mt-5 mb-6">
<Switch on:toggle={toggle} /> <span>{stat}</span>
</div>