React.js 内联样式最佳实践

IT技术 css reactjs inline-styles
2021-04-03 00:14:52

我知道您可以在 React 类中指定样式,如下所示:

const MyDiv = React.createClass({
  render: function() {
    const style = {
      color: 'white',
      fontSize: 200
    };
    
    return <div style={style}> Have a good and productive day! </div>;
  }
});

我应该以这种方式进行所有样式设置,并且在我的 CSS 文件中完全没有指定样式吗?

或者我应该完全避免内联样式?

两者都做一点似乎很奇怪和混乱 - 在调整样式时需要检查两个地方。

6个回答

还没有很多“最佳实践”。我们这些使用内联样式的人,对于 React 组件,仍然在进行大量的试验。

有许多方法千差万别:React inline-style lib compare chart

全有还是全无?

我们所说的“风格”其实包含了很多概念:

  • 布局——一个元素/组件相对于其他元素的外观
  • 外观——元素/组件的特征
  • 行为和状态——元素/组件在给定状态下的外观

从状态样式开始

React 已经在管理组件的状态,这使得状态和行为样式自然适合与组件逻辑的托管。

与其构建组件以使用条件状态类进行渲染,不如考虑直接添加状态样式:

// Typical component with state-classes
<li 
 className={classnames({ 'todo-list__item': true, 'is-complete': item.complete })} />


// Using inline-styles for state
<li className='todo-list__item'
 style={(item.complete) ? styles.complete : {}} />

请注意,我们使用一个类来设置外观样式,但不再使用任何.is-前缀类来表示state 和 behavior

我们可以使用Object.assign(ES6) 或_.extend(underscore/lodash) 添加对多种状态的支持:

// Supporting multiple-states with inline-styles
<li 'todo-list__item'
 style={Object.assign({}, item.complete && styles.complete, item.due && styles.due )}>

定制化和可重用性

现在我们正在使用Object.assign它变得非常简单,使我们的组件可重用不同的样式。如果我们想覆盖默认的样式,我们可以在调用点props这样做,就像这样:<TodoItem dueStyle={ fontWeight: "bold" } />像这样实现:

<li 'todo-list__item'
 style={Object.assign({},
         item.due && styles.due,
         item.due && this.props.dueStyles)}>

布局

就个人而言,我认为内联布局样式没有令人信服的理由。有许多很棒的 CSS 布局系统。我就用一个。

也就是说,不要将布局样式直接添加到您的组件中。用布局组件包裹你的组件。这是一个例子。

// This couples your component to the layout system
// It reduces the reusability of your component
<UserBadge
 className="col-xs-12 col-sm-6 col-md-8"
 firstName="Michael"
 lastName="Chan" />

// This is much easier to maintain and change
<div class="col-xs-12 col-sm-6 col-md-8">
  <UserBadge
   firstName="Michael"
   lastName="Chan" />
</div>

对于布局支持,我经常尝试将组件设计为100% widthheight

外貌

这是“内联风格”辩论中最具争议的领域。归根结底,这取决于您设计的组件以及您的团队对 JavaScript 的舒适度。

有一件事是肯定的,你需要图书馆的帮助。浏览器状态 ( :hover, :focus) 和媒体查询在原始 React 中很痛苦。

我喜欢Radium,因为这些难点的语法旨在模拟 SASS 的语法。

代码组织

通常你会在module之外看到一个样式对象。对于待办事项列表组件,它可能如下所示:

var styles = {
  root: {
    display: "block"
  },
  item: {
    color: "black"

    complete: {
      textDecoration: "line-through"
    },

    due: {
      color: "red"
    }
  },
}

吸气功能

向模板中添加一堆样式逻辑可能会有些混乱(如上所示)。我喜欢创建 getter 函数来计算样式:

React.createClass({
  getStyles: function () {
    return Object.assign(
      {},
      item.props.complete && styles.complete,
      item.props.due && styles.due,
      item.props.due && this.props.dueStyles
    );
  },

  render: function () {
    return <li style={this.getStyles()}>{this.props.item}</li>
  }
});

进一步观察

今年早些时候,我在 React Europe 上更详细地讨论了所有这些:内联样式以及何时最好“只使用 CSS”

我很高兴在您一路上有新发现时提供帮助:) 联系我 -> @chantastic

很棒的阅读。也非常感谢您@chantastic 的相关演讲#公认
2021-05-22 00:14:52
@chantastic 很好的答案。一年过去了,这一切都是真的吗?只是真的刚刚进入 React 和内联样式的想法,只是想知道自从您发布此答案后是否有任何变化。
2021-05-22 00:14:52
@alexrussell oop。不小心提早提交。我现在使用这种组件技术来设计我的组件。这个想法很简单。您创建一个只关心的风格和撰写应用程序与那些,而不是部件divspana,等这将有助于孤立保持的风格,无论你使用的库。reactpatterns.com/#Style组件
2021-05-22 00:14:52
“用布局组件包装你的组件”:很明显,但正是我需要的。
2021-06-02 00:14:52
@alexrussell 谢谢!我认为这里的答案仍然很好。发生变化的一个方面是 Aphrodite 似乎是社区首选的内联 stiles 库(而不是 Radium)——尽管这实际上是个人喜好的问题。
2021-06-17 00:14:52

React 中的 style 属性期望值是一个对象,即键值对。

style = {}里面会有另一个对象{float:'right'}让它工作。

<span style={{float:'right'}}>Download Audit</span>

希望这能解决问题

@PardeepJain如果您对2018 年 meet.js 峰会感兴趣,这里是使用Emotion的完整讲座
2021-05-27 00:14:52
这种方法的一个缺点是定义内联样式每次都会创建一个新对象。这会在style道具中产生差异,这可能会导致性能问题。至少,在你的render. 希望这可以帮助!
2021-06-15 00:14:52
那么如果我想在 JS 文件中使用 css 类,如何使用相同的媒体查询
2021-06-18 00:14:52
我多么希望每个答案都可以如此简单直观地学习。
2021-06-19 00:14:52

我在 React 组件中广泛使用内联样式。我发现在组件内并置样式非常清晰,因为它总是很清楚组件具有和不具有哪些样式。此外,手头拥有 Javascript 的全部功能确实可以简化更复杂的样式需求。

起初我并不相信,但在涉足几个月后,我完全转换并且正在将我所有的 CSS 转换为内联或其他 JS 驱动的 css 方法。

此演示文稿被Facebook员工和应对贡献者“vjeux”是真正有用的,以及- https://speakerdeck.com/vjeux/react-css-in-js

@g3mini 无论如何,这现在不是推荐的方法,因为有更强大的样式组件解决方案,例如CSS Modules,styled-components和其他。
2021-05-28 00:14:52
这里没有考虑的一件事是在同一个 SASS 文件中很容易看到父样式和子样式,而如果您需要查看不同组件中的规则,则可能必须打开和关闭大量文件。
2021-06-02 00:14:52
js 中也有 css =) 不过我现在更喜欢使用 CSS Modules。
2021-06-12 00:14:52
我将如何使用内联样式制作响应式布局?您在此处没有媒体查询选项。
2021-06-15 00:14:52
你得到了js的强大,js可以检测浏览器大小来动态构建样式。
2021-06-20 00:14:52

style 属性的主要目的是用于动态的、基于状态的样式。例如,您可以根据某种状态在进度条上设置宽度样式,或者根据其他内容设置位置或可见性。

JS 中的样式强加了应用程序无法为可重用组件提供自定义样式的限制。这在上述情况下是完全可以接受的,但当您更改可见特征(尤其是颜色)时则不然。

我们一段时间以来的一个相关想法是能够使用 gulp 和 LESS 为 React 组件隔离特定的 CSS 规则。有点像为每个组件设置一个特定的 className,然后在组件文件中为该类添加特定的 CSS。这会很有意义。
2021-05-31 00:14:52
是的,命名约定是一回事,但主要的是将独立的 CSS 规则添加到同一个组件 js 文件中。
2021-06-01 00:14:52
当然,如果您的组件是单个元素,但考虑<div><a>foo <b>bar</b></a><table>...</table></div>到您如何从 props 设置样式?请记住,html 结构应保留为实现细节,否则您将失去组件提供的许多好处。
2021-06-08 00:14:52
这不是真的。您绝对可以将自定义样式应用于反应组件。组件只需要将自己的样式对象与从上面传递的对象合并,该对象可以来自应用程序数据。请参阅speakerdeck.com/vjeux/react-css-in-js 的最后一张幻灯片,如下所述
2021-06-12 00:14:52
我经常使用“component-{app}-{componentName}”格式的类名。“{app}”可以是应用程序的名称,也可以是应用程序独立组件的“common”。例如,TodoList 的“component-foo-todo-list”和“component-common-light-switch-toggle”。对于打包组件,{app} 将是 npm 名称。你指的是这个吗?
2021-06-21 00:14:52

James K Nelson 在他的信件“为什么你不应该使用 JavaScript 设计 React 组件的样式”中指出,实际上没有必要使用内联样式及其缺点。他的说法是使用 less/scss 的陈旧乏味的 CSS 是最好的解决方案。他的论文中赞成 CSS 的部分:

  • 可外部扩展
  • 可分割(内联样式超越一切)
  • 设计师友好