2
votes

Passer les paramètres à la fonction prop sans utiliser de fonction fléchée

J'ai entendu dire que passer une fonction de flèche comme accessoire n'est pas idéal car cela crée à chaque fois une nouvelle fonction qui entraînera des problèmes de performances. Cependant, je ne suis pas tout à fait sûr de savoir comment m'en éloigner complètement, comme le montre l'exemple ci-dessous:

class Home extends Component {

    onCardPress = (message) =>{
        alert(message)
    }

    render(){
        return(
            <View>
                <Card 
                    onCardPress={this.onCardPress}
                    message="Hello world!"
                />
            </View>
        )
    }
}

class Card extends Component {
    render(){
        const { onCardPress , message } = this.props;
        return(
            <TouchableOpacity
                activeOpacity={0.8}
                onPress={()=>{onCardPress(message)}}
            />
        )
    }
}

J'ai essayé de changer onPress dans Card pour être onPress = {onCardPress (message)} , mais je sais que cela ne fonctionne pas car j'appelle la fonction plutôt que de passer un objet fonction au onPress de TouchableOpacity . Quelle est la manière «correcte» ou la meilleure pratique pour supprimer la fonction de flèche dans TouchableOpacity tout en étant toujours en mesure de transmettre le paramètre message du composant parent Home code>?


0 commentaires

5 Réponses :


0
votes

Si vous voulez éviter la fonction flèche, vous devez utiliser bind () . Les fonctions fléchées lieront automatiquement "this" .

  class Home extends Component {

      constructor(props) {
       super(props);
       this.onCardPress = this.onCardPress.bind(this);
      }

      onCardPress (message) {
        alert(message)
      }

      render(){
        return(
            <View>
                <Card 
                    onCardPress={this.onCardPress}
                    message="Hello world!"
                />
            </View>
        )
      }
  }



class Card extends Component {
    render(){
        const { onCardPress , message } = this.props;
        return(
            <TouchableOpacity
                activeOpacity={0.8}
                onPress={onCardPress(message)}
            />
        )
     }
 }


0 commentaires

0
votes

Vous pouvez faire:

class Card extends Component {
    pressHandler = () => this.props.onCardPress(this.props.message);

    render() {
        return (
            <TouchableOpacity
                activeOpacity={0.8}
                onPress={this.pressHandler.bind(this)}
            />
        );
    } }


2 commentaires

Je me demande simplement, est-ce fonctionnellement identique à la version de la fonction flèche, c'est-à-dire en termes de performances, c'est la même chose? Ou est-ce que cela évite les problèmes de performances liés à l'utilisation des fonctions fléchées?


Il y a un petit avantage en ce que vous ne créez pas une nouvelle fonction à chaque fois que le gestionnaire d'événements est déclenché, mais c'est globalement assez négligeable.



0
votes

Si je comprends bien, le problème consiste à appeler bind à l'intérieur de render , ou à renvoyer le gestionnaire à partir d'un autre lambda, car cela créera une nouvelle fonction à chaque fois . La manière conventionnelle de contourner ce problème est de lier vos fonctions de gestionnaire ailleurs - comme dans le constructeur. Dans votre cas, cela pourrait ressembler à ceci:

constructor(props) {
    ....
    this.onCardPress = this.onCardPress.bind(this);
}

...

<Card 
   onCardPress={this.onCardPress}
   message="Hello world!"
/>


0 commentaires

0
votes

Étant donné que vous avez déjà répondu à une autre option comme fonction de flèche dans le message ci-dessus.

class Card extends Component {
   onClick = () => {
      const { onCardPress, message } = this.props;
      onCardPress(message);
    }
    render(){
        const { onCardPress , message } = this.props;
        return(
            <TouchableOpacity
                activeOpacity={0.8}
                onPress={this.onClick}
            />
        )
    }
}


0 commentaires

0
votes

Vous n'avez pas besoin de transmettre la prop de message car vous pouvez y accéder n'importe où dans le composant. Fournissez simplement une fonction dans l'accessoire onPress. Et dans cette fonction, accédez simplement à la prop de message du composant.

class Home extends Component {
  onCardPress = (message) => {
    alert(message)
  }
  render() {
    return (
      <View>
        <Card
          onCardPress={this.onCardPress}
          message="Hello world!"
        />
      </View>
    )
  }
}

class Card extends Component {
  onClick = () => {
    const { message, onCardPress } = this.props;
    onCardPress(message);
  };
  render() {
    return (
      <TouchableOpacity
        activeOpacity={0.8}
        onPress={this.onClick}
      />
    )
  }
}


0 commentaires