En React puede crear claramente un objeto y asignarlo como un estilo en línea. es decir. mencionado abajo.
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);
¿Cómo puedo combinar varios objetos y asignarlos juntos?
Respuestas:
Si está usando React Native, puede usar la notación de matriz:
Mira mi publicación de blog detallada sobre esto.
fuente
<View style={this.state.error == false ? styles.base : [styles.base, {backgroundColor: 'red'}]} />
StyleSheet.compose()
fuera de la función de renderizado podría ser más eficiente. Producirá una nueva hoja de estilo estática que solo se enviará por el puente una vez. (Este consejo no se aplica a los estilos que el cambio en tiempo de ejecución, o que están en línea en lugar de en una hoja de estilo.)Puede usar el operador de propagación:
fuente
<div style={{ ...LEGEND_STYLE.box_base, ...{ 'background': '#123456' } }} />
<div style={LEGEND_STYLE.box_gen('#123456')}
todos modos, así que no es un gran problema para míPuedes hacer esto con
Object.assign()
.En su ejemplo, haría:
Eso fusionará los dos estilos. El segundo estilo reemplazará al primero si hay propiedades coincidentes.
Como señaló Brandon, debe usarlo
Object.assign({}, divStyle, divStyle2)
si desea reutilizarlodivStyle
sin aplicar fontSize.Me gusta usar esto para hacer componentes con propiedades predeterminadas. Por ejemplo, aquí hay un pequeño componente sin estado con un valor predeterminado
margin-right
:Entonces podemos renderizar algo como esto:
Lo que nos dará el resultado:
fuente
Object.assign()
de una manera que podría tener algunas consecuencias indeseables. Vea la respuesta aquí, una solución más confiable.Object.assign()
en tu respuesta. la primera, en las primeras oraciones, es un ejemplo del mal uso que identifiqué (es decir, si OP hizo lo que usted aconseja en su primercode
bloque, él / ella mutaría{divStyle}
). la segunda forma, es decir, envolverlo en una función como la que tiene, funcionará, pero la respuesta no deja en claro que está trabajando en torno aObject.assign()
la inmutabilidad común 'gotcha' wrt '(aunque personalmente creo que es un poco engorroso escribir una función sin estado personalizada para cada componente predeterminado).A diferencia de React Native, no podemos pasar una variedad de estilos en React, como
En React, necesitamos crear el único objeto de estilos antes de pasarlo a la propiedad de estilo. Me gusta:
Hemos utilizado el operador ES6 Spread para combinar dos estilos. También puede usar Object.assign () para el mismo propósito.
Esto también funciona si no necesita almacenar su estilo en una variable
fuente
Object.assign()
es una solución fácil, pero el uso (actualmente) de la respuesta principal de la misma, aunque es ideal para hacer componentes sin estado, causará problemas para el objetivo deseado del OP de fusionar dosstate
objetos.Con dos argumentos, en
Object.assign()
realidad mutará el primer objeto en el lugar, afectando futuras instancias.Ex:
Considere dos posibles configuraciones de estilo para un cuadro:
Por lo tanto, queremos que todas nuestras cajas tengan estilos de 'caja' predeterminados, pero queremos sobrescribir algunas con un color diferente:
Una vez que se
Object.assign()
ejecuta, el objeto 'styles.box' cambia para siempre.La solución es pasar un objeto vacío a
Object.assign()
. Al hacerlo, le está diciendo al método que produzca un NUEVO objeto con los objetos que le pasa. Al igual que:Esta noción de objetos que mutan en el lugar es crítica para React, y el uso adecuado de esto
Object.assign()
es realmente útil para usar bibliotecas como Redux.fuente
Array notaion es la mejor manera de combinar estilos en react native.
Esto muestra cómo combinar 2 objetos de estilo,
esto muestra cómo combinar el objeto y la propiedad Style,
Esto funcionará en cualquier aplicación nativa de reacción.
fuente
React
, noReact Native
También puede combinar clases con un estilo en línea como este:
fuente
En realidad, hay una forma formal de combinar y es como a continuación:
Pero, hay un pequeño problema , si uno de ellos es pasado por el componente padre y fue creado por una forma formal combinada, tenemos un gran problema:
Y esta última línea hace que tenga un error de interfaz de usuario, hosco, React Native no puede lidiar con una matriz profunda dentro de una matriz. Entonces creo mi función auxiliar:
Al usar my en
styleJoiner
cualquier lugar, puede combinar cualquier tipo de estilo y combinar estilos. inclusoundefined
u otros tipos inútiles no hacen que se rompa el estilo.fuente
Descubrí que esto funciona mejor para mí. Se anula como se esperaba.
fuente
Para aquellos que buscan esta solución en React, si desea usar el operador spread dentro del estilo, debe usar: babel-plugin-transform-object-rest-spread.
Instálelo mediante el módulo npm y configure su .babelrc como tal:
Entonces puedes usar como ...
Más información: https://babeljs.io/docs/en/babel-plugin-transform-object-rest-spread/
fuente
Para llevar esto aún más lejos, puede crear una función auxiliar similar a los nombres de clase :
Y luego úselo condicionalmente en sus componentes:
fuente
Así que básicamente estoy viendo esto de manera incorrecta. Por lo que veo, esta no es una pregunta específica de React, más una pregunta de JavaScript sobre cómo combino dos objetos de JavaScript juntos (sin alterar propiedades con nombres similares).
En esta respuesta de StackOverflow, lo explica. ¿Cómo puedo fusionar propiedades de dos objetos JavaScript dinámicamente?
En jQuery puedo usar el método extend.
fuente
Para ampliar lo que dijo @PythonIsGreat, creo una función global que lo hará por mí:
Esto extiende profundamente los objetos a un nuevo objeto y permite un número variable de objetos como parámetros. Esto le permite hacer algo como esto:
fuente
He creado un módulo para esto si desea agregar estilos basados en una condición como esta:
https://www.npmjs.com/package/react-native-multiple-styles
fuente
Formas de estilo en línea:
fuente