2016-11-29 15 views
13

Obecnie tworzę dużą aplikację React. Css, nigdy nie było moją mocną stroną. Ale teraz CSS ma style sass/cssNext/inline z React. Używam BEM z sass, ale jak moje inne aplikacje stały się ogromne, nawet to zaczyna się załamywać. Szczególnie, gdy miałeś możliwość "odskubywania" lub "motywowania" stron poza głównymi schematami kolorów itp.Architektura CSS z React, która może być również tematyczna.

więc - czy ktoś może wskazać mi sprawdzony sposób tworzenia css z reakcją, która może skalowują się bardzo dobrze i pozwalają na tworzenie motywów, gdy ludzie chcą pożyczyć moje komponenty. Na przykład:

<MyComponent /> 
// this component has its styles but lets say Joe Schmoe wants be import 
// it? But, Joe wants to overlay his custom styles? 
// Is there a new paradigm that allows for an overlay or reskin within the component? 

A nawet pomysł, że cała aplikacja może zostać zmieniona w czasie. Wiem, że to bardzo podstawowe pytanie, ale ilekroć buduję projekty, moje punkty bólu również wydają się być CSS - więc chcę wiedzieć, co naprawdę działa.

Odpowiedz

20

To był do niedawna nie rozwiązany problem w świecie React.

Jestem jednym z opiekunów ElementalUI, biblioteki komponentów React, a my próbowaliśmy różnych stylów w ciągu ostatnich 6-12 miesięcy. (!) Wy nazywacie to, próbowaliśmy tego. (Opowiadałem o moich doświadczeniach z najpopularniejszymi bibliotekami podczas mojego ReactNL keynote i tam, gdzie się podziały)

Problem polega na tym, że żadna z obecnych bibliotek stylów nie ma wbudowanej obsługi motywów. Możesz to zrobić z większością z nich w bardzo hacky, nie przyjazny dla użytkownika sposób, ale to nie jest to czego chcesz, kiedy dystrybuujesz komponent, prawda?


Dlatego zbudowaliśmy styled-components. styled-components ma wiele interesujących właściwości, a jednym z nich jest to, że motywy są bezpośrednio wbudowane w bibliotekę, co czyni go idealnym wyborem do budowania komponentów do dystrybucji!

Oto krótkie wyjaśnienie, chociaż zachęcam do przejrzenia naszego documentation, który wyjaśnia wszystko!

To właśnie podstawowe użycie styled-components wygląda następująco:

import React from 'react'; 
import styled from 'styled-components'; 

// Create a <Wrapper> react component that renders a <section> with 
// some padding and a papayawhip background 
const Wrapper = styled.section` 
    padding: 4em; 
    background: papayawhip; 
`; 

Ta zmienna, Wrapper, teraz React komponenty można uczynić:

// Use them like any other React component – except they're styled! 
<Wrapper> 
    <Title>Hello World, this is my first styled component!</Title> 
</Wrapper> 

What this looks like rendered

(jeśli klikasz na obraz, który otrzymasz na żywo)

Po przekazaniu funkcji interpolowanej do oznakowanego szablonu literału przekazujemy właściwości przekazane do komponentu. Oznacza to, że można dostosować do rekwizytów:

import styled from 'styled-components'; 

const Button = styled.button` 
    /* Adapt the colors based on primary prop */ 
    background: ${props => props.primary ? 'palevioletred' : 'white'}; 
    color: ${props => props.primary ? 'white' : 'palevioletred'}; 

    font-size: 1em; 
    margin: 1em; 
    padding: 0.25em 1em; 
    border: 2px solid palevioletred; 
    border-radius: 3px; 
`; 

Tutaj stworzyliśmy komponent Button że można zrobić primary jak każdy inny komponent React:

<Button>Normal</Button> 
<Button primary>Primary</Button> 

A normal button and a bigger primary button

Teraz przychodzi aspekt motywacyjny. Eksportujemy komponent o nazwie ThemeProvider że można zdać theme do i owinąć swoją aplikację (lub jego części aplikacji) w:

import { ThemeProvider } from 'styled-components'; 

const theme = { 
    main: 'mediumseagreen', 
}; 

ReactDOM.render(
    <ThemeProvider theme={theme}> 
    <MyApp /> 
    </ThemeProvider>, 
    myElem 
); 

Teraz każdy stylizowany składnika w tym ThemeProvider, bez względu na to, jak głęboko dzięki kontekście będzie zdobądź ten theme wstrzyknięty do rekwizytów.

To co themable Button wyglądałby następująco:

import styled from 'styled-components'; 

const Button = styled.button` 
    /* Color the background and border with theme.main */ 
    background: ${props => props.theme.main}; 
    border: 2px solid ${props => props.theme.main}; 

    /* …more styles here… */ 
`; 

Teraz twój Button zajmie theme robi minęło i zmienić jego stylistyka oparta na tym! (można również podać wartości domyślne za pomocą defaultProps)

To jest sedno styled-components i jak pomaga w budowaniu komponentów do dystrybucji!

Mamy obecnie WIP doc about writing third-party component libraries, który zachęcam do wypróbowania, i oczywiście normalna dokumentacja to również dobra lektura. Próbowaliśmy objąć wszystkie podstawy, więc jeśli zauważysz coś, czego nie lubisz lub coś, czego uważasz, że brakuje, natychmiast daj nam znać, a my porozmawiamy!

Jeśli masz inne pytania na temat styled-components, odpowiedz tutaj lub skontaktuj się z nami na Twitterze. (@mxstbr)

+0

W jaki sposób stylizujesz swój własny, niestandardowy komponent? Po prostu użyj przekładki div? – MoeSattler

+0

Tak, używam ton stylowych komponentów na większy komponent. Coś takiego: const Btn = stylizowany.przycisk' style: tutaj; ' Przycisk const = (rekwizyty) => { powrotu ( {props.text} ); } – mxstbr

+0

w jaki sposób adresujesz rzeczywiste sprzężenie stylów w komponencie. Na przykład, powiedzmy, że wszystkie moje guziki mają teraz promień 5 pikseli, muszę przejść do nich wszystkich i ręcznie je zmienić. Czy też źle czytam twój post? Lub zapytania o media, jak z nich korzystasz? –

1

Nie wiem, jaki jest najlepszy sposób. Myślę, że to bardziej jak osobiste preferencje. Po prostu udostępnię narzędzia, z których korzystam. Używam css-modules z postcss.

css-modules daje możliwość utworzenia identyfikatora o zasięgu lokalnym z globalną unikalną nazwą dla każdej klasy CSS, a także umożliwia modułowe i wielokrotnego użytku CSS! Można również użyć pliku postcss-modules-values, aby utworzyć plik ustawień globalnych zawierający wszystkie zmienne ustawień. Aby zmienić motyw swojej witryny.

Oto, w jaki sposób strukturę elementów. Każdy mój komponent będzie miał jeden plik css, który jest bardzo łatwy w utrzymaniu lub wprowadzeniu zmian.

enter image description here

Oto kod dla składnika Button.

Należy zauważyć, że mam className dla komponentu, który pozwala, aby inny komponent przekazał w klasie komponent przycisku. Tak więc, gdy ktoś pożycza twój komponent, może rozszerzyć lub zastąpić style przycisków.

Jeśli potrzebujesz stworzyć dostosowywaną stronę internetową, zalecam również użycie Less.js, która zapewnia podgląd na żywo dostosowanej strony internetowej.

Powiązane problemy