2

我有以下模板,其中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' 
    })
);

我正在使用 create-react-app 启动器。当我调试它时,我看到以下内容:

createElement('li', { 
    'data-value': '1', className:  true ? 'fas' : 'far', 
    ...
})

就像在构建期间正在评估表达式一样。我错过了什么?

4

1 回答 1

1

The problem is operator precedence. 'fa-star ' + (this.rating > 0) is evaluated as ternary condition and is always true.

It should be:

<li className={'fa-star ' + (this.rating > 0 ? 'fas' : 'far')}></li>

A convenient helper for class joining is classnames:

<li className={classnames('fa-star', { fas: !!this.rating, far: !this.rating })}></li>
于 2018-08-29T16:16:12.740 回答