如何将props传递给样式组件中的基础组件?

IT技术 javascript reactjs styled-components
2021-05-05 02:38:59

举个例子,假设我有一个可以接受这样的props的组件:

const testComponent = (props: {isBold: boolean}) => {
   if(props.isBold)
     return <strong><div>hello</div></strong>
   return <div>hello</div>
    
}

在这种情况下,我的示例组件可以接受props,结果取决于给它的props。

现在,如果我在 styled-components 中扩展这个组件,我如何将我的 props 传递到基础组件中?这个想法是这样的:

const styledTestComponent = styled(testComponent({isBold: true}))`
    width: 100%;
    opacity: 0.5
    /* etc etc... */
`

嗯,显然不会工作。这部分将失败:styled(testComponent({isBold: true}))

但我的想法是我想要做的是使用 CSS 来设置组件的特定实例的样式。因此,在这种情况下,我需要将预定义的 props 传递给基础组件testComponent.

我怎样才能做到这一点?

更新:

我想出了一个简单的例子来说明这个问题。下面的代码尝试将 react 组件MyCustomImage的样式设置为 styled-component StyledMyCustomImage运行时,您可以看到它StyledMyCustomImage确实将自身呈现为MyCustomImage. 但是,不应用 CSS 样式。

const MyCustomImage = props => (
  <img
    src={`https://dummyimage.com/${props.width}x${props.height}/619639/000000`}
  />
);

const StyledMyCustomImage = styled(MyCustomImage)`
  border: 2px dotted red;
`;

function App() {
  return (
    <div className="App">
      <h3>Test passing props from styled component to base component</h3>
      <StyledMyCustomImage width="600" height="400" />
    </div>
  );
}

我为这个演示创建了一个沙箱:https : //codesandbox.io/s/k21462vjr5

更新 2:

哦!感谢@SteveHolgado 的回答,我已经开始工作了!我不知道样式组件会将 CSS 作为props传递给其基础组件!这是添加类名后的代码以供将来参考:

const MyCustomImage = props => (
  <img
    src={`https://dummyimage.com/${props.width}x${props.height}/619639/000000`}
    className={props.className}
  />
);

const StyledMyCustomImage = styled(MyCustomImage)`
  border: 2px dotted red;
`;

工作演示的 sadnbox:https ://codesandbox.io/s/j4mk0n8xkw

2个回答

试试这个,它应该工作

const StyledTestComponent = styled(testComponent)`
    width: 100%;
    opacity: 0.5
    /* etc etc... */
`

并以这种方式将props传递给实例。

<StyledTestComponent isBold />

欢迎反馈。我还没有检查它是否有效,但感觉它会起作用

注意:我检查过,它正在工作。应该为你工作。

当您使用这样的styled函数时,您的包装组件将传递一个名为className的props,您需要将其应用于您希望样式影响的元素:

const testComponent = (props) => {
  return <div className={props.className}>hello</div>
}

您将可以访问您样式中的所有props,您可以像这样使用:

const styledTestComponent = styled(testComponent)`
  width: 100%;
  opacity: 0.5;
  font-weight: ${props => props.isBold ? "bold" : "normal"};

  /* etc etc... */
`