Как добавить несколько классов в компонент ReactJS
Я новичок в 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"));
Ответы
Ответ 1
Я использую имена классов, когда существует достаточное количество логики, необходимой для выбора (не) использования классов. слишком простой пример:
import classnames from 'classnames';
var liClasses = classNames({
'main-class': true,
'activeClass': self.state.focused === index
});
return (<li className={liClasses}>{data.name}</li>);
Тем не менее, если вы не хотите включать зависимость, то есть лучшие ответы ниже.
Ответ 2
Я использую ES6
шаблона ES6
. Например:
const error = this.state.valid ? '' : 'error'
const classes = 'form-control round-lg ${error}'
А затем просто сделать это:
<input className={classes} />
Однолинейная версия:
<input className={'form-control round-lg ${this.state.valid ? '' : 'error'}'} />
Ответ 3
Просто используйте JavaScript.
<li className={[activeClass, data.klass, "main-class"].join(' ')} />
Если вы хотите добавить ключи и значения на основе классов в объект, вы можете использовать следующее:
function classNames(classes) {
return Object.entries(classes)
.filter(([key, value]) => value)
.map(([key, value]) => key)
.join(' ');
}
const classes = {
'maybeClass': true,
'otherClass': true,
'probablyNotClass': false,
};
const myClassNames = classNames(classes);
// Output: "maybeClass otherClass"
<li className={myClassNames} />
Или даже проще:
const isEnabled = true;
const isChecked = false;
<li className={[isEnabled && 'enabled', isChecked && 'checked']
.filter(e => !!e)
.join(' ')
} />
// Output:
// <li className={'enabled'} />
Ответ 4
Concat
Не нужно фантазировать Я использую модули CSS, и это легко
import style from '/css/style.css';
<div className={style.style1+ ' ' + style.style2} />
Это приведет к:
<div class="src-client-css-pages-style1-selectionItem src-client-css-pages-style2">
Другими словами, оба стиля
Conditionals
Было бы легко использовать ту же идею с if
const class1 = doIHaveSomething ? style.style1 : 'backupClass';
<div className={class1 + ' ' + style.style2} />
Ответ 5
Это может быть достигнуто с помощью литералов шаблона ES6:
<input className={'class1 ${class2}'}>
Ответ 6
Вы можете создать элемент с несколькими именами классов, например:
<li className="class1 class2 class3">foo</li>
Естественно, вы можете использовать строку, содержащую имена классов, и манипулировать этой строкой для обновления имен классов элемента.
var myClassNammes = 'class1 class2 class3';
...
<li className={myClassNames}>foo</li>
Ответ 7
Вот как вы можете это сделать с ES6:
className = {`
text-right
${itemId === activeItemId ? 'active' : ''}
${anotherProperty === true ? 'class1' : 'class2'}
`}
Вы можете перечислить несколько классов и условий, а также включить статические классы. Нет необходимости добавлять дополнительную библиотеку.
Удачи;)
Ответ 8
Vanilla JS
Нет необходимости в внешних библиотеках - просто используйте ES6 строки шаблона:
<i className={`${styles['foo-bar-baz']} fa fa-user fa-2x`}/>
Ответ 9
Возможно, classnames может вам помочь.
var classNames = require('classnames');
classNames('foo', {'xx-test': true, bar: false}, {'ox-test': false}); // => 'foo xx-test'
Ответ 10
Просто добавив, мы можем отфильтровать пустые строки.
className={[
'read-more-box',
this.props.className,
this.state.isExpanded ? 'open' : 'close',
].filter(x => !!x).join(' ')}
Ответ 11
Поздно к партии, но зачем использовать стороннюю сторону для такой простой проблемы?
Вы могли бы либо сделать это, как упомянул @Huw Davies - лучший способ
1. <i className={`${styles['foo-bar-baz']} fa fa-user fa-2x`}/>
2. <i className={[styles['foo-bar-baz'], 'fa fa-user', 'fa-2x'].join(' ')}
Оба хороши. Но писать может стать сложным для большого приложения. Чтобы сделать его оптимальным, я делаю то же самое выше, но помещаю его в класс помощника
Используя мою вспомогательную функцию ниже, я могу оставить логику отдельной для будущего редактирования, а также дает несколько способов добавить классы
classNames(styles['foo-bar-baz], 'fa fa-user', 'fa-2x')
или
classNames([styles['foo-bar-baz], 'fa fa-user', 'fa-2x'])
Это моя вспомогательная функция ниже. Я поместил его в helper.js, где храню все свои общие методы. Будучи такой простой функцией, я избегал использования сторонней стороны, чтобы держать контроль
export function classNames (classes) {
if(classes && classes.constructor === Array) {
return classes.join(' ')
} else if(arguments[0] !== undefined) {
return [...arguments].join(' ')
}
return ''
}
Ответ 12
Вы можете создать элемент с несколькими именами классов, как это, я попробовал оба способа, он работает нормально...
Если вы импортируете какой-либо CSS, то вы можете пойти по этому пути: Путь 1:
import React, { Component, PropTypes } from 'react';
import csjs from 'csjs';
import styles from './styles';
import insertCss from 'insert-css';
import classNames from 'classnames';
insertCss(csjs.getCss(styles));
export default class Foo extends Component {
render() {
return (
<div className={[styles.class1, styles.class2].join(' ')}>
{ 'text' }
</div>
);
}
}
способ 2:
import React, { Component, PropTypes } from 'react';
import csjs from 'csjs';
import styles from './styles';
import insertCss from 'insert-css';
import classNames from 'classnames';
insertCss(csjs.getCss(styles));
export default class Foo extends Component {
render() {
return (
<div className={styles.class1 + ' ' + styles.class2}>
{ 'text' }
</div>
);
}
}
**
Если вы применяете CSS как внутренний:
const myStyle = {
color: "#fff"
};
// React Element using Jsx
const myReactElement = (
<h1 style={myStyle} className="myClassName myClassName1">
Hello World!
</h1>
);
ReactDOM.render(myReactElement, document.getElementById("app"));
.myClassName {
background-color: #333;
padding: 10px;
}
.myClassName1{
border: 2px solid #000;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.4.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.4.0/umd/react-dom.production.min.js"></script>
<div id="app">
</div>
Ответ 13
Я не думаю, что нам нужно использовать внешний пакет для простого добавления нескольких классов.
Я лично использую
<li className={'li active'}>Stacy</li>
or <li className={'li ${this.state.isActive ? 'active' : ''}'}>Stacy<li>
второй, если вам нужно добавить или удалить классы условно.
Ответ 14
Если вы не хотите импортировать другой модуль, эта функция работает как модуль classNames
.
function classNames(rules) {
var classes = ''
Object.keys(rules).forEach(item => {
if (rules[item])
classes += (classes.length ? ' ' : '') + item
})
return classes
}
Вы можете использовать это так:
render() {
var classes = classNames({
'storeInfoDiv': true,
'hover': this.state.isHovered == this.props.store.store_id
})
return (
<SomeComponent style={classes} />
)
}
Ответ 15
Использование facebook Пример TodoTextInput.js
render() {
return (
<input className={
classnames({
edit: this.props.editing,
'new-todo': this.props.newTodo
})}
type="text"
placeholder={this.props.placeholder}
autoFocus="true"
value={this.state.text}
onBlur={this.handleBlur}
onChange={this.handleChange}
onKeyDown={this.handleSubmit} />
)
}
замена classnames на простой код ванильного js будет выглядеть так:
render() {
return (
<input
className={`
${this.props.editing ? 'edit' : ''} ${this.props.newTodo ? 'new-todo' : ''}
`}
type="text"
placeholder={this.props.placeholder}
autoFocus="true"
value={this.state.text}
onBlur={this.handleBlur}
onChange={this.handleChange}
onKeyDown={this.handleSubmit} />
)
}
Ответ 16
Что я делаю:
компонент:
const Button = ({ className }) => (
<div className={ className }> </div>
);
Вызывающий компонент:
<Button className = 'hashButton free anotherClass' />
Ответ 17
Используйте https://www.npmjs.com/package/classnames
импортировать classNames из 'classnames';
-
Можно использовать несколько классов, используя разделенные комы:
<li className={classNames(classes.tableCellLabel, classes.tableCell)}>Total</li>
-
Можно использовать несколько классов, используя запятые, разделенные условием:
<li className={classNames(classes.buttonArea, !nodes.length && classes.buttonAreaHidden)}>Hello World</li>
Использование массива в качестве реквизита для classNames также будет работать, но выдает предупреждение, например
className={[classes.tableCellLabel, classes.tableCell]}
Ответ 18
для добавления дополнительных классов,
= {имя класса ${classes.hello} ${classes.hello1}
Ответ 19
Вы можете использовать массивы, а затем соединять их, используя пробел.
<li key={index} className={[activeClass, data.class, "main-class"].join(' ')}></li>
Это приведет к:
<li key={index} class="activeClass data.class main-class"></li>
Ответ 20
Я использую rc-classnames пакет.
// ES6
import c from 'rc-classnames';
// CommonJS
var c = require('rc-classnames');
<button className={c('button', {
'button--disabled': isDisabled,
'button--no-radius': !hasRadius
})} />
Вы можете добавлять классы в любом формате (Array, Object, Argument). Все правдивые значения из массивов или Аргументы плюс ключи в объектах, которые равны true
, объединяются вместе.
например:
ReactClassNames('a', 'b', 'c') // => "a b c"
ReactClassNames({ 'a': true, 'b': false, c: 'true' }) // => "a c"
ReactClassNames(undefined, null, 'a', 0, 'b') // => "a b"
Ответ 21
Просто написанное className={"man woman"}
помогло мне добавить несколько классов в компонент React при использовании React с NextJS.
//item.js
<input className={"m w"} type="text" placeholder="type"/>
//o.css
.man{
background-color: green;
}
.woman{
height: 20vh;
}
Импорт CSS файлов в js файлы стал возможен благодаря модулю next-css.
Ответ 22
Я bind
classNames
с модулем CSS, импортированным в компонент.
import classNames from 'classnames';
import * as styles from './[STYLES PATH];
const cx = classNames.bind(styles);
classnames
дает возможность объявить className
для элемента React декларативным способом.
например:
<div classNames={cx(styles.titleText)}> Lorem </div>
<div classNames={cx('float-left')}> Lorem </div> // global css declared without css modules
<div classNames={cx( (test === 0) ?
styles.titleText :
styles.subTitleText)}> Lorem </div> // conditionally assign classes
<div classNames={cx(styles.titleText, 'float-left')}> Lorem </div> //combine multiple classes
Ответ 23
Я использую React 16.6.3 и @Material UI 3.5.1 и могу использовать массивы в className, такие как className={[classes.tableCell, classes.capitalize]}
Так что в вашем примере следующее будет похоже.
<li key={index} className={[activeClass, data.class, "main-class"]}></li>
Ответ 24
Вы можете сделать следующее:
<li key={index} className={'${activeClass} ${data.class} main-class'}></li>
Краткое и простое решение, надеюсь, это поможет.