styled-components表示在您的React组件(Component)周围包装了styled()

时间:2018-11-16 06:16:50

标签: reactjs styled-components codesandbox

我在我的应用程序中使用样式组件在CodeSandbox中。请参考以下网址 https://lrn6vmq297.sse.codesandbox.io/

每次我进行一些更改时,控制台都会说。

Warning: Prop `className` did not match.

It looks like you've wrapped styled() around your React component (Component), but the className prop is not being passed down to a child. No styles will be rendered unless className is composed within your React component.

并且UI不能按预期呈现。 有人知道我为什么遇到这个问题吗?请查看上面的网址。

谢谢

4 个答案:

答案 0 :(得分:6)

基本上,您需要传递this.props.className生成的props.classNameclassName或经过解构的styled-components并将其手动应用于要设置样式的组件。否则,您不会将className应用于任何内容,因此不会看到任何样式更改。

工作示例:

Edit Styled Component

components / LinkComponent.js (此function接受classNamestyled()生成的props,这些Link传递给样式化的组件在下面创建的-您需要将它们手动应用于import React from "react"; import PropTypes from "prop-types"; import { Link } from "react-router-dom"; const LinkComponent = ({ className, children, link }) => ( <Link className={className} to={link}> {children} </Link> ); LinkComponent.propTypes = { className: PropTypes.string.isRequired, link: PropTypes.string.isRequired, children: PropTypes.string.isRequired }; export default LinkComponent; 组件)

function

components / StyledLink.js (导入上方的styled()并将其传递给styled() -您也可以创建一个styled themed来更新{{1 }}元素

import styled from "styled-components";
import LinkComponent from "./LinkComponent";

const StyledLink = styled(LinkComponent)`
  color: ${props => (!props.primary && !props.danger ? "#03a9f3" : "#ffffff")};
  background-color: ${props => {
    if (props.primary) return "#03a9f3";
    if (props.danger) return "#f56342";
    return "transparent";
  }};
  font-weight: bold;
  margin-right: 20px;
  padding: 8px 16px;
  transition: all 0.2s ease-in-out;
  border-radius: 4px;
  border: 2px solid
    ${props => {
      if (props.primary) return "#03a9f3";
      if (props.danger) return "#f56342";
      return "#03a9f3";
    }};

  &:hover {
    color: ${props => (!props.primary && !props.danger ? "#0f7ae5" : "#ffffff")};
    background-color: ${props => {
      if (props.primary) return "#0f7ae5";
      if (props.danger) return "#be391c";
      return "transparent";
    }};
    text-decoration: none;
    border: 2px solid ${props => (props.danger ? "#be391c" : "#0f7ae5")}};
  }
`;

export default StyledLink;

components / Header.js (导入上面创建的样式化组件StyledLink并加以利用-传递给该组件的所有其他道具都将自动传递给function ,但是在这种情况下,您需要解构prop才能使用它)

import React from "react";
import StyledLink from "./StyledLink";

export default () => (
  <nav className="container">
    <StyledLink primary link="/">Home</StyledLink>
    <StyledLink danger link="/about">About</StyledLink>
    <StyledLink link="/portfolio">Portfolio</StyledLink>
  </nav>
);

答案 1 :(得分:0)

链接并没有真正起作用(或者我不明白您想显示什么),但是从错误消息看来,您应该像这样传递className styled(<Component className={your source for classnames} />)

答案 2 :(得分:0)

对于共享组件,最好使用forwardRef,也可以只传递props:

import React from 'react'
import styled from 'styled-components'

function MainComponent() {
  return (
    <LoadingStyled />
  )
})

const LoadingStyled = styled(LoadingComponent)`
  margin-top: 40px;
`

import React, { forwardRef } from 'react'

export const LoadingComponent = forwardRef((props, ref) => {
  return (
    <div {...props}>
      I got all props and styles, yeeeee!
    </div>
  )
})

不带有forwardRef的替代项。

import React from 'react'

export const LoadingComponent = (props) => {
  return (
    <div {...props}>
      I got all props and styles, yeeeee!
    </div>
  )
}

答案 3 :(得分:0)

我有类似的情况,我需要使用由styled-component创建的组件,并将css属性传递给该组件。希望这会有所帮助!

主要组件(在此处定义CSS属性)

import Wrapper from 'components/Wrapper'

const CustomWrapper = styled(Wrapper)`
  &:hover {
    background-color: blue;  // defining css property I want to pass down
  }
`;
...

render() {
  return (
    ... <CustomWrapper />  // using my CustomWrapper component made from 'styled-component'
  )
}
`;

Wrapper.js-功能组件(在此处使用定义的CSS)

const Wrapper = props => {
  const { className } = props;  // see how className is destructed and used below

  return (
    <div className={className}>  // 'className' is used here
      {YOUR_CONTENT}
    </div>  
  )
}