使用ReactFela设计组件
React 中的样式有各种形状和大小。 开箱即用,您可以通过 className
属性分配类或通过将对象传递给 style
属性来分配 CSS 属性。 虽然在大多数情况下足够了,但它们并非没有缺点。 使 classNames
动态需要定义额外的类,而 styles
虽然允许动态属性,但仍然需要样板代码并且不允许您深入挖掘 :hover
等伪类属性. 这就是费拉可以来拯救你的地方!
Fela 是一个与框架无关的库,用于处理 JavaScript 中的状态驱动样式。 它是高性能的,并且在如何使用它方面为您提供了一些灵活性。 虽然您可以单独使用 Fela,但 react-fela 可用于为您的 React.js 应用程序提供 React 绑定。
入门
首先,我们需要将 react-fela
添加到我们的项目中:
通过 npm
$ npm install --save react-fela
或通过纱线
$ yarn add react-fela
在本文中,我们将直接使用 fela
库中的一些方法。 不过不用担心,react-fela
包含了这个依赖,所以我们应该很高兴。
渲染器
正如所承诺的,我们需要使用 fela
库的一部分,即 createRenderer
。 createRenderer
方法用于创建一个渲染器,该渲染器将传递一个 Provider
组件,该组件将包装使用 Fela 的组件。
以下所有示例都将包含我们需要使魔术发生的样板代码。
使用生成的 CSS 类
最不复杂的 Fela 示例并不理想,但样板代码量最少。
Fela 的工作方式是它采用您的样式,使用原子类生成适当的 CSS,并允许您获取可以传递给任何组件的 classNames
属性的 CSS 类:
import React from "react"; import { render } from "react-dom"; import { createRenderer } from "fela"; import { Provider } from "react-fela"; const renderer = createRenderer(); const rule = ({ backgroundColor = "#6db65b", borderColor = "#efbb35", padding }) => ({ backgroundColor: backgroundColor, border: `10px solid ${borderColor}`, color: "#fff", fontWeight: "bold", padding: `${padding}px`, ":hover": { cursor: "pointer", filter: "drop-shadow(0 10px 19px rgba(0, 0, 0, 0.3))" } }); const container = document.createElement("div"); document.body.appendChild(container); render( <Provider renderer={renderer}> <div className={renderer.renderRule(rule, { padding: 100 })}> Hover Over Me! </div> </Provider>, container );
正如您在示例中看到的,renderer
用于根据传入的 CSS 属性的对象生成我们的 CSS 和类名。
rule
只是一个简单的匿名函数,它返回一个包含我们所有属性的对象,包括可能已传入的任何属性。
因为 rule
只是一个带有返回对象的函数,所以您可以根据需要扩展并包含其他逻辑,而不是立即返回预期的对象。
使用组件原语
虽然以前的方法效果很好,但有时创建一个可以在整个项目中轻松重用的新组件也很好。
在这些场景中,我们可以利用 FelaComponent
原始组件来创建一个新组件:
import React from "react"; import { render } from "react-dom"; import { createRenderer } from "fela"; import { FelaComponent, Provider } from "react-fela"; const renderer = createRenderer(); const rule = ({ backgroundColor = "#6db65b", borderColor = "#efbb35", padding }) => ({ backgroundColor: backgroundColor, border: `10px solid ${borderColor}`, color: "#fff", fontWeight: "bold", padding: `${padding}px`, ":hover": { cursor: "pointer", filter: "drop-shadow(0 10px 19px rgba(0, 0, 0, 0.3))" } }); const PaddedContainer = ({ backgroundColor, borderColor, padding, children }) => ( <FelaComponent rule={rule} backgroundColor={backgroundColor} borderColor={borderColor} padding={padding} > {children} </FelaComponent> ); const container = document.createElement("div"); document.body.appendChild(container); render( <Provider renderer={renderer}> <PaddedContainer padding={100}> Hover Over Me! </PaddedContainer> </Provider>, container );
利用类似的 rule
,我们可以创建一个新的 PaddedContainer
组件,我们可以直接将属性传递给它,而无需通过 renderRule
分配类和分配类。
自己创建组件
使用原语创建新组件并没有错,但与直接创建组件相比,您往往会得到更多样板:
import React from "react"; import { render } from "react-dom"; import { createRenderer } from "fela"; import { createComponent, Provider } from "react-fela"; const renderer = createRenderer(); const rule = ({ backgroundColor, borderColor, padding }) => ({ backgroundColor: backgroundColor, border: `10px solid ${borderColor}`, color: "#fff", fontWeight: "bold", padding: `${padding}px`, ":hover": { cursor: "pointer", filter: "drop-shadow(0 10px 19px rgba(0, 0, 0, 0.3))" } }); const AnotherPaddedContainer = createComponent(rule); const container = document.createElement("div"); document.body.appendChild(container); render( <Provider renderer={renderer}> <AnotherPaddedContainer padding={100}>Hover Over Me!</AnotherPaddedContainer> </Provider>, container );
像我们使用原始组件的示例一样更简洁且可重用!
结论
无论您采用哪种方法,利用 react-fela
可以通过消除您必须编写的大量样板来加快在 React 中动态样式组件所需的时间。
要查看上面的代码示例,请转到 CodeSandbox。
享受!