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

dav*_*ien 64 javascript reactjs

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

style={{
  textDecoration: completed ? 'line-through' : 'none'
}}
Run Code Online (Sandbox Code Playgroud)

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

Abh*_*iro 64

 <div style={{ visibility: this.state.driverDetails.firstName != undefined? 'visible': 'hidden'}}></div>
Run Code Online (Sandbox Code Playgroud)

查看上面的代码.那就行了.

  • 这不是与问题中发布的方法完全相同吗? (14认同)
  • 正是在寻找这样的东西。条件内联样式,谢谢。 (5认同)

Vla*_*ado 63

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

style={ someCondition ? { textAlign:'center', paddingTop: '50%'} : {}}
Run Code Online (Sandbox Code Playgroud)

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

  • 这种模式不会产生不必要的差异吗?我对 DOM diffing 的理解是,这里的 `style` 属性总是会改变,因为在 Javascript 中 `{} != {}` 如果我对 DOM diffing 的理解是正确的,也许最好使用“undefined”而不是“` {}`" (5认同)

Dav*_*lsh 54

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

className={completed ? 'text-strike' : null}
Run Code Online (Sandbox Code Playgroud)

您可能还会发现类名包有用.有了它,您的代码将如下所示:

className={classNames({ 'text-strike': completed })}
Run Code Online (Sandbox Code Playgroud)

没有"正确"的方式来进行条件样式.做任何最适合你的事情.对于我自己,我更喜欢避免内联样式并以刚才描述的方式使用类.

  • @JadRizk 更好的方法是如果您没有有效的值来设置 className ,则根本不设置 className 。`const attrs = Completed?{className:'text-strike'}:{}` 然后 `&lt;li {...attrs}&gt;text to Maybe Strike&lt;/li&gt;`(扩展运算符)。这样你就根本不需要设置 className ,除非你有一个好的值可以分配。这是设置某些内联样式的重要方法,在这些样式中您无法知道当前值是什么(因为它可能由您无法控制的文件中的 CSS 设置)。 (5认同)

haw*_*Eye 11

而不是这个:

style={{
  textDecoration: completed ? 'line-through' : 'none'
}}
Run Code Online (Sandbox Code Playgroud)

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

style={{
  textDecoration: completed && 'line-through'
}}
Run Code Online (Sandbox Code Playgroud)

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

来自链接的关键信息:

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

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

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


Aay*_*rya 8

内联样式处理

style={{backgroundColor: selected ? 'red':'green'}}
Run Code Online (Sandbox Code Playgroud)

使用 CSS

在js中

className={`section ${selected && 'section_selected'}`}
Run Code Online (Sandbox Code Playgroud)

在 CSS 中

.section {
  display: flex;
  align-items: center;
} 
.section_selected{
  background-color: whitesmoke;
  border-width: 3px !important;
}
Run Code Online (Sandbox Code Playgroud)

同样可以用 Js 样式表完成


S M*_*han 6

首先,就样式而言,我同意您的看法-我也会(也确实)有条件地应用类而不是内联样式。但是您可以使用相同的技术:

<div className={{completed ? "completed" : ""}}></div>
Run Code Online (Sandbox Code Playgroud)

对于更复杂的状态集,请累积一组类并应用它们:

var classes = [];

if (completed) classes.push("completed");
if (foo) classes.push("foo");
if (someComplicatedCondition) classes.push("bar");

return <div className={{classes.join(" ")}}></div>;
Run Code Online (Sandbox Code Playgroud)


die*_*l02 6

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

style={{
  ...completed ? { textDecoration: completed } : {}
}}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您不想更改默认样式,这是一个不错的方法 (2认同)
  • 我想在这里添加 1 个变体: ...completed &amp;&amp; { textDecoration: Completed } (2认同)

Ron*_*nki 5

在某些条件下应用内联样式的排序方式。

style={areFieldsDisabled ? {opacity: 0.5} : '' }
Run Code Online (Sandbox Code Playgroud)