2017-06-26 6 views
1

Ich habe eine externe Select reagieren Komponente, die wiederum li Tags. Ich möchte alle li mit Ausnahme der ersten mit margin-left von 20px stylen;Zugriff auf innere Elemente von externen Komponenten

Unten ist der Code:

const StyledSelect = styled(Select)` 
    li { 
    margin-left: 20px; 
    } 
` 

Jede Idee, warum dies nicht oder eine andere Art und Weise arbeiten, dies zu tun?

+0

Ihr Code wird alle li style Elemente innerhalb der Select-Komponente. Wenn Sie die erste li ausschließen möchten, müssen Sie eine CSS-Regel/Selektor hinzufügen. Siehe [diese Frage] (https://stackoverflow.com/questions/10033299/is-there-any-way-to-specify-a-css-shorthand-for-all-elements-except-the-first-l) – devboell

+0

Ihre Frage ist ein wenig unklar. Ist der 'margin-left: 20px;' richtig angewendet, und fragen Sie sich, wie man das erste li ausschließt? Oder wird dein Stil überhaupt nicht angewendet? – devboell

Antwort

5

Dies sollte funktionieren, aber abhängig davon, wie die externen Select die Stile angewendet haben, könnten sie eine höhere Spezifität haben und überschreiben immer noch die Stile, die Sie angewendet haben. (Siehe this article für eine Grundierung auf, wie Spezifität funktioniert)

Ohne zu wissen, welche Select Komponente Sie verwenden es ein bisschen schwer zu debuggen, aber ich nehme an, es Inline-Styles verwendet (dh die style prop) die eine sehr hohe Spezifität und würde somit Ihre angewandten Stile überschreiben.

Es gibt zwei Möglichkeiten, die Spezifität Ihrer Stile zu ändern, die beide nicht empfohlen werden, wenn die externe Komponente keine Inline-Stile verwendet.

Der erste Weg Spezifität zu stoßen ist !important zu verwenden:

const StyledSelect = styled(Select)` 
    li { 
    margin-left: 20px!important; 
    } 
` 

In einigen Fällen, die, und es ist auch mühsam möglicherweise nicht ausreichen recht, wenn Sie mehr Eigenschaften haben Sie mit Gewalt außer Kraft setzen müssen. Ein besserer Weg, aber noch nicht zu empfehlen Art und Weise ist es die Klasse Hack zu verwenden: (die Et-Zeichen bemerken)

const StyledSelect = styled(Select)` 
    &&& li { 
    margin-left: 20px; 
    } 
` 

Was styled-components tut hier ist jede dieser & mit der generierten Klasse zu ersetzen, die resultierenden CSS Bedeutung wird etwa wie folgt aussehen:

.sc-asdf123.sc-asdf123.sc-asdf123 li { 
    margin-left: 20px; 
} 

Diese drei Klassen stoßen massiv die Spezifität der Stile innerhalb des Blocks. Das sollte den Trick machen!


Um das erste Kind nicht stylen Sie die first-child zusammen mit dem not Pseudo-Selektor verwenden können:

const StyledSelect = styled(Select)` 
    &&& li:not(:first-child) { 
    margin-left: 20px; 
    } 
` 
+0

Das Vorschlagen eines Hacks oder die Verwendung von Spezifität ist keine gute Richtung, um jemanden anzudeuten, imho. – klaasman

+0

Wenn die externe Komponente Inline-Stile verwendet, von denen ich annehme, dass sie andernfalls überschrieben würden, gibt es keine Möglichkeit, Ihre Stile anzuwenden, ohne ihnen eine höhere Spezifität zu geben als die Inline-Stile und die einzige Möglichkeit Das ist leider mit Hacks. Lassen Sie mich meine Antwort aktualisieren, um zu erklären, warum ich das für notwendig halte, eine Sekunde! – mxstbr

+0

Ich habe die Antwort aktualisiert, um meine Annahmen zu reflektieren (die externe Komponente verwendet Inline-Stile) und erklären, warum Hacks notwendig sind, aber auch, dass sie nicht verwendet werden sollten, wenn nicht unbedingt notwendig. Macht meine Antwort jetzt mehr Sinn für Sie? – mxstbr

Verwandte Themen