2017-02-13 6 views
3

Wenn ich einen Knopf will aber nur den Präsentations-Teil davon, wenn ich also tun:Wie erreicht man tag agnostic gestylte Komponenten?

import styled from 'styled-components' 

const Button = styled.button` 
    color: red; 
    text-align: center; 
` 

ich gezwungen bin, einen button Tag zu machen, aber was ist, wenn semantisch ich einen Anker brauche?

Antwort

1

Da wir nur JavaScript verwenden, warum nicht eine Funktion verwenden?

const myButtonStyle = (styled, tag) => { 
    return styled[tag]` 
    color: red; 
    text-align: center; 
    ` 
} 

const Button = myButtonStyle(styled, 'button') 
+1

Da diese Art und Weise habe ich noch gezwungen bin, zu tun: 'const Taste = myButtonStyle (Stil, 'Taste')' und 'const = Linkbutton myButtonStyle (gestylt,‚a ') 'wenn aus Sicht der ** Präsentation ** das gleiche ist! – cl0udw4lk3r

2

Sie können es auch mit einem Anker-Tag verwenden, es gibt nichts, was Sie daran hindert.

import styled from 'styled-components' 

const Button = styled.a` 
    color: red; 
    text-align: center; 
` 

Wenn Sie beide behalten möchten, können Sie die Stile wiederverwenden, indem sie herausziehen:

import styled from 'styled-components' 

const styles = ` 
    color: red; 
    text-align: center; 
` 

const Button = styled.button` 
    ${styles} 
` 

const LinkButton = styled.a` 
    ${styles} 
` 
+1

Ja, aber warum sollte ich eine brandneue "stilfokussierte" Komponente nur für ein anderes * semantisches * Tag erstellen? – cl0udw4lk3r

+0

Whoops, Entschuldigung für die super späte Antwort. Wenn Sie die API dafür nicht mögen, spricht @ typeoneerrors Antwort über die 'withComponent', die nützlich sein kann: https://Stackoverflow.com/a/47982898/1501871 – siddharthkp

+0

Wenn Sie Frage ist mehr über die Bibliotheksentscheidung, die die Leute von styled-components getroffen haben, sie wollten es zu einer Konvention machen, um die Praxis durchzusetzen, "Stil" von "Logik" zu trennen. Eine gute Möglichkeit, dies zu tun, besteht darin, jedes Mal eine neue _style_-Komponente zu erstellen. @mxstbr redet hier ein wenig mehr darüber: https://www.youtube.com/watch?v=bIK2NwoK9xk – siddharthkp

2

Ich habe die gleiche Frage auf Stil-Komponenten issue tracker gestellt: https://github.com/styled-components/styled-components/issues/494

und die aktuelle „Lösung“, die ich gefunden habe, ist:

// agnosticStyled.js 
import React from 'react' 
import styled from 'styled-components' 

export default styled(
    ({tag = 'div', children, ...props}) => 
    React.createElement(tag, props, children) 
) 

und dann, wenn Sie es brauchen:

import React from 'react' 
import styled from './agnosticStyled' 

const Button = styled` 
    color: palevioletred; 
    text-transform: uppercase; 
` 

export default Button 

Und schließlich:

import React from 'react' 
import Button from './Button' 

const Component =() => 
    <div> 
    <Button>button</Button> 
    <Button tag="button">button</Button> 
    <Button tag="a" href="https://google.com">button</Button> 
    </div> 

export default Component 

Hier ein voll funktionierendes Beispiel: https://codesandbox.io/s/6881pjMLQ

+0

Mit diesem Ansatz, wie erhalten Sie den Verweis des Elements? – cusX

+0

Weiß nicht, ich werde bald experimentieren! Was ist Ihr Anwendungsfall, insbesondere? – cl0udw4lk3r

+0

Okay, lass es mich wissen. Für meinen Anwendungsfall erstelle ich eine Schaltfläche, bei der es sich um eine "Link" -Schaltfläche oder eine Ankerschaltfläche oder eine "Schaltflächenschaltfläche" handeln kann. Dann müsste ich die "Ref" der Schaltfläche greifen, so dass ich es als ein Ankerelement für meinen Dialog verwenden kann, aus dem Popup hervorgeht. Grundsätzlich für die Animation. – cusX

0

Stil-Komponenten bietet withComponent, die für Fälle nützlich sein werden, wo Sie eine eine andere verwenden möchten Tag mit einer Komponente. Dies ähnelt der Antwort von @ siddharthkp in der Funktion, verwendet aber die API.

Beispiel aus der Dokumentation:

const Button = styled.button` 
    color: palevioletred; 
    font-size: 1em; 
    margin: 1em; 
    padding: 0.25em 1em; 
    border: 2px solid palevioletred; 
    border-radius: 3px; 
`; 

// We're replacing the <button> tag with an <a> tag, but reuse all the same styles 
const Link = Button.withComponent('a') 

// Use .withComponent together with .extend to both change the tag and use additional styles 
const TomatoLink = Link.extend` 
    color: tomato; 
    border-color: tomato; 
`; 

render(
    <div> 
    <Button>Normal Button</Button> 
    <Link>Normal Link</Link> 
    <TomatoLink>Tomato Link</TomatoLink> 
    </div> 
);