ReactJS додає динамічний клас до назв ручних класів


158

Мені потрібно додати динамічний клас до списку регулярних занять, але поняття не маю як (я використовую babel), приблизно так:

<div className="wrapper searchDiv {this.state.something}">
...
</div>

Будь-які ідеї?


Корисні відповіді на кращу практику стилів reactjs за посиланням
Рахіль Ахмад

Відповіді:


241

Ви можете це зробити, звичайний JavaScript:

className={'wrapper searchDiv ' + this.state.something}

або версія шаблону рядків із зворотними посиланнями:

className={`wrapper searchDiv ${this.state.something}`}

Обидва типи, звичайно, просто JavaScript, але перший зразок - традиційний вид.

У будь-якому випадку в JSX все, що міститься у фігурних дужках, виконується як JavaScript, тож ви можете там робити все, що завгодно. Але комбінування рядків JSX та фігурних дужок - це атрибути, які не мають потреби.


а що у випадку кількох класів?
Pardeep Jain

5
У випадку декількох динамічних класів всі динамічні класи повинні надходити від стану, тобто використовувати його неможливо element.classList.add("my-class"); тому допускаючи:className={`wrapper searchDiv ${this.state.something ? "my-class " : ""} ${this.state.somethingElse ? "my-other-class " : ""}`}
Кевін Фарругія

className={'wrapper searchDiv} + this.state.isTrue ? 'my-class' : ' 'Це не працює. Хтось може сказати, чому?
криптокінгт

54

Залежно від того, скільки динамічних класів потрібно додати під час зростання вашого проекту, напевно, варто перевірити утиліту назви класів від JedWatson на GitHub. Це дозволяє представляти свої умовні класи як об'єкт і повертає ті, що оцінюють, до істинних.

Отже, як приклад з його документації React:

render () {

var btnClass = classNames({
  'btn': true,
  'btn-pressed': this.state.isPressed,
  'btn-over': !this.state.isPressed && this.state.isHovered
});

return <button className={btnClass}>I'm a button!</button>;

} 

Оскільки React запускає повторну візуалізацію, коли відбувається зміна стану, імена динамічного класу обробляються природним чином і в курсі стану вашого компонента.


5
Використання класних імен для такої простої речі - це надмірність. Уникайте його використання і вибирайте просту відповідь dannyjolie
контрольний список

2
Ви впевнені, що це проста річ? Поруч завжди потрібно мати тонкозернистий повний контроль над тим, які класи застосовуються до елементів.
Драгас

5
@checklist Я б заперечував інакше, пакет імен класів становить 1,1 кБ до Gzipping (і пів кб після Gzipping), не має залежностей і забезпечує набагато більш чистий API для маніпулювання іменами класу. Не потрібно передчасно оптимізувати щось таке маленьке, коли API набагато виразніший. Використовуючи стандартні маніпуляції з рядками, ви повинні пам’ятати про інтервали перед будь-яким іменем умовного класу або після кожного стандартного імені класу.
tomhughes

classNames чудово, я виявив, що читати, додавати та виправляти реквізит було простіше, ніж ручне маніпулювання, оскільки компонент зростав складним.
MiFiHiBye

37

Простим можливим синтаксисом буде:

<div className={`wrapper searchDiv ${this.state.something}`}>

25

Ось найкращий варіант для Dynamic className, просто зробіть кілька конкатенацій, як у нас у Javascript.

     className={
        "badge " +
        (this.state.value ? "badge-primary " : "badge-danger ") +
        " m-4"
      }

Це найкраще рішення без будь-яких проблем з зв'язуванням. Працював як шарм. Дякую.
Royal.O

3

Якщо вам потрібні назви стилів, які повинні відображатися відповідно до стану, я вважаю за краще використовувати цю конструкцію:

<div className={'wrapper searchDiv' + (this.state.something === "a" ? " anotherClass" : "")'}>

2

спробуйте це за допомогою гачків:

        const [dynamicClasses, setDynamicClasses] = React.useState([
    "dynamicClass1", "dynamicClass2
]);

і додайте це в атрибут className:

<div className=`wrapper searchDiv ${[...dynamicClasses]}`>
...
</div>

додати клас:

    const addClass = newClass => {
       setDynamicClasses([...dynamicClasses, newClass])
    }

для видалення класу:

        const deleteClass= classToDelete => {

           setDynamicClasses(dynamicClasses.filter(class = > {
             class !== classToDelete
           }));

        }

1

Ви можете використовувати цей пакет npm. Він обробляє все і має варіанти для статичних і динамічних класів на основі змінної або функції.

// Support for string arguments
getClassNames('class1', 'class2');

// support for Object
getClassNames({class1: true, class2 : false});

// support for all type of data
getClassNames('class1', 'class2', ['class3', 'class4'], { 
    class5 : function() { return false; },
    class6 : function() { return true; }
});

<div className={getClassNames({class1: true, class2 : false})} />


-1
className={css(styles.mainDiv, 'subContainer')}

Це рішення випробувано та протестується в React SPFx.

Також додайте заяву про імпорт:

import { css } from 'office-ui-fabric-react/lib/Utilities';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.