Как установить класс элемента в svelte

У меня есть стройное приложение, и я хочу выделить строку, когда пользователь нажимает на нее; похоже на этот простой код:

<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>
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
0
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш пример, похоже, не работает, потому что класс .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;
    }

))

Другие вопросы по теме