React.js内联样式最佳实践

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

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

我是否应该这样做所有的样式,并没有在我的CSS文件中指定的所有样式?

还是应该完全避免内联样式?

做一点点两个似乎是奇怪和混乱 – 调整样式时需要检查两个地方。

目前还没有很多“最佳实践”。 我们这些正在使用内联样式的React组件,仍然是非常多的实验。

有许多方法可以大不相同: 反应内联样式的比较图表

全部还是全无?

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

  • 布局 – 元素/组件如何看起来与其他人有关系
  • 外观 – 元素/组件的特征
  • 行为和状态 – 元素/组件在给定状态下的外观

从状态样式开始

React已经在pipe理你的组件的状态,这使得状态和行为的风格很自然地适合于你的组件逻辑的托pipe。

不要使用条件状态类来构build组件,可以考虑直接添加状态样式:

 // 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-前缀类来表示状态和行为

我们可以使用Object.assign (ES6)或_.extend (下划线/ lodash)来添加对多个状态的支持:

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

定制和可重用性

现在我们正在使用Object.assign ,使得我们的组件可以重用不同的样式变得非常简单。 如果我们想要覆盖默认样式,我们可以在调用站点上使用道具来实现,如下所示: <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> 

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

出现

这是“内联式”辩论中最有争议的地方。 最终,它取决于您的devise组件和使用JavaScript的团队的舒适度。

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

我喜欢Radium,因为这些硬件的语法是为了模拟SASS的。

代码组织

通常你会在模块外面看到一个样式对象。 对于待办事项列表组件,它可能看起来像这样:

 var styles = { root: { display: "block" }, item: { color: "black" complete: { textDecoration: "line-through" }, due: { color: "red" } }, } 

吸气剂function

将一堆样式逻辑添加到您的模板可能会变得有点混乱(如上所示)。 我喜欢创buildgetter函数来计算样式:

 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

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

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

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

希望这解决了这个问题

我在我的React组件中广泛使用内联样式。 我发现在组件中共同使用样式要清楚得多,因为总是清楚组件的样式和样式。 加上拥有Javascript的全部function,真正简化了更复杂的样式需求。

我一开始并不确定,但是经过几个月的摸索,我完全转换了,正在将所有的CSS转换为内嵌或其他JS驱动的css方法。

Facebook员工和React贡献者“vjeux”的演示文稿也非常有帮助 – https://speakerdeck.com/vjeux/react-css-in-js

style属性的主要用途是基于dynamic,基于状态的样式。 例如,基于某些状态,您可以在进度条上使用宽度样式,也可以使用基于其他内容的位置或可见性。

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

詹姆斯·K·纳尔逊(James K Nelson)在他的“为什么不应该使用JavaScript对元素进行风格化”一书中写道,实际上并不需要使用内联样式。 他的发言是,与旧/无聊的CSS / CSS是最好的解决scheme。 他的赞成CSS的部分:

  • 外部可扩展
  • 可排除的(内联样式超越了一切)
  • devise师友好

我所做的是给我的可重用组件的每一个独特的自定义元素名称,然后创build一个该组件的CSS文件,具体来说,与该组件的所有样式选项(只为该组件)。

 var MyDiv = React.createClass({ render: function() { return <custom-component style={style}> Have a good and productive day! </custom-component>; } }); 

在文件“custom-component.css”中,每个条目都以自定义组件标签开始:

 custom-component { display: block; /* have it work as a div */ color: 'white'; fontSize: 200; } custom-component h1 { font-size: 1.4em; } 

这意味着你不会放弃分离关注的关键概念。 查看与风格。 如果你分享你的组件,那么其他人可以更容易地将其组织起来,以匹配其网页的其余部分。

您可以使用react-theme来组织您的内联样式,并在构build可重用组件时使其容易定制。

它在material-ui中的作用类似于ThemeManager 。

我通常有与每个React组件关联的scss文件。 但是,我不明白为什么不用逻辑封装组件并查看它。 我的意思是,你有类似的东西与networking组件。

根据您的configuration,内联样式可以为您提供热重载。 每当样式改变时,网页立即重新呈现。 这有助于我更快地开发组件。 话虽如此,我相信你可以为CSS + SCSS设置Hot reload环境。

这实际上取决于你的应用程序有多大,如果你想使用捆绑软件如webpack,并将CSS和JS捆绑在一起,以及如何pipe理你的应用程序stream! 在一天结束时,取决于你的情况,你可以做出决定!

我最喜欢在大型项目中组织文件,将CSS和JS文件分离开来,分享起来更容易,UI人员更容易通过CSS文件,整个应用程序也更加整洁。

总是这样想,确保在开发阶段一切都应该在哪里,正确命名,并容易为其他开发人员find东西…

内联样式的问题是内容安全策略(CSP)变得越来越普遍,这是不允许的。 因此,我build议完全避免内联样式。

更新:为了进一步解释,CSP是服务器发送的HTTP头,它限制了页面上可以显示的内容。 这只是一个进一步的缓解,可以应用到服务器,以防止攻击者做一些顽皮的事情,如果开发人员编码的网站很差。

大多数这些限制的目的是阻止XSS(跨站点脚本)攻击。 XSS是攻击者想出一种方法在你的页面上包含他自己的javascript的一种方式(例如,如果我让我的用户名bob<SCRIPT>alert("hello")</SCRIPT>然后发表评论,并且你访问页面,它不应该显示警报)。 开发人员应该拒绝让用户向网站添加这样的内容的能力,但是如果他们犯了一个错误,那么CSP如果发现任何script>标签,就会阻止页面加载。

CSP只是为开发者提供了额外的保护,以确保他们是否犯了错误,攻击者不能为访问者造成问题。

因此,所有的都是XSS,但是如果攻击者不能包含<script>标签,但是可以在标签中包含<style>标签或者包含一个style=参数呢? 然后,他可能会改变网站的外观,以至于你被点击错误的button或其他问题。 这不是一个问题,但仍然是要避免的,CSP为你做这件事。

testingCSP站点的好资源是https://securityheaders.io/

有关CSP的更多信息,请访问: http : //www.html5rocks.com/en/tutorials/security/content-security-policy/