javascript - React — 使用样式化组件传递 props

标签 javascript reactjs styled-components

我刚刚阅读了 styled-components documentation以下是错误的,它会影响渲染时间。如果是这样,我该如何重构代码并使用所需的 Prop 来创建动态样式?

提前谢谢你。

标签组件

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

const Tab = ({ onClick, isSelected, children }) => {
    const TabWrapper = styled.li`
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 100px;
    margin: 1px;
    font-size: 3em;
    color: ${props => (isSelected ? `white` : `black`)};
    background-color: ${props => (isSelected ? `black` : `#C4C4C4`)};
    cursor: ${props => (isSelected ? 'default' : `pointer`)};
`

    return <TabWrapper onClick={onClick}>{children}</TabWrapper>
}


export default Tab

最佳答案

我相信文档所说的是您应该避免在渲染组件中包含您的样式:

这样做

const StyledWrapper = styled.div`
  /* ... */
`

const Wrapper = ({ message }) => {
  return <StyledWrapper>{message}</StyledWrapper>
}

取而代之

const Wrapper = ({ message }) => {
  // WARNING: THIS IS VERY VERY BAD AND SLOW, DO NOT DO THIS!!!
  const StyledWrapper = styled.div`
    /* ... */
  `

  return <StyledWrapper>{message}</StyledWrapper>
}

因为发生的事情是当组件的 Props 发生变化时,组件将重新渲染并且样式将重新生成。因此,将其分开是有意义的。

因此,如果您进一步阅读根据 Prop 进行调整部分,他们会解释这一点:

const Button = styled.button`
  /* Adapt the colours based on primary prop */
  background: ${props => props.primary ? "palevioletred" : "white"};
  color: ${props => props.primary ? "white" : "palevioletred"};

  font-size: 1em;
  margin: 1em;
  padding: 0.25em 1em;
  border: 2px solid palevioletred;
  border-radius: 3px;
`;

// class X extends React.Component {
//  ...

render(
  <div>
    <Button>Normal</Button>
    <Button primary>Primary</Button>
  </div>
);

// }

这是有效的,因为当你在类 X 中使用 Button 组件时,它会知道类 X 的属性,而无需你告诉它任何东西。

对于您的场景,我想解决方案很简单:

const TabWrapper = styled.li`
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 100px;
  margin: 1px;
  font-size: 3em;
  color: ${props => (props.isSelected ? `white` : `black`)};
  background-color: ${props => (props.isSelected ? `black` : `#C4C4C4`)};
  cursor: ${props => (props.isSelected ? 'default' : `pointer`)};
`;

const Tab = ({ onClick, isSelected, children }) => {
  return <TabWrapper onClick={onClick}>{children}</TabWrapper>
}

const X = <Tab onClick={() => console.log('clicked')} isSelected>Some Children</Tab>

我根本没有测试过这个,所以请随意尝试一下,让我知道它是否适合你或任何适合你的东西!

关于javascript - React — 使用样式化组件传递 props,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52321539/

相关文章:

reactjs - Typescript Webpack React 编译导致只读文件系统错误,但开发服务器工作正常

javascript - 在没有 ASP.NET Ajax 的情况下回发后显示模式

javascript - 如何在 chrome 中检查系统时间格式 - 在 JavaScript 中是 12 小时还是 24 小时?

javascript - 一组 CSS 和 JS 文件在 HTML 中导入?

unit-testing - React.js 和 Jasmine Spies

reactjs - 如何将依赖于样式组件的 React 组件库提供给另一个也具有样式组件依赖项的库?

javascript - 弹出窗口的动态高度取决于内容,可能吗?

javascript - 如何在 React 中解压字符串

reactjs - 从 styled-component 推断 Prop 接口(interface)

javascript - 测试期间未为子样式组件提供正确的主题