input - Svelte - 使用复选框在两个输入值之间切换
问题描述
我是 svelte 的新手,我试图弄清楚如何在选中复选框时更改输入的默认值,并在计算中使用这个更改的值。
我的代码有效:
<label> {#if yes}
SI Units to US Units
{:else}
US Units to SI units
{/if}
<input type=checkbox bind:checked={yes}>
</label>
{#if yes}
<input bind:value={siValue}>
{:else}
<input bind:value={usValue}>
{/if}
{#if yes}
<span>{((siValue / factor)).toFixed(2)}</span>
{:else}
<span>{((usValue * factor)).toFixed(2)}</span>
{/if}
我想做的是只使用一个输入并更改默认值,但也能够手动更改输入值,但我无法让它工作。值会发生变化,但是当我尝试手动更改数值时,计算不起作用。
这是该代码:
<input value={yes ? siValue : usValue} on:input="{e => setUnitVal(e.target.value)}">
<script>
let yes = false;
let siValue = '';
let usValue = '';
function setUnitVal(value) {
siValue = +value;
usValue = +value;
}
</script>
解决方案
这是另一种方法。您可以使用 JS 标签语法$:
来设置usValue
和的值siValue
。我们不会$:
直接放在usValue
并且siValue
因为它会创建一个循环依赖,因为usValue
依赖,siValue
反之亦然。相反,我们将把它放在yes
变量上并有条件地分配usValue
and siValue
。
然后在模板中,我们需要做的就是绑定输入value
和span
它们各自的变量,而 JS 标签语法为我们处理计算。
<script>
let yes = false;
let factor = 1.2;
let siValue = '';
let usValue = '';
$: yes ? usValue = (siValue / factor).toFixed(2) : siValue = (usValue * factor).toFixed(2);
</script>
<label>
{#if yes}
SI Units to US Units
{:else}
US Units to SI units
{/if}
<input type=checkbox bind:checked={yes}>
</label>
{#if yes}
<input bind:value={siValue}>
<span>{usValue}</span>
{:else}
<input bind:value={usValue}>
<span>{siValue}</span>
{/if}
这是 Svelte REPL上的一个示例。
推荐阅读
- javascript - 无法调用 onClick 函数 chart.js 中的任何函数
- r - 比较r中同一数据框中的列
- java - 如果目标文件夹中存在相同的文件名,则重命名 tjava 组件中的文件,而不是替换/覆盖现有文件
- java - 将sql表数据加载到hazelcast中
- apache-kafka - 卡夫卡消费者 UNKNOWN_TOPIC_OR_PARTITION
- c++ - 如果 try-catch 下降,C++ 重新调用函数?
- firebase - 将 Firebase 导出到 Bigquery 数据集的生存时间
- reactjs - 如何从 reactjs 中的事件处理程序访问更新的状态
- html - 按钮上的按钮转换:活动
- python - 创建一个可视化指标图,将收益分为高、正常和低