Я новичок в ReactJS и JSX, и у меня возникла небольшая проблема с кодом ниже.
Я пытаюсь добавить несколько классов к className
атрибуту на каждом li
:
<li key={index} className={activeClass, data.class, "main-class"}></li>
Мой компонент React:
var AccountMainMenu = React.createClass({
getInitialState: function() {
return { focused: 0 };
},
clicked: function(index) {
this.setState({ focused: index });
},
render: function() {
var self = this;
var accountMenuData = [
{
name: "My Account",
icon: "icon-account"
},
{
name: "Messages",
icon: "icon-message"
},
{
name: "Settings",
icon: "icon-settings"
}
/*{
name:"Help & Support <span class='font-awesome icon-support'></span>(888) 664.6261",
listClass:"no-mobile last help-support last"
}*/
];
return (
<div className="acc-header-wrapper clearfix">
<ul className="acc-btns-container">
{accountMenuData.map(function(data, index) {
var activeClass = "";
if (self.state.focused == index) {
activeClass = "active";
}
return (
<li
key={index}
className={activeClass}
onClick={self.clicked.bind(self, index)}
>
<a href="#" className={data.icon}>
{data.name}
</a>
</li>
);
})}
</ul>
</div>
);
}
});
ReactDOM.render(<AccountMainMenu />, document.getElementById("app-container"));
javascript
css
reactjs
ecmascript-6
задирать
источник
источник
classNames={{foo: true, bar: true, baz: false}}
иclassNames={["foo", "bar"]}
просто работать ?Ответы:
Я использую имена классов, когда существует достаточное количество логики, необходимой для определения (не) использования классов. Чрезмерно простой пример :
Тем не менее, если вы не хотите включать зависимость, то есть лучшие ответы ниже.
источник
import classNames from 'classnames'
для использования в компонентеclassName={classNames(classes.myFirstClass, classes.mySecondClass)}
.var btnClass = classNames({ btn: true, 'btn-pressed': this.state.isPressed, 'btn-over': !this.state.isPressed && this.state.isHovered }); return <button className={btnClass}>{this.props.label}</button>;
Я использую
ES6
шаблонные литералы . Например:А затем просто сделать это:
Однолинейная версия:
источник
<input className={`class1 ${class2}`}>
<input class=" form-control input-lg round-lg" />
. Обратите внимание на дополнительное место в начале. Это действительно, но безобразно. Даже в ответах на часто задаваемые вопросы рекомендуется другой способ или использование пакета classnames: reactjs.org/docs/faq-styling.htmlПросто используйте JavaScript.
Если вы хотите добавить ключи и значения на основе классов в объект, вы можете использовать следующее:
Или даже проще:
источник
className={['terra-Table', medOrder.resource.status]}
className={[listOfClasses].join(' ')}
это работает для меня, спасибо!Concat
Не нужно фантазировать Я использую модули CSS, и это легко
Это приведет к:
Другими словами, оба стиля
Conditionals
Было бы легко использовать ту же идею с if
источник
className={
слайдер $ {className? `$ {className}: ''}
}` `. Но это много. [примечание: «что-то» + undefined = «что-то недоопределено». Js динамическое преобразование.Это может быть достигнуто с помощью литералов шаблона ES6:
источник
<input className={`${class1} ${class2}`}>
Вы можете создать элемент с несколькими именами классов, например так:
Естественно, вы можете использовать строку, содержащую имена классов, и манипулировать этой строкой для обновления имен классов элемента.
источник
"
вместо'
. Извини за это.Вот как вы можете сделать это с ES6:
Вы можете перечислить несколько классов и условий, а также вы можете включить статические классы. Нет необходимости добавлять дополнительную библиотеку.
Удачи ;)
источник
Ваниль JS
Нет необходимости во внешних библиотеках - просто используйте строки шаблона ES6 :
источник
Может быть, имена классов могут помочь вам.
источник
Я не думаю, что нам нужно использовать внешний пакет для добавления нескольких классов.
Я лично пользуюсь
или
второй на случай, если вам нужно добавить или удалить классы условно.
источник
Вы можете сделать следующее:
Краткое и простое решение, надеюсь, это поможет.
источник
Просто добавив, мы можем отфильтровать пустые строки.
источник
Вы можете создать элемент с несколькими именами классов, как это, я пробовал оба способа, он работает нормально ...
Если вы импортируете какой-либо CSS, то вы можете следовать следующим образом: Путь 1:
способ 2:
**
Если вы применяете CSS как внутренний:
источник
Это можно сделать с помощью https://www.npmjs.com/package/clsx :
https://www.npmjs.com/package/clsx
Сначала установите его:
Затем импортируйте его в файл компонента:
Затем используйте импортированную функцию в вашем компоненте:
источник
Опоздал на вечеринку, но зачем использовать третью сторону для такой простой задачи?
Вы можете сделать это, как упоминал @Huw Davies - лучший способ
Оба хорошие. Но написание может стать сложным для большого приложения. Чтобы сделать его оптимальным, я делаю то же самое, но помещаю его в класс помощников.
Использование моей вспомогательной функции, приведенной ниже, позволяет мне отделить логику для будущего редактирования, а также дает мне несколько способов добавления классов
или
Это моя вспомогательная функция ниже. Я положил его в helper.js, где я храню все свои обычные методы. Будучи такой простой функцией, я избегал использования сторонней организации для сохранения контроля
источник
Вы можете использовать массивы, а затем присоединиться к ним, используя пробел.
Это приведет к:
источник
Я знаю, что это поздний ответ, но я надеюсь, что это поможет кому-то.
Предположим, что вы определили следующие классы в CSS-файле « primary », « font-i », « font-xl »
сделал бы трюк!
Для получения дополнительной информации: https://www.youtube.com/watch?v=j5P9FHiBVNo&list=PLC3y8-rFHvwgg3vaYJgHGnModB54rxOk3&index=20
источник
для добавления дополнительных классов
источник
Используя пример Facebook TodoTextInput.js
замена имен классов на простой ванильный js-код будет выглядеть так:
источник
Если вы не хотите импортировать другой модуль, эта функция работает как
classNames
модуль.Вы можете использовать это так:
источник
function classNames(rules) { return Object.entries(rules) .reduce( (arr, [cls, flag]) => { if (flag) arr.push(cls); return arr }, [] ).join(" ") }
Это то, чем я занимаюсь:
Составная часть:
Компонент вызова:
источник
Я использую React 16.6.3 и @Material UI 3.5.1, и могу использовать массивы в className, как
className={[classes.tableCell, classes.capitalize]}
Так что в вашем примере следующее будет похоже.
источник
Используйте https://www.npmjs.com/package/classnames
импортировать classNames из 'classnames';
Можно использовать несколько классов, используя разделенные комы:
Можно использовать несколько классов, используя запятые, разделенные условием:
Использование массива в качестве реквизита для classNames также будет работать, но выдает предупреждение, например
источник
Я использую пакет rc-classnames .
Вы можете добавлять классы в любом формате (Array, Object, Argument). Все истинные значения из массивов или аргументов плюс ключи в объектах, которые равны, чтобы
true
объединиться вместе.например:
источник
Я
bind
classNames
в модуль CSS импортирован в компонент.classnames
дает возможность декларироватьclassName
элемент React декларативным способом.например:
источник
Я обычно использую это так: (в вашем случае)
Когда дело доходит до JSX и (обычно) у нас есть некоторые json ... чем вы зацикливаете это ... компонент . map , плюс некоторые условные выражения, чтобы проверить, существует ли свойство json для отображения имени класса в зависимости от значения свойства из JSON. В приведенном ниже примере component_color и component_dark_shade являются свойствами из component.map ()
Вывод:
<div class="component no-color light" ....
или: в<div class="component blue dark" ....
зависимости от значений из карты ...источник
Когда у меня много разных классов, я обнаружил, что полезно следующее.
Фильтр удаляет любое из
null
значений, а объединение помещает все оставшиеся значения в строку, разделенную пробелом.источник