Отредактировано после разговора в комментариях
Поскольку назначение объекта в массиве запускает повторный рендеринг, вы можете условно вычислить новые siValue
и usValue
длязадайте unit
на основе флага yes
и обновите значения для этой единицы.Это позволит вам обновлять значения SI и US как пользовательские типы, чтобы они могли свободно переключаться, какое значение вводится во входные данные.
<script>
let yes = false;
const units = [{
"factor": "6.614",
"siValue": "66",
"usValue": "10"
}, {
"factor": "97.95",
"siValue": "100",
"usValue": "1"
}];
function setUnitVal(value, index) {
const { factor } = units[index];
units[index].siValue = yes ? value : (value * factor).toFixed(2);
units[index].usValue = yes ? (value / factor).toFixed(2) : value;
}
</script>
<label>
{#if yes}SI Units to US Units{:else}US Units to SI units{/if}
<input type="checkbox" bind:checked={yes} />
</label>
{#each unitValues as { usValue, siValue, factor}, i}
<div>
<input
value={yes ? siValue : usValue}
on:input={e => setUnitVal(e.target.value, i)} />
{#if yes}
<span>{usValue}</span>
{:else}
<span>{siValue}</span>
{/if}
</div>
{/each}
Если вы хотите иметь возможность вернуться кпо умолчанию, тогда вы могли бы клонировать этот массив units
при загрузке и восстановить исходные значения по желанию, например, так:
<script>
import _ from 'lodash'
const units = [...];
let unitValues = [];
function resetUnitValues() {
unitValues = _.cloneDeep(units);
}
resetUnitValues();
</script>
...
<button on:click={resetUnitValues}>Clear</button>
Вот все это в REPL Svelte: https://svelte.dev/repl/aed32ef30b02448aafd173e0baf681b0?version=3.12.1
Надеюсь, это поможет!