web-dev-qa-db-ja.com

styled-componentsは、React component(Component)

Styled-componentを使用してCodeSandboxにアプリがあります。以下のURLを参照してください 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は期待どおりにレンダリングされません。なぜ私がこの問題を抱えているのか誰にも分かりますか?上記のURLをご覧ください。

ありがとう

8
Danny Kim

基本的に、_this.props.className_または_props.className_を渡すか、_styled-components_によって生成された分解されたclassNameを渡して、スタイルを設定するコンポーネントに手動で適用する必要があります。それ以外の場合は、classNameを何にも適用しないため、スタイルの変更は表示されません。

作業例:

Edit Styled Component

components/LinkComponent.js(この_functional component_は、styled()およびclassNameによって渡された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;
_

components/StyledLink.js(上記の_functional component_をインポートし、styled()に渡します-また、 スタイル付きテーマstyled()要素を更新する)

_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>
);
_
8
Matt Carlotta

リンクは実際には機能しません(または表示したい内容がわかりません)が、エラーメッセージからは、このstyled(<Component className={your source for classnames} />)のようなclassNameを渡す必要があるように見えます

0
Nikita Neganov

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>  
  )
}
0
Sang Yun Park

共有コンポーネントの場合は、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>
  )
}
0
RTW