No React, você pode criar claramente um objeto e atribuí-lo como um estilo embutido. ie mencionado abaixo.
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);
Como posso combinar vários objetos e atribuí-los juntos?
Respostas:
Se você estiver usando o React Native, poderá usar a notação de matriz:
Confira meu post detalhado sobre isso.
fonte
<View style={this.state.error == false ? styles.base : [styles.base, {backgroundColor: 'red'}]} />
StyleSheet.compose()
fora da função de renderização pode ser mais eficiente. Ele produzirá uma nova folha de estilo estática que será enviada apenas pela ponte uma vez. (Este conselho não se aplica aos estilos que mudam em tempo de execução, ou que estejam em linha em vez de uma folha de estilo.)Você pode usar o operador spread:
fonte
<div style={{ ...LEGEND_STYLE.box_base, ...{ 'background': '#123456' } }} />
<div style={LEGEND_STYLE.box_gen('#123456')}
de qualquer maneira, por isso não é um grande negócio para mimVocê pode fazer isso com
Object.assign()
.No seu exemplo, você faria:
Isso mesclará os dois estilos. O segundo estilo substituirá o primeiro se houver propriedades correspondentes.
Como Brandon observou, você deve usar
Object.assign({}, divStyle, divStyle2)
se desejar reutilizardivStyle
sem o fontSize aplicado a ele.Eu gosto de usar isso para criar componentes com propriedades padrão. Por exemplo, aqui está um pequeno componente sem estado com um padrão
margin-right
:Então, podemos renderizar algo como isto:
O que nos dará o resultado:
fonte
Object.assign()
de uma maneira que levaria a algumas conseqüências indesejáveis. Veja a resposta aqui, uma solução mais confiável.Object.assign()
em sua resposta. a primeira, nas primeiras frases, é um exemplo do uso indevido que identifiquei (ou seja, se o OP fez o que você recomendou no seu primeirocode
bloco, ele / ela sofreu uma mutação{divStyle}
). a segunda maneira - ou seja, envolvê-lo em uma função como você tem, funcionará, mas a resposta não deixa claro que você está trabalhando em tornoObject.assign()
da imutabilidade comum do 'pegadinha' (embora pessoalmente eu ache que é um pouco difícil escrever uma função sem estado personalizada para cada componente padrão).Ao contrário do React Native, não podemos passar uma variedade de estilos no React, como
No React, precisamos criar o único objeto de estilos antes de passá-lo para a propriedade style. Gostar:
Usamos o operador ES6 Spread para combinar dois estilos. Você também pode usar Object.assign () também para a mesma finalidade.
Isso também funciona se você não precisar armazenar seu estilo em um var
fonte
Object.assign()
é uma solução fácil, mas o uso (atualmente) da principal resposta - embora seja bom para criar componentes sem estado, causará problemas para o objetivo desejado do OP de mesclar doisstate
objetos.Com dois argumentos,
Object.assign()
na verdade, o primeiro objeto será modificado, afetando instanciações futuras.Ex:
Considere duas configurações de estilo possíveis para uma caixa:
Portanto, queremos que todas as nossas caixas tenham estilos padrão de 'caixa', mas queremos substituir alguns com uma cor diferente:
Uma vez
Object.assign()
executado, o objeto 'styles.box' é alterado para sempre.A solução é passar um objeto vazio para
Object.assign()
. Ao fazer isso, você está dizendo ao método para produzir um novo objeto com os objetos que você o transmite. Igual a:Essa noção de objetos com mutação no local é crítica para o React, e o uso adequado de
Object.assign()
é realmente útil para o uso de bibliotecas como o Redux.fonte
A anotação de matriz é a melhor maneira de combinar estilos em reagir nativo.
Isso mostra como combinar 2 objetos de estilo,
isso mostra como combinar objeto e propriedade Style,
Isso funcionará em qualquer aplicativo nativo de reação.
fonte
React
, nãoReact Native
Você também pode combinar classes com estilo embutido, como este:
fonte
Na verdade, existe uma maneira formal de combinar e é como abaixo:
Porém, há um pequeno problema : se um deles é passado pelo componente pai e foi criado de uma maneira formal combinada, temos um grande problema:
E essa última linha faz com que o bug da interface do usuário, certamente, o React Native não possa lidar com uma matriz profunda dentro de uma matriz. Então, eu crio minha função auxiliar:
Ao usar o meu em
styleJoiner
qualquer lugar, você pode combinar qualquer tipo de estilo e estilos. mesmoundefined
ou outros tipos inúteis não causam quebra no estilo.fonte
Eu descobri que isso funciona melhor para mim. Ele substitui conforme o esperado.
fonte
Para aqueles que procuram esta solução no React, se quiser usar o operador de propagação dentro do estilo, use: babel-plugin-transform-object-rest-spread.
Instale-o pelo módulo npm e configure seu .babelrc da seguinte forma:
Então você pode usar como ...
Mais informações: https://babeljs.io/docs/en/babel-plugin-transform-object-rest-spread/
fonte
Para levar ainda mais longe, você pode criar uma função auxiliar semelhante a um nome de classe :
E use-o condicionalmente em seus componentes:
fonte
Então, basicamente, estou vendo isso da maneira errada. Pelo que vejo, essa não é uma pergunta específica do React, mais uma questão de JavaScript sobre como combinar dois objetos JavaScript (sem interferir nas propriedades com nomes semelhantes).
Nesta resposta StackOverflow, ela explica. Como mesclar propriedades de dois objetos JavaScript dinamicamente?
No jQuery eu posso usar o método extend.
fonte
Para expandir o que o @PythonIsGreat disse, crio uma função global que fará isso por mim:
Isso estende profundamente os objetos para um novo objeto e permite um número variável de objetos como parâmetros. Isso permite que você faça algo assim:
fonte
Eu construí um módulo para isso, se você deseja adicionar estilos com base em uma condição como esta:
https://www.npmjs.com/package/react-native-multiple-styles
fonte
Maneiras de estilizar em linha:
fonte