我现在正在做一些React,我想知道是否有一种“正确的”方式来进行条件样式设计。在本教程中,他们使用
style={{
textDecoration: completed ? 'line-through' : 'none'
}}
我不想使用内联样式,因此我想使用一个类来控制条件样式。一个人将如何以React的思维方式来实现这一目标?还是应该只使用这种内联样式方式?
我现在正在做一些React,我想知道是否有一种“正确的”方式来进行条件样式设计。在本教程中,他们使用
style={{
textDecoration: completed ? 'line-through' : 'none'
}}
我不想使用内联样式,因此我想使用一个类来控制条件样式。一个人将如何以React的思维方式来实现这一目标?还是应该只使用这种内联样式方式?
Answers:
如果您更喜欢使用类名,请务必使用类名。
className={completed ? 'text-strike' : null}
className={classNames({ 'text-strike': completed })}
没有“正确”的方法来进行条件样式设计。做最适合您的事情。就我自己而言,我更喜欢避免内联样式,并以上述方式使用类。
POSTSCRIPT [06-AUG-2019]
尽管React在样式方面毫无疑问,但这些天我还是会推荐CSS-in-JS解决方案。即风格成分或情感。如果您不熟悉React,请坚持使用CSS类或内联样式。但是一旦您对React感到满意,我建议您采用这些库之一。我在每个项目中都使用它们。
classNames lib
。我建议您使用undefined
而不是null
。的className
属性作为输入类型的字符串或未定义-型(String |未定义) - ⚡️
const attrs = completed?{className:'text-strike'}:{}
然后<li {...attrs}>text to maybe strike</li>
(扩展运算符)。这样,您根本就不会设置className,除非您要分配一个好的值。这是设置某些内联样式的重要方法,在这些样式中您不知道当前值是什么(因为它可能由CSS设置在您无法控制的文件中)。
classnames
仅返回一个空字符串。这不会受到任何CSS的影响。
null
并且undefined
仍然会导致class
html中没有值属性(即,<p class></p>
而不是<p></p>
),因此我提供了一种完全避免设置的方法className
。碰巧的是,我对JadRizk的解决方案是错误的。对于上述问题,我相信您采用JadRizk改进的解决方案是最好的。我的语法可以有条件地设置prop及其值的任意列表,但是仅设置类名就太过分了。
<div style={{ visibility: this.state.driverDetails.firstName != undefined? 'visible': 'hidden'}}></div>
检出上面的代码。这样就可以了。
首先,就样式而言,我同意您的看法-我也(并且也)有条件地应用类而不是内联样式。但是您可以使用相同的技术:
<div className={{completed ? "completed" : ""}}></div>
对于更复杂的状态集,请累积一组类并应用它们:
var classes = [];
if (completed) classes.push("completed");
if (foo) classes.push("foo");
if (someComplicatedCondition) classes.push("bar");
return <div className={{classes.join(" ")}}></div>;
代替这个:
style={{
textDecoration: completed ? 'line-through' : 'none'
}}
您可以使用短路尝试以下方法:
style={{
textDecoration: completed && 'line-through'
}}
https://codeburst.io/javascript-short-circuit-conditionals-bbc13ac3e9eb
链接中的关键信息:
短路意味着在JavaScript中,当我们评估一个AND表达式(&&)时,如果第一个操作数为false,则JavaScript将短路,甚至不查看第二个操作数。
值得注意的是,如果第一个操作数为false,则此操作将返回false,因此可能必须考虑这将如何影响您的样式。
其他解决方案可能是最佳实践,但认为值得分享。
我在尝试回答同一问题时遇到了这个问题。McCrohan的类数组和联接方法是可靠的。
根据我的经验,我一直在处理许多遗留的ruby代码,这些代码已被转换为React,在我们构建组件时,我发现自己接触了现有的CSS类和内联样式。
组件内的示例代码段:
// if failed, progress bar is red, otherwise green
<div
className={`progress-bar ${failed ? failed' : ''}`}
style={{ width: this.getPercentage() }}
/>
再次,我发现自己接触了遗留的CSS代码,将其与组件“打包”在一起并继续前进。
因此,我真的觉得什么是“最好的”还有些悬而未决,因为标签会因您的项目而有很大差异。
您可以使用这样的东西。
render () {
var btnClass = 'btn';
if (this.state.isPressed) btnClass += ' btn-pressed';
else if (this.state.isHovered) btnClass += ' btn-over';
return <button className={btnClass}>{this.props.label}</button>;
}
否则,您可以使用classnames NPM包使动态和条件className道具更易于使用(尤其是比条件字符串操作更简单)。
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'
redux
和react
混淆。Redux与样式无关。