Skip to content

styled-components #12

Description

@isNeilLin

概览

  • props调整组件样式
  • attrs封装组件属性
  • extend或者styled(Component)实现组件样式继承
  • 使用innerRef代替ref
  • ThemeProvider helper实现主题功能
  • keyframes helper实现动画界面
  • injectGlobal设置全局样式

基础用法

importReact,{Component}from'react';importstyledfrom'styled-components';constTitle=styled.h1` font-size: 18px; text-align: center; color: palevioletred;`constWrapper=styled.div` padding: 24px;`exportdefaultclassStyledComponentsextendsComponent{render(){return(<Wrapper><Title>This is my first styled-component!</Title></Wrapper>)}}

props调整组件样式

importReact,{Component}from'react';importstyledfrom'styled-components';constButton=styled.button` 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;`exportdefaultclassStyledComponentsextendsComponent{render(){return(<Wrapper><Button>Normal</Button><Buttonprimary>Primary</Button></Wrapper>)}}

attrs封装组件属性

importReact,{Component}from'react';importstyledfrom'styled-components';constPassword=styled.input.attrs({// define static propstype: 'password',// define dynamic onesmargin: 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};`exportdefaultclassStyledComponentsextendsComponent{render(){return(<Wrapper><Passwordplaceholder="A small text input"size="1em"/><Passwordplaceholder="A bigger text input"size="2em"/></Wrapper>)}}

extend或者styled(Component)实现组件样式继承

importReact,{Component}from'react';importstyledfrom'styled-components';constButton=styled.button` 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;`// extending styles// way 1constTomatoButton=Button.extend` color: tomato; border-color: tomato;`// way 2 better wayconstAnotherTomatoButton=styled(Button)`color: tomato;border-color: tomato;`exportdefaultclassStyledComponentsextendsComponent{render(){return(<Wrapper><Button>Normal</Button><TomatoButton>TomatoButton</TomatoButton><AnotherTomatoButton>AnotherTomatoButton</AnotherTomatoButton></Wrapper>)}}

使用innerRef代替ref

importReact,{Component}from'react';importstyledfrom'styled-components';constInnerRefInput=styled.input` padding: 0.5em; margin: 0.5em; color: palevioletred; background: papayawhip; border: none; border-radius: 3px;`exportdefaultclassStyledComponentsextendsComponent{render(){return(<Wrapper><InnerRefInputplaceholder="hover here"innerRef={x=>{this.input=x}}onMouseEnter={()=>this.input.focus()}/></Wrapper>)}}

ThemeProvider helper实现主题功能

importReact,{Component}from'react';importstyled,{ThemeProvider}from'styled-components';constThemeButton=styled.button` font-size: 1em; margin: 1em; padding: 0.25em 1em; border-radius: 3px;  color: ${props=>props.theme.main}; border: 2px solid ${props=>props.theme.main};`ThemeButton.defaultProps={theme: {main: 'palevioletred'}}consttheme={main: 'mediumseagreen'}exportdefaultclassStyledComponentsextendsComponent{render(){return(<Wrapper><ThemeButton>Normal</ThemeButton><ThemeProvidertheme={theme}><div><ThemeButton>Themed</ThemeButton><br/></div></ThemeProvider></Wrapper>)}}

非styled-components组件使用theme(主题)

import{withTheme}from'styled-components'classMyComponentextendsReact.Component{render(){console.log('Current theme: ',this.props.theme);// ...}}exportdefaultwithTheme(MyComponent)

keyframes helper实现动画界面

importReact,{Component}from'react';importstyled,{keyframes}from'styled-components';constrotate360=keyframes` from { transform: rotate(0deg); } to { transform: rotate(360deg); }`constRotate=styled.div` padding: 2rem 1rem; font-size: 1.2rem; display: inline-block; animation: ${rotate360} 2s linear infinite;`exportdefaultclassStyledComponentsextendsComponent{render(){return(<Wrapper><Rotate>😊😊😊</Rotate></Wrapper>)}}

injectGlobal设置全局样式

import{injectGlobal}from'styled-components';injectGlobal` @font-face { font-family: 'Operator Mono'; src: url('../fonts/Operator-Mono.ttf'); } body { margin: 0; }`;

Metadata

Metadata

Assignees

No one assigned

    Labels

    CSSCSS或预编译样式相关

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions