Usando o método css-in-js para adicionar classes a um componente react, como adiciono vários componentes?
Aqui está a variável classes:
const styles = theme => ({
container: {
display: 'flex',
flexWrap: 'wrap'
},
spacious: {
padding: 10
},
});
Aqui está como eu usei:
return (
<div className={ this.props.classes.container }>
O classNames
procedimento acima funciona, mas existe uma maneira de adicionar ambas as classes, sem usar o pacote npm? Algo como:
<div className={ this.props.classes.container + this.props.classes.spacious}>
Respostas:
você pode usar interpolação de string:
<div className={`${this.props.classes.container} ${this.props.classes.spacious}`}>
fonte
você pode instalar este pacote
https://github.com/JedWatson/classnames
e então usá-lo assim
classNames('foo', 'bar'); // => 'foo bar' classNames('foo', { bar: true }); // => 'foo bar' classNames({ 'foo-bar': true }); // => 'foo-bar' classNames({ 'foo-bar': false }); // => '' classNames({ foo: true }, { bar: true }); // => 'foo bar' classNames({ foo: true, bar: true }); // => 'foo bar' // lots of arguments of various types classNames('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux' // other falsy values are just ignored classNames(null, false, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'
fonte
@material-ui/core
agora depende declsx
, então se você não quiser aumentar o tamanho do seu pacote, você deve usar isso - npmjs.com/package/clsxVocê pode usar o clsx . Percebi que é usado nos exemplos de botões MUI
Primeiro instale:
npm install --save clsx
Em seguida, importe-o em seu arquivo de componente:
import clsx from 'clsx';
Em seguida, use a função importada em seu componente:
<div className={ clsx(classes.container, classes.spacious)}>
fonte
clsx
pacote é menor queclassnames
, então eu prefiro esta solução@material-ui/core now depends on clsx, so if you don't want to increase your bundle size you'll want to use that instead
. Então, 1 para esta resposta.Para ter várias classes aplicadas a um componente, agrupe as classes que gostaria de aplicar em classNames.
Por exemplo, em sua situação, seu código deve ser assim,
import classNames from 'classnames'; const styles = theme => ({ container: { display: "flex", flexWrap: "wrap" }, spacious: { padding: 10 } }); <div className={classNames(classes.container, classes.spacious)} />
Certifique-se de importar classNames !!!
Dê uma olhada na documentação da interface do usuário onde eles usam várias classes em um componente para criar um botão personalizado
fonte
Você também pode usar a propriedade extend (o plugin jss-extend é habilitado por padrão):
const styles = theme => ({ container: { display: 'flex', flexWrap: 'wrap' }, spaciousContainer: { extend: 'container', padding: 10 }, }); // ... <div className={ this.props.classes.spaciousContainer }>
fonte
Acho que isso vai resolver o seu problema:
const styles = theme => ({ container: { display: 'flex', flexWrap: 'wrap' }, spacious: { padding: 10 }, });
e no componente de reação:
<div className={`${classes.container} ${classes.spacious}`}>
fonte
Sim, jss-composes fornece isto:
const styles = theme => ({ container: { display: 'flex', flexWrap: 'wrap' }, spacious: { composes: '$container', padding: 10 }, });
E então você apenas usa classes.spacious.
fonte
classNames
o pacote também pode ser usado tão avançado quanto:import classNames from 'classnames'; var arr = ['b', { c: true, d: false }]; classNames('a', arr); // => 'a b c' let buttonType = 'primary'; classNames({ [`btn-${buttonType}`]: true }); // => 'btn-primary'
fonte
Você pode adicionar várias classes de string e classes de variáveis ou classes de adereços ao mesmo tempo desta forma
className={`${classes.myClass} ${this.props.classes.myClass2} MyStringClass`}
três aulas ao mesmo tempo
fonte
Se você deseja atribuir vários nomes de classe ao seu elemento, pode usar matrizes .
Portanto, em seu código acima, se this.props.classes resolver para algo como ['container', 'spacious'], ou seja, se
this.props.classes = ['container', 'spacious'];
você pode simplesmente atribuí-lo a div como
<div className = { this.props.classes.join(' ') }></div>
e o resultado será
<div class='container spacious'></div>
fonte
,
no resultadoComo já mencionado, você pode usar interpolação de string
className={`${this.props.classes.container} ${this.props.classes.spacious}`}
E você pode tentar a
classnames
biblioteca, https://www.npmjs.com/package/classnamesfonte