- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于作文的问题,希望有人能帮助我。我正在将 react-css-modules
与 Sass 结合使用,我想知道为我们的基本底层组件之一编写内容的最佳方法。
这是我们的组件:
import React, {PropTypes} from 'react'
import cssModules from 'react-css-modules'
import styles from './style.sass'
const Button = ({children = 'Submit', ...props}) => {
const align = props.align ? `-${props.align}` : ''
const type = props.type ? `-${props.type}` : ''
const styleName = `button${type}${align}`
return (
<button onClick={props.onClick} {...props} styleName={styleName}>
{children}
</button>
)
}
Button.propTypes = {
align: PropTypes.string,
onClick: PropTypes.func.isRequired,
type: PropTypes.string,
}
export default cssModules(Button, styles)
这是到目前为止的样式表:
@import "~components/styles/variables"
.button
color: $button-default
background-color: transparent
font-family: $font-family
font-size: $default-font-size
font-weight: $font-regular
line-height: $default-button-height
margin: 0 $pad 0 0
outline: none
padding: 0 $pad*2
.left
float: left
.right
float: right
.primary
color: $background-interaction
background-color: $button-default
.button-left
composes: button, left
.button-right
composes: button, right
.button-primary
composes: button, primary
.button-primary-left
composes: button, primary, left
.button-primary-right
composes: button, primary, right
现在真的很痛苦。我们添加的每个可配置 Prop 都会以指数方式增加我们必须提供的组合类的数量。我们当前可以配置 align
和 type
,并且由于两者都可以为 null,因此我们有 6 种可能的组合,因此除了基本 .button 之外还需要创建 5 个组合类
。如果我们再添加一个属性,比如一个 bool bold
,我们现在必须添加一大堆新的组合类名:.button-bold、.button-left-bold、 .button-right-bold、.button-primary-bold、.button-primary-left-bold、.button-primary-right-bold
。
我知道使用 react-css-modules
我们可以启用 allowMultiple
设置来允许我们指定多个模块来应用于一个元素,但我的理解是违反最佳实践。我觉得我们必须在这里遗漏了一些东西。我们做错了什么?
最佳答案
我认为示例中可能存在多种问题,这就是为什么它不符合“每个元素一个类”规则的原因。强制每个元素一个类规则的原因之一是,我们可以轻松地更改元素状态的外观,而无需实际接触该元素。 (基本上 CSS 本身的 promise 终于实现了。)如果一个元素上有多个类,则很难在不更改元素的情况下控制外观。如果您使用外观(而不是语义)类,则尤其如此。
像“button-primary-left-bold”这样的类具有一些语义含义(“button-primary”),但它也具有一些布局含义(“left”)和一些文本外观含义(“bold”)。 Button 组件可能没有控制其自身布局的业务。请记住,您也可以编写 React 组件!所以你可以有更多类似的东西:
<Left><Button type="primary">Click Me!</Button></Left>
现在 Button 组件的 CSS 模块可以只关心按钮的类型。而且 Button 组件可以在任何地方、任何布局中使用,而不仅仅是基于 float 的布局。
更好的是, float 也可以被插入更具语义的组件中。也许是这样的:
<ButtonBar>
<Button>Cancel</Button>
<Button type="primary">Save</Button>
</ButtonBar>
ButtonBar 可以有自己的 CSS 模块来进行布局。稍后您可以将那个笨拙的 float 布局替换为时髦的弹性盒布局。 :-)
您的“粗体”修饰符示例在 Button 组件中肯定没有位置。最好考虑为什么某些内容是粗体,然后为其创建一个组件或语义属性。否则,如果设计要求将这些“粗体”按钮更改为“斜体绿色”按钮,则您必须四处更改一堆元素。
如果你这样做(用语义组件交换视觉/布局类并分解码件和 CSS 模块),你将获得更少的“指数增长”。如果您最终确实需要组合多个语义属性,那么阐明这些状态仍然有一定的值(value)。一个很好的例子可能是“主要残疾”。出于以下几个原因,这比“主要残疾”要好。首先,很容易查看 CSS 模块并查看列出的显式状态。其次,这些类的用途和关系没有含糊不清。 “主要禁用”实际上是这些类的有效使用吗?只有有人记录了使用情况才能知道这一点。 “禁用”类可能会覆盖“主”类中的某些内容,这意味着存在隐式排序依赖性。将来善意的编辑很容易破坏事情,因为这些类之间的关系并不明显。通常情况下,选择隐式的东西来保存一些击键可能会导致微妙的错误。支付一点击键税可以锁定一切,并让什么有效、什么无效变得显而易见。
另一个可以节省你敲击键盘次数的小点:实际上没有理由使用“button-”前缀。这正是 CSS 模块的用途。改为这样做:
.normal
color: $button-default
background-color: transparent
font-family: $font-family
font-size: $default-font-size
font-weight: $font-regular
line-height: $default-button-height
margin: 0 $pad 0 0
outline: none
padding: 0 $pad*2
.primary
composes: normal
color: $background-interaction
background-color: $button-default
文件名本身本质上是“按钮”前缀。
关于reactjs - CSS模块组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34324461/
编辑:我将问题重新表述为更简单且不那么特定领域的问题: 在下面的代码中,我想实现 mplus 函数,该函数结合了受特定字段存在约束的两个函数。结果函数应受两个字段的存在的约束。 谢谢 ! import
我的代码有什么问题?提前致谢! 我正在尝试为我的 docker 容器设置一个虚拟主机。在本地主机上:8000 完美运行,但是当我尝试通过 http://borgesmelo.local/访问时,出现错
这个问题在这里已经有了答案: CSS technique for a horizontal line with words in the middle (34 个答案) 关闭 2 年前。 首先,这是
我是 React Js 的新手,并尝试了解如何通过 ajax 对从不同来源获得的数据进行组合(如下所述: Reactjs - loadResourcesFromServer - combine two
我一直在关注 this tutorial在 docker 服务和 swarms 上。但是我在不同 docker 容器之间的网络连接上遇到了一些问题。 以下是我的 docker-compose.yml
我正在尝试创建一个相对简单的设置来开发和测试 npm 包。事实上,一个问题是,在将代码卷安装到容器后,它会替换 node_modules。 我尝试了很多通常合乎逻辑的东西,主要是为了将 node_mo
我有四种类型A、B、C和D,初始值x Future[Option[A]] 和三个函数:f1: A => Option[B] , f2: B => Future[Option[C]] 和 f3: C =
我有一个包含单词的语料库。我想对他们做一个分析。我接受它们是土耳其字符,但其中一些不是。所以我想检查一个词是否不包含土耳其字符或数字。我的意思是: hey4 valid 33 vali
这是我正在为 Java 入门课解决的学校问题。作业是编写一个程序,生成一个由随机生成的二进制数组成的 8 x 8 矩阵,并让程序检查哪些列(如果有)全为 0,以及主对角线和次对角线是否也由零组成。主对
我正在尝试编写一个由任意数量的 lambda 函数组成的函数。 我有两个简单的 lambda 函数。 f = lambda x: x + 1 g = lambda x: x**2 我对组合函数的尝试是
我在这里学习 Docker Compose 教程 https://docs.docker.com/get-started/part5/#recap-optional version: "3" serv
我正处于要为应用程序编写 androidTests 的状态。 阅读 Testing Compose 的文档,我创建了一个文件并编写了一个简单的测试来检查进度: ExamineTest.kt: clas
我最近刚跨过木偶继承。围绕它的几个问题: 使用p继承是一种好习惯吗?一些经验丰富的木偶同事告诉我,木偶的继承不是很好,我不太相信。 来自OO世界,我真的很想了解木偶继承的原理,以及覆盖的原理。 最佳答
我正在尝试使用 docker-compose 创建一个基本网页 这是我的 yml 文件 identidock: build: . ports: - "5000:5000" envir
我们有docker-compose.yml,其中包含Kafka,zookeeper和schema registry的配置 当我们启动docker compose时,出现以下错误 docker-comp
我在玩 Haskell 的类型时无意中发现了 length 。总和 有效。是否有一些语义应该允许它工作,或者这仅仅是类型定义的一个缺点?我在下面编写了每个类型定义。 length :: Foldabl
如何防止缩小仅包含 JFormattedTextFields 的 JPanel。 JFormattedTextField textF1; JFormattedTextField textF2;
我尝试更 retrofit 载我的 Docker 卷的用户,但执行此操作的是“root”用户,而不是“安全用户”。知道如果我在 Dockerfile 中执行“chown -R/var/www”,这将不
我正在尝试将 scalaz 的 ioeffect IO[E,A] monad 用于一段非常有效的代码。 我试图用 IO[E,A] 在高层次上重写的代码需要一些关于存储在云中的文件的元数据。代码试图:
这个问题已经有答案了: What special characters must be escaped in regular expressions? (13 个回答) 已关闭 5 年前。 java中
我是一名优秀的程序员,十分优秀!