style react name javascript reactjs addclass react-jsx

javascript - name - ¿Cómo agregar una clase con React.js?



style react (3)

¿Podrías ayudarme con esta pregunta tan simple? Necesito agregar la clase "activa" después de hacer clic en el botón y eliminar todas las demás clases "activas".

Mira aquí por favor: http://goo.gl/duLPlG

var Tags = React.createClass({ setFilter: function(filter) { this.props.onChangeFilter(filter); }, render: function() { return <div className="tags"> <button className="btn active" onClick={this.setFilter.bind(this, '''')}>All</button> <button className="btn" onClick={this.setFilter.bind(this, ''male'')}>male</button> <button className="btn" onClick={this.setFilter.bind(this, ''female'')}>female</button> <button className="btn" onClick={this.setFilter.bind(this, ''child'')}>child</button> <button className="btn" onClick={this.setFilter.bind(this, ''blonde'')}>blonde</button> </div> } }); var Kid = React.createClass({ render: function() { return <ul> <li>{this.props.name}</li> </ul> } }); var List = React.createClass({ getInitialState: function() { return { filter: '''' }; }, changeFilter: function(filter) { this.setState({ filter: filter }); }, render: function() { var list = this.props.Data; if (this.state.filter !== '''') { list = list.filter((i)=> i.tags.indexOf(this.state.filter) !== -1); console.log(list); } list = list.map(function(Props){ return <Kid {...Props} /> }); return <div> <h2>Kids Finder</h2> <Tags onChangeFilter={this.changeFilter}/> {list} </div> } }); var options = { Data: [{ name: ''Eric Cartman'', tags: [''male'', ''child''] },{ name: ''Wendy Testaburger'', tags: [''female'', ''child''] },{ name: ''Randy Marsh'', tags: [''male''] },{ name: ''Butters Stotch'', tags: [''male'', ''blonde'', ''child''] },{ name: ''Bebe Stevens'', tags: [''female'', ''blonde'', ''child''] }] }; var element = React.createElement(List, options); React.render(element, document.body);

¿Cómo lo hago mejor aquí?


Como ya tiene el componente <Tags> llamando a una función en su elemento principal, no necesita un estado adicional: simplemente pase el filtro al componente <Tags> como un apoyo, y utilícelo para representar sus botones. Al igual que:

Cambie su función de renderizado dentro de su componente <Tags> a:

render: function() { return <div className = "tags"> <button className = {this._checkActiveBtn('''')} onClick = {this.setFilter.bind(this, '''')}>All</button> <button className = {this._checkActiveBtn(''male'')} onClick = {this.setFilter.bind(this, ''male'')}>male</button> <button className = {this._checkActiveBtn(''female'')} onClick = {this.setFilter.bind(this, ''female'')}>female</button> <button className = {this._checkActiveBtn(''blonde'')} onClick = {this.setFilter.bind(this, ''blonde'')}>blonde</button> </div> },

Y agrega una función dentro de <Tags> :

_checkActiveBtn: function(filterName) { return (filterName == this.props.activeFilter) ? "btn active" : "btn"; }

Y dentro de su componente <List> , pase el estado del filtro al componente <tags> como apoyo:

return <div> <h2>Kids Finder</h2> <Tags filter = {this.state.filter} onChangeFilter = {this.changeFilter} /> {list} </div>

Entonces debería funcionar como se esperaba. Codepen aquí (espero que el enlace funcione)


Es simple. mira esto

https://codepen.io/anon/pen/mepogj?editors=001

Básicamente, debe tratar con los estados de su componente para que pueda verificar el estado actual. deberás incluir

getInitialState: function(){} //and isActive: function(){}

mira el código en el enlace


esto es bastante útil:

github.com/JedWatson/classnames

Puedes hacer cosas como

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''

o usarlo así

var btnClass = classNames(''btn'', this.props.className, { ''btn-pressed'': this.state.isPressed, ''btn-over'': !this.state.isPressed && this.state.isHovered });