styled-components

371 阅读1分钟

1. styled-components:

目的: 增强react中css的表现
优点:
    避免标签中class name属性冲突;
    样式移除更加容易;
    动态修改css样式,不用定义不同的class name来定义不用样式;
    无痛维护;
    自动提供属性前缀,解决部分浏览器兼容问题;
    
在 render 方法之外定义 styled component 很重要, 不然 styled component 会在每个渲染过程中重新创建. 这将阻止缓存生效并且大大降低了渲染速度,所以尽量避免这种情况.

2. styled-components安装:

  • npm install --save styled-components

3. 标记模板字符串设置样式

创建附加样式的react组件,移除了组件与样式之间的映射

   // 创建一个 Title 组件,它将渲染一个附加了样式的 <h1> 标签
  const Title = styled.h1`
    font-size: 1.5em;
    text-align: center;
    color: palevioletred;
  `;

  // 就像使用常规 React 组件一样使用 Title 和 Wrapper 
  render(
    <Wrapper>
      <Title>
        Hello World!
      </Title>
    </Wrapper>
  );

4. 基于属性适配

props以插值的方式传递给组件已控制样式的显示

const Button = styled.button`
  background: ${props => props.primary ? "palevioletred" : "white"};
  color: ${props => props.inputColor : "palevioletred"};

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

5. 样式的继承

// 上一节创建的没有插值的 Button 组件
const Button = styled.button`
  color: palevioletred;
  font-size: 1em;
  margin: 1em;
  padding: 0.25em 1em;
  border: 2px solid palevioletred;
  border-radius: 3px;
`;

// 一个继承 Button 的新组件, 重载了一部分样式
const TomatoButton = styled(Button)`
  color: tomato;
  border-color: tomato;
`;

6. 伪类,伪元素嵌套的书写

const Thing = styled.button`
  color: blue;
  ::before {
    content: '????';
  }
  :hover {
    color: red;
  }
  & ~ & {
    background: tomato;
  }

  & + & {
    background: lime; //
  }
`

render(
  <Thing>Hello world!</Thing>
)

7. 添加额外属性 调用.attrs()方法

  const Input = styled.input.attrs({
  type: "password",
  margin: props => props.size || "1em",
  padding: props => props.size || "1em"
})`
  color: palevioletred;
  font-size: 1em;
  border: 2px solid palevioletred;
  border-radius: 3px;
  margin: ${props => props.margin};
  padding: ${props => props.padding};
`;

8. 动画

const rotate = keyframes`
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
`;
const Rotate = styled.div`
  display: inline-block;
  animation: ${rotate} 2s linear infinite;
  padding: 2rem 1rem;
  font-size: 1.2rem;
`;

**9. **