我想为样式按钮添加动画和特定的高度。事实是,我的StyledButton
是一个包装器,可以根据样式为React Semantic UI Buttons的type
道具渲染多个预样式按钮之一。
在此处查看带有复制的CodeSandbox:
https://codesandbox.io/embed/practical-haibt-oz9sl
问题是它确实从ActionButton
获取样式,但是它不应用我在const AnimatedButton = styled(StyledButton)
上放置的任何样式。
但是,如果我在没有包装器的情况下尝试相同的操作,则直接通过导入BaseButton
并创建一个AnimatedBaseButton
来完成此操作,但是
删除了具有type
道具并返回一个预先设置样式的按钮的模块性。
我在这里和google / github上进行了搜索,但是没有反映这一点的问题。我知道我可以在animation
上添加一个StyledButton
属性并传递它,但是使用真实的代码库是不可能的。
谢谢!
EDIT:添加了一个Codesandbox而不是代码示例。
答案 0 :(得分:3)
在StyledButton.js
中:
render() {
const {
content,
icon,
iconPosition,
onClick,
type,
...otherProps // take base props passed through wrapper
} = this.props;
// ...
return (
<ButtonToDisplay
{...otherProps} // spread it firstly here so below props can override
onClick={onClick}
content={content}
/>
);
}
如您所见,我们用来为组件设置样式的styled(comp)''
语法实际上是引擎盖下的HOC组件,它接收一个组件并返回另一个组件。
因此,当您制作一个在styled component
和real component
之间截取的包装器时,您需要允许库生成的props
通过该包装器。
答案 1 :(得分:0)
您在破坏...
的过程中忘记了this.props
(扩展运算符)
export default class StyledButton extends React.Component {
render() {
// added ... (spread operator)
const {type, ...additionalProps} = this.props
if (type === 'normal') return <NormalButton {...aditionalProps} />
else if (type === 'action') return <ActionButton {...aditionalProps} />
}
}
这里发生的是styled-component
传递了style
道具中的样式,但是如果没有传播运算符,您就不会传递它,而只是得到了一个名为{ {1}}。