Question

J'ai ce code ReactJS pour afficher un bouton d'image personnalisé qui bascule entre 2 images différentes pour l'état ON et OFF.Existe-t-il un moyen plus simple de procéder ?J'espérais que CSS contiendrait moins de lignes de code, mais je n'ai pas pu trouver d'exemple simple.

Le code ci-dessous passe l'état à partir de <MyIconButton> à <MyPartyCatButton> puis à <MyHomeView>.Mon application aura 4 de ces boutons personnalisés sur l'écran d'accueil, c'est pourquoi j'ai pris en compte <MyIconButton>.

d'ailleurs - c'est pour une application mobile et j'ai lu (et remarqué cela moi-même) c'est vraiment lent d'utiliser les cases à cocher sur les navigateurs mobiles ;c'est pourquoi j'ai choisi d'essayer ceci sans utiliser de cases à cocher.

Code ReactJS

var MyIconButton = React.createClass({

  handleSubmit: function(e) {
    e.preventDefault();
    console.log("INSIDE: MyIconButton handleSubmit");

    // Change button's state ON/OFF, 
    // then sends state up the food chain via            
    //  this.props.updateFilter( b_buttonOn ).
    var b_buttonOn = false;
    if (this.props.pressed === true) {
      b_buttonOn = false;
    }
    else {
      b_buttonOn = true;
    }
    // updateFilter is a 'pointer' to a method in the calling React component.
    this.props.updateFilter( b_buttonOn ); 
  },

  render: function() {

    // Show On or Off image.
    // ** I could use ? : inside the JSX/HTML but prefer long form to make it explicitly obvious. 
    var buttonImg = "";
    if (this.props.pressed === true) {
      buttonImg = this.props.onpic;
    }
    else {
      buttonImg = this.props.offpic;
    }

    return (
      <div>
        <form onSubmit={this.handleSubmit}>
          <input type="image" src={buttonImg}></input>
        </form>
      </div>
    );
  }
});


// <MyPartyCatButton> Doesn't have it's own state, 
// passes state of <MyIconButton> 
// straight through to <MyHomeView>.
var MyPartyCatButton = React.createClass({

  render: function() {
    return (
      <MyIconButton pressed={this.props.pressed} updateFilter={this.props.updateFilter} onpic="static/images/icon1.jpeg" offpic="static/images/off-icon.jpg"/>
    );
  }
});

//
// Main App view
var MyHomeView = React.createClass({
  getInitialState: function() {
    // This is where I'll eventually get data from the server.
    return {
      b_MyPartyCat: true
    };
  },

  updatePartyCategory: function(value) {
    // Eventually will write value to the server.
    this.setState( {b_MyPartyCat: value} );
    console.log("INSIDE: MyHomeView() updatePartyCategory() " + this.state.b_MyPartyCat );
  },

  render: function() {
    return (
        <div>
         <MyPartyCatButton pressed={this.state.b_MyPartyCat} updateFilter={this.updatePartyCategory}/>
        </div>

        // Eventually will have 3 other categories i.e. Books, Skateboards, Trees !
    );
  }
});
Était-ce utile?

La solution

si vous mettez à jour dynamiquement le composant "pressé" (comme vous l'avez fait), simplement

var MyIconButton= React.createClass({
    render: function(){
        var pic= this.props.pressed? this.props.onpic : this.props.offpic
        return <img 
            src={pic} 
            onClick={this.props.tuggleSelection}  //updateFilter is wierd name
        />
    }
})

(MODIFIER:de cette façon, sur le composant MyPartyCatButton, vous pouvez transmettre une fonction pour gérer l'événement 'tuggleSelection'.l'argument de la fonction d'événement est un objet d'événement, mais vous avez déjà l'état du bouton dans l'état wrapper (l'ancien, vous devez donc l'inverser).ton code ressemblera à ça :

render: function(){
    return <MyIconButton pressed={this.state.PartyCatPressed} tuggleSelection={this.updatePartyCategory} />
}
updatePartyCategory: function(e){
    this.setState( 
        {PartyCatPressed: !this.state.PartyCatPressed} //this invert PartyCatPressed value
    );
    console.log("INSIDE: MyHomeView() updatePartyCategory() " + this.state.b_MyPartyCat )
}

)

mais si ce n'est pas le cas, utilisez prop pour la valeur par défaut :

var MyIconButton= React.createClass({
    getInitialState: function(){
        return {pressed: this.props.defultPressed}
    },
    handleClick: function(){
        this.setState({pressed: !this.state.pressed})
    },

    render: function(){
        var pic= this.state.pressed? this.props.onpic : this.props.offpic
        return <img 
            src={pic} 
            onClick={this.handleClick}
        />
    }
})
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top