在 React 中处理条件样式的正确方法

IT技术 javascript reactjs
2021-02-05 00:44:03

我现在正在做一些 React,我想知道是否有一种“正确”的方式来做条件样式。在他们使用的教程中

style={{
  textDecoration: completed ? 'line-through' : 'none'
}}

我不喜欢使用内联样式,所以我想使用类来控制条件样式。以 React 的思维方式如何解决这个问题?或者我应该只使用这种内联样式方式?

6个回答
 <div style={{ visibility: this.state.driverDetails.firstName != undefined? 'visible': 'hidden'}}></div>

检查上面的代码。这样就行了。

<div style={{ 可见性:this.state.driverDetails.firstName !== 未定义?'可见':'隐藏'}}></div>。== 中的小错别字。
2021-03-21 00:44:03
这不是与问题中发布的方法完全相同吗?
2021-03-21 00:44:03
正是在寻找这样的东西。条件内联样式,谢谢。
2021-04-10 00:44:03

如果您更喜欢使用类名,请务必使用类名。

className={completed ? 'text-strike' : null}

您可能还会发现classnames包很有帮助。有了它,您的代码将如下所示:

className={classNames({ 'text-strike': completed })}

没有“正确”的方式来做条件样式。做最适合你的事情。就我自己而言,我更喜欢避免内联样式并以刚刚描述的方式使用类。

后记 [06-AUG-2019]

虽然 React 对样式没有偏见,但现在我会推荐 CSS-in-JS 解决方案;样式组件情感如果您是 React 的新手,请坚持使用 CSS 类或内联样式。但是一旦您对 React 感到满意,我建议您采用这些库之一。我在每个项目中都使用它们。

嘿,如果您决定使用 className 作为您的条件样式方法。没有classNames lib. 我建议你使用undefined而不是null. className属性将字符串或未定义作为输入类型 - type(String | undefined) -- ⚡️
2021-03-19 00:44:03
@JadRizk 更好的方法是如果您没有有效的值来设置它,则根本不设置 className。const attrs = completed?{className:'text-strike'}:{}然后<li {...attrs}>text to maybe strike</li>(扩展运算符)。这样你就不会设置 className 除非你有一个很好的值来分配。这是设置一些内联样式的重要方法,在这些样式中您无法知道当前值是什么(因为它可以由您可能无法控制的文件中的 CSS 设置)。
2021-03-20 00:44:03
“没有“正确”的方式来做条件样式。做任何对你最有效的事情。“谢谢,我一直在努力寻找“最佳实践”
2021-04-06 00:44:03
@LinuxDisciple 如果所有字段的计算结果都为 falsey,则只classnames返回一个空字符串。这不会受到任何 CSS 的影响。
2021-04-08 00:44:03
@ DavidL.Walsh 22小时前我还以为JadRizk的解决方案是与一个错误的选择null,并undefined会仍然导致无值class在HTML属性(即<p class></p>代替<p></p>),所以我只要避免设置的方法className都没有。碰巧我对 JadRizk 的解决方案是错误的。对于上述问题,我相信您使用 JadRizk 改进的解决方案是最好的。我的语法可以有条件地设置一个任意的 props 列表和它们的值,但是仅仅设置一个类名就太过分了。
2021-04-11 00:44:03

如果您需要有条件地应用内联样式(应用全部或不应用),则此表示法也适用:

style={ someCondition ? { textAlign:'center', paddingTop: '50%'} : {}}

如果“someCondition”未满足,则传递空对象。

不过,这种模式不会造成不必要的差异吗?我的DOM版本比较了解的是,style这里的道具总是因为改变在Javascript{} != {} 如果我对版本比较正确的,也许这是更好地使用“ undefined”而不是“ {}
2021-03-23 00:44:03
好记。我不确定这一点。
2021-04-11 00:44:03

而不是这个:

style={{
  textDecoration: completed ? 'line-through' : 'none'
}}

您可以使用短路尝试以下操作:

style={{
  textDecoration: completed && 'line-through'
}}

https://codeburst.io/javascript-short-circuit-conditionals-bbc13ac3e9eb

来自链接的关键信息:

短路意味着在 JavaScript 中,当我们评估 AND 表达式 (&&) 时,如果第一个操作数为假,JavaScript 将短路,甚至不会查看第二个操作数。

值得注意的是,如果第一个操作数为假,这将返回假,因此可能必须考虑这将如何影响您的风格。

其他解决方案可能是更多的最佳实践,但认为值得分享。

另一种方式,使用内联样式和扩展运算符

style={{
  ...completed ? { textDecoration: completed } : {}
}}

这种方式在某些情况下很有用,您希望根据条件同时添加一堆属性。

如果您不想更改默认样式,这是一个不错的方法
2021-03-14 00:44:03
我想在这里添加 1 个变体: ...completed && { textDecoration: completed }
2021-04-03 00:44:03