У меня есть стройное приложение, и я хочу выделить строку, когда пользователь нажимает на нее; похоже на этот простой код:
<div id = "A" class = "car-even">A</div>
<div id = "B" class = "car-odd">B</div>
<style>
.car-even {
color: #008800;
cursor: pointer;
}
.car-odd {
color: red;
cursor: pointer;
}
.car-selected {
color: blue;
background-color: #ffffaa;
cursor: pointer;
}
</style>
<script>
row = document.getElementById('A')
row.className = 'car-selected '
</script>
Но в svelte имя класса не обновляется правильно. Что не так?
App.svelte
<script>
import Car from './cars.svelte'
let car = ''
$: console.info('Car', car)
</script>
<Car bind:selected_car = {car}/>
Автомобили.svelte
<script>
let cars = ['Audi', 'BMW', 'Hillman', 'Hyundai', 'Jaguar']
export let selected_car = ''
let car_class = ['car-even', 'car-odd']
function carClicked(car) {
selected_car = car
let car_row = document.getElementById(car)
car_row.className = 'car-selected'
}
</script>
{#each cars as car, index (car)}
<div id = {car} class = "{car_class[index % 2]}" on:click = {() => carClicked(car)}>{car}</div>
{/each}
<style>
.car-even {
color: #008800;
cursor: pointer;
}
.car-odd {
color: #000088;
cursor: pointer;
}
.car-selected {
background-color: #ffffaa;
cursor: pointer;
}
</style>






Ваш пример, похоже, не работает, потому что класс .car-selected css не скомпилирован, потому что он нигде не используется (компилятор знает об этом). Если вы посмотрите на html, класс добавляется по клику (но это также перезаписывает/удаляет другой класс)
Если вы добавите модификатор :global():global(.car-selected), вы увидите, что класс применяется
Чтобы сделать это в стиле Svelte, вместо этого используйте класс: директива и добавьте его в div внутри каждого цикла.
class:car-selected = {car === selected_car}
Затем вы можете избавиться от carClicked(), если хотите РЕПЛ
{#each cars as car, index (car)}
<div id = {car}
class = "{car_class[index % 2]}"
class:car-selected = {car === selected_car}
on:click = {() => selected_car = car}
>
{car}
</div>
{/each}
((+ почему бы не уменьшить повторение и не использовать стиль Svelte с областью действия и не добавить
div {
cursor: pointer;
user-select: none;
}
))