【问题标题】:Extending / Overwriting styles of an imported React Component扩展/覆盖导入的 React 组件的样式
【发布时间】:2021-01-26 04:17:29
【问题描述】:

我有两个组件,为了简洁起见,我在这里简化了代码... 问题是,当我导入 ComponentB 以用作 ComponentA 的子级时,我似乎无法更改 ComponentB 的样式。

我正在使用样式化组件仅供参考。

示例:
在 ComponentA 中,我正在导入 ComponentB。 ComponentB 是一个独立的组件,它封装了自己的样式和逻辑。在 ComponentA 中使用时,我需要覆盖/扩展一些 ComponentB 样式。

这是一个代码示例:

// ComponentB
import React from "react";
import * as S from "./ComponentB.styles"; // styled components

export function ComponentB() {
  return (
    <S.Container>
      <S.Content
        {...props}
      />
    </S.Container>
  )
}
// ComponentA file
import React from "react";
import { ComponentB } from "./ComponentB";
import * as S from "./ComponentA.styles"; // styled components

export function ComponentA() {
  return (
    <S.Container>
      <S.Content
        <ComponentB {...props} /> // I need to use ComponentB but change its styling
      />
    </S.Container>
  )
}

如何将 ComponentB 用作 ComponentA 的子级,但要更改它的一些样式?

【问题讨论】:

  • 这个答案的第一部分有帮助吗? stackoverflow.com/a/64599361/10431574 您需要使 ComponentB 接受 className 和/或 style 属性并将其传递给 DOM。在S.ContainerS.Content 上?或者它应该接受像 containerStylecontentStyle 这样的道具来做这两件事。

标签: javascript css reactjs styled-components


【解决方案1】:

ComponentB 不使用任何道具,因此您传递给它的任何内容都将被完全忽略。您需要编辑您的组件,以便一些样式道具可以一直传递到 DOM。

这取决于您如何实现覆盖样式。它是className 还是CSSProperties 对象?样式是否适用于S.ContainerS.Content,或者您可以通过名称为containerStylecontentStyle 的单独道具来设置样式?

您可以将整个 ComponentB 包装在 styled(ComponentB) 声明中,这样可以创建具有正确样式 (docs link) 的 className 道具。为了让它工作,你的ComponentB 必须接受这个className 并传递它,以便它最终连接到 DOM。

【讨论】:

  • 嗨琳达,非常感谢您的全面回答。我想我理解您的建议,我喜欢将 className 道具传递给(例如)S.Container 并添加一些其他样式的想法。我知道这个 className 也会传递到 DOM。我不明白我会在哪里应用这些样式,您是否建议将其作为 ComponentA 样式组件中的嵌套样式?例如:CompA Container= styled` .className { width: 100%}`;?
  • 我想我会像StyledCompB = styled(ComponentB)'{ width: 100%}' 那样做。然后ComponentA 将使用StyledCompB 而不是ComponentB。为了使该语法起作用,ComponentB 变成类似于function ComponentB({className, ...props}) { return (&lt;S.Container className={className}&gt;&lt;S.Content {...props} /&gt;&lt;/S.Container&gt;); } 我认为这行得通吗?我刚刚意识到你的两个组件都在使用{...props},但实际上并没有在函数参数中使用任何道具,所以这是一个错误。
  • 再次嗨,是的,就是这样!我现在明白了。其实我之前读过关于 styled-component {className} 的内容,但实际上我并不明白这是它的用途以及它是如何工作的。我现在理解得更好了,这解决了我的特殊问题。再次感谢您的帮助和解释,非常感谢。 PS:是的,在我的例子中我不小心通过了道具,那是一个错误。
猜你喜欢
  • 1970-01-01
  • 2016-09-30
  • 2020-08-20
  • 2020-07-26
  • 2017-04-02
  • 1970-01-01
  • 2020-12-27
  • 2016-06-03
  • 2015-05-30
相关资源
最近更新 更多