带样式的组件动态标签名称
Styled Component dynamic tag name
我想做一个动态组件。 (动态 TAG 将是一个样式组件 -> 情感)
const Dynamic = ({ tag: Tag, children, ...rest }) =>
<Tag {...rest}>
{ children }
</Tag>
该组件将是样式化的组件,例如:
const Column = styled(div)({ color: 'red' })
const Row = styled(span)({ color: 'yellow' })
这看起来不错,工作正常,BUUUUUT:
当我尝试在另一个 DynamicComponent 中使用 DynamicComponent 时:
<DynamicComponent tag={Row}>
{
mapOver.map(item=>
<DynamicComponent tag={Column}/>
)
}
</DynamicComponent>
然后出于某种原因,动态子项将使用动态父项的样式。
有什么我遗漏的吗?
P.S.:
如果不使用动态样式,我会这样做:
<Row>
<Column/>
</Row>
然后正确应用样式、类名、样式标签。
为了更清楚一点:
如您所见,DynamicComponent 将使用父级的样式、类名、样式标签...(不是我所期望的行为)
styled-components 的用法存在误解,因为标签的用途是 HTML 标签(输入、div 等)。最好的方法是分别定义一个 StyledRow 和一个 StyledColumn,并以适当的名称使用它们。这也有助于使您的代码更具可读性。
下面是为 styled-component 创建动态标签名称的示例:
// All headings use the same styled-component "Heading" function
const StyledHeading = styled.div`
font-size: ${({level}) => 4/level }em; // <- dynamic font size
font-weight: 300;
margin: 0;
`
// the trick here is the "as={...}" to create dynamic tag name
const Heading = ({level = 1, children}) =>
<StyledHeading as={`h${level}`} level={level}>
{children}
</StyledHeading>
ReactDOM.render([
<Heading>Hello, world!</Heading>,
<Heading level={2}>Title 2</Heading>,
<Heading level={3}>Title 3</Heading>
] ,document.body
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/styled-components@4.4.1/dist/styled-components.min.js"></script>
参考:
我想做一个动态组件。 (动态 TAG 将是一个样式组件 -> 情感)
const Dynamic = ({ tag: Tag, children, ...rest }) =>
<Tag {...rest}>
{ children }
</Tag>
该组件将是样式化的组件,例如:
const Column = styled(div)({ color: 'red' })
const Row = styled(span)({ color: 'yellow' })
这看起来不错,工作正常,BUUUUUT:
当我尝试在另一个 DynamicComponent 中使用 DynamicComponent 时:
<DynamicComponent tag={Row}>
{
mapOver.map(item=>
<DynamicComponent tag={Column}/>
)
}
</DynamicComponent>
然后出于某种原因,动态子项将使用动态父项的样式。
有什么我遗漏的吗?
P.S.:
如果不使用动态样式,我会这样做:
<Row>
<Column/>
</Row>
然后正确应用样式、类名、样式标签。
为了更清楚一点:
如您所见,DynamicComponent 将使用父级的样式、类名、样式标签...(不是我所期望的行为)
styled-components 的用法存在误解,因为标签的用途是 HTML 标签(输入、div 等)。最好的方法是分别定义一个 StyledRow 和一个 StyledColumn,并以适当的名称使用它们。这也有助于使您的代码更具可读性。
下面是为 styled-component 创建动态标签名称的示例:
// All headings use the same styled-component "Heading" function
const StyledHeading = styled.div`
font-size: ${({level}) => 4/level }em; // <- dynamic font size
font-weight: 300;
margin: 0;
`
// the trick here is the "as={...}" to create dynamic tag name
const Heading = ({level = 1, children}) =>
<StyledHeading as={`h${level}`} level={level}>
{children}
</StyledHeading>
ReactDOM.render([
<Heading>Hello, world!</Heading>,
<Heading level={2}>Title 2</Heading>,
<Heading level={3}>Title 3</Heading>
] ,document.body
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/styled-components@4.4.1/dist/styled-components.min.js"></script>