Dans React, vous pouvez clairement créer un objet et l'affecter en tant que style en ligne. c'est à dire. mentionné ci-dessous.
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);
Comment puis-je combiner plusieurs objets et les affecter ensemble?
Réponses:
Si vous utilisez React Native, vous pouvez utiliser la notation de tableau:
Consultez mon blog détaillé à ce sujet.
la source
<View style={this.state.error == false ? styles.base : [styles.base, {backgroundColor: 'red'}]} />
StyleSheet.compose()
dehors de la fonction de rendu peut être plus efficace. Il produira une nouvelle feuille de style statique qui ne sera envoyée qu'une fois sur le pont. (Ce conseil ne s'applique pas aux styles qui changent au moment de l'exécution, ou qui sont en ligne plutôt que dans une feuille de style.)Vous pouvez utiliser l'opérateur d'étalement:
la source
<div style={{ ...LEGEND_STYLE.box_base, ...{ 'background': '#123456' } }} />
<div style={LEGEND_STYLE.box_gen('#123456')}
toute façon, donc ce n'est pas un gros problème pour moiVous pouvez le faire avec
Object.assign()
.Dans votre exemple, vous feriez:
Cela fusionnera les deux styles. Le deuxième style remplacera le premier s'il existe des propriétés correspondantes.
Comme l'a noté Brandon, vous devez l'utiliser
Object.assign({}, divStyle, divStyle2)
si vous souhaitez réutiliserdivStyle
sans que la taille de police ne lui soit appliquée.J'aime l'utiliser pour créer des composants avec des propriétés par défaut. Par exemple, voici un petit composant sans état avec une valeur par défaut
margin-right
:Nous pouvons donc rendre quelque chose comme ceci:
Ce qui nous donnera le résultat:
la source
Object.assign()
à mauvais escient d'une manière qui entraînerait des conséquences indésirables. Voir la réponse ici une solution plus fiable.Object.assign()
dans votre réponse. la première, dans les premières phrases, est un exemple de la mauvaise utilisation que j'ai identifiée (c'est-à-dire que si OP a fait ce que vous conseillez dans votre premiercode
bloc, il / elle muterait{divStyle}
). la deuxième façon - c'est-à-dire, l'enrouler dans une fonction comme vous l'avez, fonctionnera, mais la réponse ne précise pas que vous travaillez autourObject.assign()
de l'immuabilité «gotcha» commune de wrt (bien que personnellement, je pense que c'est un peu encombrant pour écrire une fonction sans état personnalisée pour chaque composant par défaut).Contrairement à React Native, nous ne pouvons pas transmettre un tableau de styles dans React, comme
Dans React, nous devons créer l'objet unique des styles avant de le passer à la propriété style. Comme:
Nous avons utilisé l' opérateur Spread ES6 pour combiner deux styles. Vous pouvez également utiliser Object.assign () dans le même but.
Cela fonctionne également si vous n'avez pas besoin de stocker votre style dans un var
la source
Object.assign()
est une solution facile, mais son utilisation (actuellement) la meilleure réponse - bien qu'elle soit très bien pour créer des composants sans état, causera des problèmes pour l'objectif souhaité de l'OP de fusionner deuxstate
objets.Avec deux arguments,
Object.assign()
va en fait muter le premier objet en place, affectant les instanciations futures.Ex:
Considérez deux configurations de style possibles pour une boîte:
Nous voulons donc que toutes nos boîtes aient des styles de boîte par défaut, mais nous voulons en remplacer certaines avec une couleur différente:
Une fois
Object.assign()
exécuté, l'objet 'styles.box' est définitivement changé.La solution est de passer un objet vide à
Object.assign()
. Ce faisant, vous dites à la méthode de produire un nouvel objet avec les objets que vous lui avez transmis. Ainsi:Cette notion d'objets en mutation sur place est critique pour React, et une bonne utilisation de
Object.assign()
est vraiment utile pour utiliser des bibliothèques comme Redux.la source
Array notaion est le meilleur moyen de combiner des styles dans React Native.
Cela montre comment combiner 2 objets Style,
cela montre comment combiner objet et propriété Style,
Cela fonctionnera sur n'importe quelle application native React.
la source
React
, pasReact Native
Vous pouvez également combiner des classes avec un style en ligne comme ceci:
la source
En fait, il existe un moyen formel de combiner et c'est comme ci-dessous:
Mais, il y a un petit problème , si l'un d'eux est passé par le composant parent et qu'il a été créé par une manière formelle combinée, nous avons un gros problème:
Et cette dernière ligne a un bug d'interface, sûrement, React Native ne peut pas gérer un tableau profond à l'intérieur d'un tableau. Je crée donc ma fonction d'aide:
En utilisant my
styleJoiner
partout, vous pouvez combiner n'importe quel type de style et combiner des styles. mêmeundefined
ou d'autres types inutiles ne provoquent pas de rupture du style.la source
J'ai trouvé que cela fonctionnait le mieux pour moi. Il remplace comme prévu.
la source
Pour ceux qui recherchent cette solution dans React, si vous souhaitez utiliser l'opérateur de propagation dans le style, vous devez utiliser: babel-plugin-transform-object-rest-spread.
Installez-le par le module npm et configurez votre .babelrc comme tel:
Ensuite, vous pouvez utiliser comme ...
Plus d'informations: https://babeljs.io/docs/en/babel-plugin-transform-object-rest-spread/
la source
Pour aller encore plus loin, vous pouvez créer une fonction d'assistance semblable à des noms de classe :
Et puis utilisez-le conditionnellement dans vos composants:
la source
Donc, fondamentalement, je regarde les choses dans le mauvais sens. D'après ce que je vois, ce n'est pas une question spécifique à React, plus une question JavaScript sur la façon de combiner deux objets JavaScript ensemble (sans encombrer des propriétés nommées de manière similaire).
Dans cette réponse StackOverflow, il l'explique. Comment fusionner dynamiquement les propriétés de deux objets JavaScript?
Dans jQuery, je peux utiliser la méthode extend.
la source
Pour développer ce que @PythonIsGreat a dit, je crée une fonction globale qui le fera pour moi:
Cela étend profondément les objets dans un nouvel objet et permet un nombre variable d'objets comme paramètres. Cela vous permet de faire quelque chose comme ceci:
la source
J'ai construit un module pour cela si vous souhaitez ajouter des styles basés sur une condition comme celle-ci:
https://www.npmjs.com/package/react-native-multiple-styles
la source
Façons de style en ligne:
la source