
[英]How to properly use ref with a React class component and styled-components?
[英]How to use styled-components in react component
使用styled-components
新手。 我想知道它的用途是什么? 样式化后我应该如何实现组件生命周期方法? 为简单起见,我删除了所有其他样式。
import styled from 'styled-components';
const Button = styled.button`
background-color: 'green'
`
export default Button;
我想知道如何进一步处理这个Button
组件?
传统上我们可以声明一个基于类的组件并实现一些生命周期方法,但是现在有了这个styled-components
,我不确定如何将它们组合在一起,因为它们实际上是单个Button
组件?
更新:
Button.js
的完整源代码。 通过使用以下代码,所有 styles 都将消失,我无法理解问题
import React from 'react';
import styled from 'styled-components';
// import Button from 'react-bootstrap/Button';
import color from '../config/color';
const Button = ({ children, onPress }) => (
<button type="button" onPress={onPress}>{children}</button>
);
const StyledButton = styled(Button)`
width: 12rem;
height: 54px;
font-size: 1rem;
background-color: ${(props) => {
if (props.inverted) return 'white';
if (props.disabled) return color.disabled;
return (props.color || color.primary);
}};
color: ${(props) => {
if (props.disabled) return color.disabledText;
if (props.inverted) return (props.color || color.primary);
return 'white';
}};
border:${(props) => (props.inverted ? `2px solid ${props.color || color.primary}` : 'none')};
border-radius: 60px;
&:hover {
filter: ${(props) => (props.inverted || props.disabled ? 'none' : 'brightness(95%)')}
}
`;
export default StyledButton;
为了设置自定义反应组件的样式,您可以将自定义组件名称作为参数传递给styled
。 根据文档:
只要将传递的 className 属性附加到 DOM 元素,样式化方法就可以在您自己或任何第三方组件上完美运行。
import React from 'react';
import styled from 'styled-components';
// import Button from 'react-bootstrap/Button';
import color from '../config/color';
const Button = ({ children, className onPress }) => (
<button type="button" className={className} onPress={onPress}>{children}</button>
);
const StyledButton = styled(Button)`
width: 12rem;
height: 54px;
font-size: 1rem;
background-color: ${(props) => {
if (props.inverted) return 'white';
if (props.disabled) return color.disabled;
return (props.color || color.primary);
}};
color: ${(props) => {
if (props.disabled) return color.disabledText;
if (props.inverted) return (props.color || color.primary);
return 'white';
}};
border:${(props) => (props.inverted ? `2px solid ${props.color || color.primary}` : 'none')};
border-radius: 60px;
&:hover {
filter: ${(props) => (props.inverted || props.disabled ? 'none' : 'brightness(95%)')}
}
`;
export default StyledButton;
阅读styled-component documentation
,了解有关设置任何组件样式的更多详细信息
让我们重命名样式按钮组件,以减少 2 个类似命名的组件之间的混淆。
样式按钮.tsx:
import styled from 'styled-components';
const StyledButton = styled.button`
background-color: 'green'
`
export default StyledButton;
当您将样式化按钮组件导入Button
组件时,您实际上可以像使用传统 HTML <button>
元素时通常使用的方式使用它,因为它的道具在样式化组件上也被公开和可用.
按钮.tsx:
import StyledButton from './StyledButton'
class Button extends React.Component {
componentDidMount() {
const { someProps, otherProps } = this.props;
// some lifecycle logic
}
handleClick() {
// do the rest
}
render() {
return <StyledButton onClick={() = this.handleClick()} />;
}
}
如果您愿意,您甚至可以将属性从父Button
组件传递给子StyledButton
组件。 这将允许您自定义它。
render() {
const { color } = this.props;
return <StyledButton background={color} onClick={() = this.handleClick()} />;
}
在您的 StyledButton 组件上,您只需要进行以下更改:
const StyledButton = styled.button`
background-color: ${({ color }) => color || 'green'}
`
缺少的其他答案是为自定义组件(如Button
)设置样式,您必须传递一个className
属性。
样式是通过className
属性注入的。
const ButtonDefaultStyle = styled.button`
width: 5rem;
`;
const Button = ({ className, children, onPress }) => (
<ButtonDefaultStyle className={className} type="button" onPress={onPress}>
{children}
</ButtonDefaultStyle>
);
export default Button;
然后可以应用styles:
import Button from './Button.js'
// Will override width: 5rem;
const StyledButton = styled(Button)`
width: 12rem;
`;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.