React JSX-выражение для className не оценивается во время выполнения
У меня есть следующий шаблон с выражением для className
свойство, которое я ожидаю оценивать каждый раз, когда React вызывает render
метод:
<ul className='ratings' onClick={this.handleClick}>
<li className={'fa-star ' + (this.rating > 0) ? 'fas' : 'far'}></li>
</ul>
Я ожидаю, что это будет преобразовано в это, и это на самом деле то, что показывает транспортер Babel онлайн:
React.createElement(
'ul',
{ className: 'ratings', onClick: this.handleClick },
React.createElement('li', {
'data-value': '1',
className: 'fa-star ' + (this.rating > 0) ? 'fas' : 'far'
})
);
Я использую стартер создания-реакции-приложения. И когда я отлаживаю его, я вижу следующее:
createElement('li', {
'data-value': '1', className: true ? 'fas' : 'far',
...
})
Это как выражение оценивается во время сборки. Что мне не хватает?
1 ответ
Решение
Проблема в приоритете операторов. 'fa-star ' + (this.rating > 0)
оценивается как троичное условие и всегда верно.
Так должно быть:
<li className={'fa-star ' + (this.rating > 0 ? 'fas' : 'far')}></li>
Удобный помощник для присоединения к классу classnames
:
<li className={classnames('fa-star', { fas: !!this.rating, far: !this.rating })}></li>