W React możesz wyraźnie utworzyć obiekt i przypisać go jako styl wbudowany. to znaczy. wspomniane poniżej.
var divStyle = {
color: 'white',
backgroundImage: 'url(' + imgUrl + ')',
WebkitTransition: 'all', // note the capital 'W' here
msTransition: 'all' // 'ms' is the only lowercase vendor prefix
};
var divStyle2 = {fontSize: '18px'};
React.render(<div style={divStyle}>Hello World!</div>, mountNode);
Jak mogę połączyć wiele obiektów i przypisać je razem?
Odpowiedzi:
Jeśli używasz React Native, możesz użyć notacji tablicowej:
Sprawdź mój szczegółowy post na blogu na ten temat.
źródło
<View style={this.state.error == false ? styles.base : [styles.base, {backgroundColor: 'red'}]} />
StyleSheet.compose()
poza funkcją renderowania może być bardziej wydajne. Stworzy nowy statyczny arkusz stylów, który zostanie przesłany przez most tylko raz. (Ta rada nie dotyczy stylów, które zmieniają się w czasie wykonywania lub które są wstawiane zamiast wMożesz użyć operatora rozprzestrzeniania:
źródło
<div style={{ ...LEGEND_STYLE.box_base, ...{ 'background': '#123456' } }} />
<div style={LEGEND_STYLE.box_gen('#123456')}
czy inaczej, więc dla mnie to nie jest wielka sprawaMożesz to zrobić za pomocą
Object.assign()
.W twoim przykładzie zrobiłbyś:
To połączy te dwa style. Drugi styl zastąpi pierwszy, jeśli istnieją pasujące właściwości.
Jak zauważył Brandon, powinieneś użyć,
Object.assign({}, divStyle, divStyle2)
jeśli chcesz ponownie użyćdivStyle
bez zastosowanej czcionkiSize.Lubię to wykorzystywać do tworzenia komponentów o domyślnych właściwościach. Na przykład, oto mały komponent bezstanowy z domyślnym
margin-right
:Możemy więc renderować coś takiego:
Co da nam wynik:
źródło
Object.assign()
w sposób, który prowadziłby do niepożądanych konsekwencji. Zobacz odpowiedź tutaj, bardziej niezawodne rozwiązanie.Object.assign()
w swojej odpowiedzi podasz dwa różne sposoby wykorzystania . pierwsze, w pierwszych kilku zdaniach, jest przykładem niewłaściwego użycia, które zidentyfikowałem (tj. jeśli OPcode
zrobiłby to, co doradzasz w pierwszym bloku, zmutowałby{divStyle}
). drugi sposób - tzn. zawinięcie go w funkcję taką, jaką masz, zadziała, ale odpowiedź nie wyjaśnia, że pracujesz nadObject.assign()
niezmiennością „gotcha” wrt (chociaż osobiście uważam, że to trochę kłopotliwe jest napisanie niestandardowej funkcji bezstanowej dla każdego domyślnego komponentu).W przeciwieństwie do React Native, nie możemy przekazać tablicy stylów w React, np
W React musimy utworzyć pojedynczy obiekt stylów przed przekazaniem go do właściwości stylu. Lubić:
Użyliśmy operatora ES6 Spread, aby połączyć dwa style. Możesz również użyć Object.assign () w tym samym celu.
Działa to również, jeśli nie musisz przechowywać swojego stylu w var
źródło
Object.assign()
jest łatwym rozwiązaniem, ale użycie (obecnie) najwyższej odpowiedzi - choć jest w porządku do tworzenia elementów bezstanowych, spowoduje problemy w pożądanym celu PO polegającym na połączeniu dwóchstate
obiektów.Za pomocą dwóch argumentów
Object.assign()
faktycznie mutuje pierwszy obiekt w miejscu, wpływając na przyszłe wystąpienia.Dawny:
Rozważ dwie możliwe konfiguracje stylu dla pudełka:
Dlatego chcemy, aby wszystkie nasze pola miały domyślne style „pól”, ale chcemy nadpisać niektóre innym kolorem:
Po
Object.assign()
uruchomieniu obiekt „styles.box” zostaje na dobre zmieniony.Rozwiązaniem jest przekazanie pustego obiektu
Object.assign()
. Robiąc to, mówisz metodzie, aby wytworzyć NOWY obiekt z obiektami, które przekazujesz. Tak jak:To pojęcie obiektów mutujących w miejscu jest kluczowe dla React, a prawidłowe użycie
Object.assign()
jest naprawdę pomocne w korzystaniu z bibliotek takich jak Redux.źródło
Notatka tablicowa to najlepszy sposób łączenia stylów w reakcji native.
To pokazuje, jak połączyć 2 obiekty Style,
pokazuje, jak połączyć obiekt i właściwość Style,
Będzie to działać na każdej aplikacji natywnej reagującej.
źródło
React
, a nieReact Native
Możesz także łączyć klasy ze stylem wbudowanym w ten sposób:
źródło
W rzeczywistości istnieje formalny sposób łączenia i wygląda to tak:
Ale jest mały problem , jeśli jeden z nich jest przekazywany przez komponent nadrzędny i został utworzony przez połączenie formalne, mamy duży problem:
Ta ostatnia linia powoduje błąd interfejsu użytkownika, niestety React Native nie może poradzić sobie z głęboką tablicą wewnątrz tablicy. Więc tworzę moją funkcję pomocnika:
Używając mojego w
styleJoiner
dowolnym miejscu, możesz łączyć dowolny styl i łączyć style. nawetundefined
inne bezużyteczne typy nie powodują zepsucia stylizacji.źródło
Przekonałem się, że to działa dla mnie najlepiej. Zastępuje zgodnie z oczekiwaniami.
źródło
Dla tych, którzy szukają tego rozwiązania w React, jeśli chcesz używać operatora rozkładania wewnątrz stylu, powinieneś użyć: babel-plugin-transform-object-rest-spread.
Zainstaluj go za pomocą modułu npm i skonfiguruj .babelrc jako taki:
Następnie możesz użyć jak ...
Więcej informacji: https://babeljs.io/docs/en/babel-plugin-transform-object-rest-spread/
źródło
Aby pójść dalej, możesz utworzyć funkcję pomocniczą podobną do nazw klas:
A następnie użyj go warunkowo w swoich komponentach:
źródło
Zasadniczo patrzę na to w niewłaściwy sposób. Z tego, co widzę, nie jest to pytanie specyficzne dla React, bardziej pytanie JavaScript, w jaki sposób połączyć razem dwa obiekty JavaScript (bez blokowania właściwości o podobnych nazwach).
W tej odpowiedzi StackOverflow wyjaśnia to. Jak mogę dynamicznie łączyć właściwości dwóch obiektów JavaScript?
W jQuery mogę użyć metody ext.
źródło
Aby rozwinąć to, co powiedział @PythonIsGreat, tworzę globalną funkcję, która zrobi to za mnie:
To głęboko rozszerza obiekty na nowy obiekt i pozwala na zmienną liczbę obiektów jako parametrów. Pozwala to zrobić coś takiego:
źródło
Zbudowałem do tego moduł, jeśli chcesz dodać style w oparciu o taki warunek:
https://www.npmjs.com/package/react-native-multiple-styles
źródło
Sposoby stylizacji w linii:
źródło