Какой способ имеет наилучшую производительность при применении нескольких классов к тегам html? Угловой 2

Я строю календарь с ценами, у меня есть 3 вложенных элемента:

- calendar-layout
-- calendar-month
--- calendar-week

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

    // Calendar-week Html
    <div [ngClass]="dayClass(date, i)" *ngFor="let date of days; let i = index;"
         (click)="onClick(date)" [class.not-selectable]="isDayNotSelectable(date)">
       <span class="date-number">{{ date |  date:'d'  }}</span>
       <small class="price" *ngIf="calendarInfo.prices"> {{ getPrice(date) }} </small>
    </div>

// Calendar-week Component
  dayClass(date, i) {
    let cssClass = 'day ';
    if (isDateFrom()) return `${cssClass} selected dateFrom`;
    if (isDateTo()) return `${cssClass} selected dateTo`;
    if (isBeetween()) return `${cssClass} between`;
    if (isReccommended()) cssClass += `recommended `;
    if (isNotPrices()) return cssClass;
    let price = this.calendarInfo.prices[date].price
    cssClass += price <= this.minPrice ? 'low' : price >= this.maxPrice ? 'high' : 'normal';
    return cssClass;
  }

Как мы видим, есть много классов, которые можно поместить в тег «день». Я видел, что моя функция dayClass() может быть распределена с использованием различных подходов с директивой [ngClass], но я не хочу их использовать, не зная, какой метод действительно наиболее эффективен.

[ngClass]="{'class1':condition1, 'class2': condition2, 'class3':condition3}"
[ngClass.class1]="menu1 || menu2" [ngClass.class2]="(menu1 || menu2) && something">   

Кто-нибудь знает, как наиболее эффективно применять классы к тегу HTML, имеющему несколько вычислений?


person juanjinario    schedule 22.05.2020    source источник
comment
верхний выглядит лучше всего, хотя я не знаком с синтаксисом ${cssCslass| selected dateFrom. Есть ли причина, по которой вы не можете просто вернуть строку для каждого оператора if?   -  person Rick    schedule 22.05.2020
comment
@Rick «выбранный» или «dateFrom» - это просто имена классов. DayClass возвращает все классы для каждого дня.   -  person juanjinario    schedule 23.05.2020


Ответы (2)


Создайте чистый канал, таким образом, ваш канал не будет вызываться, пока ваша дата не изменится. Этот канал вернет класс для этой даты и не будет вызываться, пока ваша дата не изменится. Ваш текущий подход не годится, так как ваш метод будет вызываться при каждом повторном рендеринге.

person Aakash Garg    schedule 22.05.2020
comment
Я не понимаю, можно пример? вы имеете в виду, как мне показать значения или как применить классы? - person juanjinario; 22.05.2020
comment
Как вы можете применить чистый канал в классе html? - person juanjinario; 06.06.2020

Вы всегда должны избегать вызовов методов в шаблоне. Это связано с тем, что механизм рендеринга не может определить, изменяет ли функция значение или нет изменений в переменных среды выполнения.

В вашем примере он не может знать, меняет ли значение dayClass, если date меняет значение. Или если другая переменная изменится (dayClass может быть нечистым и зависеть от других переменных).

Таким образом, любой цикл обнаружения изменений потребует вызова функции, чтобы быть уверенным, что любое изменение значения функции будет обнаружено.

Вы можете увидеть это поведение, поставив console.log внутри своей функции, и вы увидите, что она выполняется много раз.

Когда вы используете прямые зависимости, такие как ngClass, с прямыми переменными, механизм рендеринга знает, когда значение изменяется или нет. В вашем примере это когда condition1 меняет значение.

Например, если condition1 равно variable1 && variable2, движок будет следить за значениями variable1 и variable2 и запускать обновление только при изменении этих значений (ищите информацию о ngZone, чтобы понять, как это выполняется).

Таким образом, вы можете видеть, что гораздо эффективнее избегать вызовов функций и всегда искать прямую оценку.

Затем ngClass или ngClass.my_class должны иметь одинаковые характеристики, они просто напрямую управляют DOM.

person Qortex    schedule 22.05.2020
comment
Допустим, выполняется двойная загрузка, первая расставляет дни календаря, а вторая при получении цены товара в этот день, другие классы применяются, когда пользователь нажимает на день. Вы предлагаете, чтобы у меня было 10 типов классов, чтобы я поместил их прямо в шаблон? - person juanjinario; 23.05.2020
comment
Немного сложно сказать, не зная больше о вашем варианте использования. Эмпирическое правило состоит в том, чтобы выразить семантику ситуации. Если есть 10 случаев, то у вас действительно должно быть 10 классов. БЭМ — очень хорошая основа для размышлений и применения этого в вашем коде (getbem.com/introduction). Он дает хорошие рекомендации и поможет вам ответить на ваш вопрос в конкретных условиях вашего варианта использования. - person Qortex; 23.05.2020
comment
Нейминг не проблема, я строю календарь для мета-поисковика рейсов, он показывает дни месяца и при загрузке цен показывает цены, по ценовому диапазону фон будет одного цвета или другой (другой класс), также будут занятия, если он выберет день; по этим причинам у меня так много классов, и я делаю расчет классов в component.ts - person juanjinario; 25.05.2020
comment
Затем используйте одну переменную для каждого имени класса и [ngClass] = { 'my_class_name': myVariableName, ... }. Обновите myVariableName в зависимости от логики компонента. И вы получаете хорошие характеристики, а также хорошую ремонтопригодность. - person Qortex; 25.05.2020