Угловой [ngClass] против [класс

В чем разница в Angular между следующими фрагментами:

<div [class.extra-sparkle]="isDelightful">
<div [ngClass]="{'extra-sparkle': isDelightful}">

8 ответов

Решение

Это специальный синтаксис углового связывания

<div [class.extra-sparkle]="isDelightful">

Это часть компилятора Angular, и вы не можете создать собственный вариант привязки, следуя этому стилю привязки. Поддерживаются только [class.xxx]="...", [style.xxx]="...", а также [attr.xxx]="..."

ngClass это нормальная угловая директива, как вы можете построить ее самостоятельно

<div [ngClass]="{'extra-sparkle': isDelightful}">

ngClass более мощный. Он позволяет вам связать строку классов, массив строк или объект, как в вашем примере.

Вышеприведенные две строки кода относятся к привязке CSS-класса в Angular. Существует в основном 2-3 способа привязки класса css к угловым компонентам.

Вы задаете имя класса с class.className в скобках в ваших шаблонах, а затем выражение справа, которое должно принимать значение true или false, чтобы определить, следует ли применять класс. Это нижеприведенное выражение, где extra-sparkle(key) класс css и isDelightful(значение).

<div [class.extra-sparkle]="isDelightful">

Когда несколько классов потенциально могут быть добавлены, директива NgClass оказывается очень полезной. NgClass должен получить объект с именами классов в качестве ключей и выражений, которые оцениваются как true или false. Ключ -extra-sparkle - это значение, а значение isDelightful(логическое значение).

<div [ngClass]="{'extra-sparkle': isDelightful}">

Теперь, наряду с дополнительным блеском, вы также можете блестеть своим div.

<div [ngClass]="{'extra-sparkle': isDelightful,'extra-glitter':isGlitter}">

или же

export class AppComponent {
    isDelightful: boolean = true;
    isGlitter:  boolean = true;

     sparkleGlitter()
    {
        let classes = {
            extra-sparkle: this.isDelightful,
            extra-glitter: this.isGlitter
        };
        return classes;
    }
}

<div [ngClass]='sparkleGlitter()'>

Для ngClass вы также можете иметь условные троичные операторы.

В текущей версии Angular также нормально работает следующий синтаксис:

[class]="{toggled: sidebarActive, test: true,test1: sidebarActive}

Итак, насколько я понимаю, нет разницы между использованием ngClass и привязки [class]?

пример: https://stackblitz.com/edit/angular-ivy-dr66ww?file=src/app/app.component.html

С помощью [ngClass] Вы можете применять несколько классов действительно удобным способом. Вы даже можете применить функцию, которая будет возвращать объект классов. [class. позволяет применять только один класс (конечно, вы можете использовать класс несколько раз, но это выглядит очень плохо).

Пройдя через несколько ответов, я подумал добавить свое мнение, так как это может быть полезно.

Итак, Angular планирует удалить директивы [ngClass] и [ngStyle] в своих будущих выпусках.

На данный момент (Angular-v13) привязка [class] поддерживает добавление нескольких классов css . Хотя есть некоторые пробелы в функциях по сравнению с [ngClass]. Вы можете проверить это - https://github.com/angular/angular/issues/40623

[нгкласс]

      <p [ngClass] = “‘addGreen’”> Hello World </p> 
<p [ngClass] = “[‘addGreen’, ‘addFont’, ‘addBg’]”> Hello World </p>
<p [ngClass] = “{ addGreen: true, addBg: true, addFont: false }”> Hello World </p> 
<p [ngClass] = “{ addGreen addBg: true, addFont: false}”> Hello World </p>

[учебный класс]

      <p [class] = “‘addGreen’”> Hello World </p> 
<p [class] = “[‘addGreen’, ‘addFont’, ‘addBg’]”> Hello World </p>
<p [class] = “{ addGreen: true, addBg: true, addFont: false }”> Hello World </p> 

Примечание. Указанный ниже способ добавления нескольких классов невозможен.

<p [класс] = "{addGreen addBg: true, addFont: false}"> Привет, мир

В [ngClass] вы можете добавить один из двух разных классов, например:

<div [ngClass]="a === b ? 'class1' : 'class2'">

Никто не упомянул, что при использовании обоих и привязок может возникнуть некоторая путаница, если вы попытаетесь передать некоторую строку класса, которая «зарегистрирована». Они могут соревноваться.

Например, это не приведет к присвоению значения класса d-flex элементу [class] привязка до тех пор, пока условие, связанное с этим классом, имеет истинное условие

component.html

      <div [ngClass]="{'d-flex': falseCondition}" [class]="getClassBasedOnCondition()">

component.ts

      public getClassBasedOnCondition(): string {
    return trueCondition ? 'd-flex' : '';
}

Ты можешь использовать [class.] вместо [ngClass] чтобы избежать такого поведения, пока у вас нет сплава класса, например [ngClass]="{'d-flex p-1': condition}"

Да, с помощью привязки классов ([class]) мы также можем присоединить несколько классов css с последними версиями. пример: [class] ='{объект с ключом в качестве имени класса и значением как true/false}' то же, что и [ngClass], поэтому ... нет никакой разницы между привязкой [class] и встроенной директивой [ngClass]

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