Как добавить несколько классов в компонент ReactJS
Я новичок в ReactJS и JSX, и у меня возникли небольшие проблемы с кодом ниже.
Я пытаюсь добавить несколько классов в в каждом 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"));
15 ответов:
Я использую classnames. Например:
... var liClasses = classNames({ 'main-class': true, 'activeClass': self.state.focused === index }); return (<li className={liClasses}>{data.name}</li>); ...
Я использую
ES6. Например:const error = this.state.valid ? '' : 'error'; const classes = `${error} form-control input-lg round-lg`;и затем просто сделать это:
<input className={classes} />
просто используйте 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'} />
функция 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">другими словами, оба стиля
обновление-использование пакета npm для обработки классов в react
хотя для меня лично этого более чем достаточно, иногда вы можете добавить логику в свои классы, и это может стать немного грязным.
Npm Classes - это пакет npm это обрабатывает классы легко для вас:
classNames('foo', 'bar'); // => 'foo bar' classNames('foo', { bar: true }); // => 'foo bar' classNames({ 'foo-bar': true }); // => 'foo-bar' classNames({ 'foo-bar': false }); // => '' classNames({ foo: true }, { bar: true }); // => 'foo bar' classNames({ foo: true, bar: true }); // => 'foo bar'реальный пример
var Button = React.createClass({ // ... render () { 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>; } });
вы можете создать элемент с несколькими именами классов, как это:
<li className="class1 class2 class3">foo</li>естественно, вы можете использовать строку, содержащую имена классов и манипулировать этой строкой, чтобы обновить имена классов элемента.
var myClassNammes = 'class1 class2 class3'; ... <li className={myClassNames}>foo</li>
вот как вы можете сделать это с ES6:
className = {` text-right ${itemId === activeItemId ? 'active' : ''} ${anotherProperty === true ? 'class1' : 'class2'} `}вы можете перечислить несколько классов и условий, а также вы можете включить статические классы. Нет необходимости добавлять дополнительную библиотеку.
удачи ;)
Vanilla JS
нет необходимости во внешних библиотеках-просто используйте ES6 шаблон строки:
<i className={`${styles['foo-bar-baz']} fa fa-user fa-2x`}/>
может быть classnames могу помочь вам.
var classNames = require('classnames'); classNames('foo', {'xx-test': true, bar: false}, {'ox-test': false}); // => 'foo xx-test'
поздно на вечеринку, но зачем использовать третью сторону для такой простой проблемы?
вы могли бы либо сделать это, как @ Huw Дэвис упомянул-лучший способ
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'])Это моя вспомогательная функция ниже. Я положил его в помощника.js, где я храню все свои общие методы. Будучи такой простой функцией, я избегал использовать третью сторону, чтобы сохранить контроль
export function classNames (classes) { if(classes && classes.constructor === Array) { return classes.join(' ') } else if(arguments[0] !== undefined) { return [...arguments].join(' ') } return '' }
просто добавление, мы можем отфильтровать пустые строки.
className={[ 'read-more-box', this.props.className, this.state.isExpanded ? 'open' : 'close', ].filter(x => !!x).join(' ')}
Если вы не хотите импортировать другой модуль, эта функция работает как
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} /> ) }
Я использую 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 })} />вы можете добавлять классы в любом формате (массив, объект, аргумент). Все истинные значения из массивов или аргументов плюс ключи в объектах, которые равны
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"
используя TodoTextInput facebook.пример Яш
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 С простым кодом vanilla 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} /> ) }
вот что я делаю:
компоненты:
const Button = ({ className }) => ( <div className={ className }> </div> );Вызова Компонента:
<Button className = 'hashButton free anotherClass' />
Comments