2017-06-29 24 views
6

pracuję z styled-components i wytwarzających komponenty przy użyciu ich składnię dosłownego oznaczone szablonu takie jak:Przechodząc kolejne argumenty ze znacznikami literałów szablonów

const Button = styled.button` 
    background-color: papayawhip; 
    border-radius: 3px; 
    color: palevioletred; 
` 

W jednym przypadku muszę wywołać funkcję, która generuje zapytania mediów w oparciu w punkcie przerwania i przekazuje oznaczoną literałową literę css do dołączenia do.

na przykład:

media(12)` 
    background-color: papayawhip; 
` 

Funkcja mediów może wyglądać mniej więcej tak:

const media = mapValues(width => ({ css: (...args) => css` 
    @media (min-width: ${width}rem) { 
    ${css(...args)} 
    } 
`})); 

przechodzi zarówno wartość i oznaczony szablon dosłowne możliwe, czy ja mam o tym źle droga?

+0

Dlaczego nie media''min-width: $ {somevar}; background-color: papayawhip'' –

+0

@ Jonasw thanks for replying! Rzeczywista implementacja jest nieco bardziej skomplikowana, ponieważ media są wywoływane przez mapowanie na tablicy punktów przerwania. Funkcja mediów musi być oddzielona od głównego bloku css, aby rozdzielić wątpliwości i przetestować. Rzeczywistą implementację można obejrzeć tutaj: https://github.com/aaronvanston/react-flexa/blob/master/src/components/Col/Col.js#L16 jest to nieco niepoprawne, ponieważ potrzebuję więcej argumentów przekazanych do mediów funkcjonować. –

+1

faktycznie wiem, czy to działa, ale nie byłby to media (12, 'sth'); rozwiązanie? –

Odpowiedz

2

Tagged template literals to nie magia, po prostu trzeba wrócić inną funkcję z rozmowy media(12):

function media(twelve) { 
    return function(stringParts, ...interpolationValues) { 
    return … 
    } 
} 

lub za pomocą strzałek funkcji

const media = (twelve) => (stringParts, ...interpolationValues) => …; 

być nazywany jako

media(12)`firstPart ${13} secondPart` 
// or equvialently 
media(12)(["firstPart ", " secondPart"], 13) 

Jednakże, jeśli nie musisz robić bu burzenia interpolacji t po prostu chcesz otrzymać ciąg, może łatwiej będzie napisać funkcję z parametrami

function media(twelve, string) { 
    return …; 
} 

i nazywają go jako

media(12, ` 
    templateString 
`) 
+0

Dzięki za ustawienie tego! Zrobiłem to w końcu z podobnym podejściem, ciągi, które były przekazywane, zawierały przecinki, rozwiązaniem czasowym było ich usunięcie, ale może trzeba zmienić sposób, w jaki jest on włączony. Oto dokładna linia, do której się odnawiam: https: // github.com/aaronvanston/react-flexa/pull/62/files # diff-99a45c5816f379ef543d689b1a46dbbdR4 –

Powiązane problemy