1
votes

Pourquoi l'argument de fonction renvoie undefined lors de l'utilisation d'accessoires?

Je crée une application en utilisant react-native . J'ai 3 composants à savoir Ind.js , Buttons.js , Rain.js . Je suis obligé de sélectionner une option dans Rain et de l'enregistrer dans l'état Ind pour un traitement ultérieur. Puisque le composant Rain n'est pas directement lié à Ind mais est connecté via un itinéraire de navigation dans Buttons . J'utilise react-navigation .

Pour ce faire, j'ai créé une fonction onSelect () dans Ind qui fait le setState et je l'ai passée à Buttons code> via les accessoires et passé à nouveau à Rain puis j'ai exécuté la fonction, le problème est que la fonction est appelée mais aucun paramètre n'est passé, c'est-à-dire console.logs null puis undefined.

J'ai essayé de console.log les paramètres qui sont passés à Ind code >.

Ind.js

export default class Rain extends Component{
constructor(props){
super(props);
this.state = {
selection: "Test"
}
this.selectOption = this.selectOption.bind(this);
}
selectOption = () => {
this.props.navigation.state.params.selectReport(this.state.selection)
}
}

Buttons.js

export default class Buttons extends Component{
constructor(props){
super(props);
}
render(){
return(
<TouchableOpacity
    onPress={() => {this.props.navigation.navigate('Rain',{
                  selectReport: this.props.selectReport });
                }}>
          <Text style={styles.text}>Rain</Text>
 </TouchableOpacity>
)
}
}

Rain.js

export default class Ind extends Component {
constructor(){
super();
this.state = { report: null}
}
onSelect = (newreport) => {
      this.setState({
        report: newreport
      })
      console.log("Parameter: ", newreport)
      console.log("State: ", this.state.report)
    }

render(){
return(
<Buttons selectReport={() => this.onSelect()}
)

}

}

Le journal de la console renvoie le premier paramètre : undefined State: null ce qui est compréhensible car on ne clique sur rien mais après avoir cliqué, cela s'affiche Paramètre: undefined State: undefined . Qu'est-ce qui se passe? Je suis un débutant et y a-t-il un problème lors de la liaison ou de l'envoi des accessoires? Veuillez expliquer.


0 commentaires

3 Réponses :


0
votes

setState est une fonction asynchrone, c'est pourquoi, après le premier clic, vous obtenez null (car cela n'a pas encore changé) mais quelque part dans votre code, la valeur de newreport est erronée.


3 commentaires

oui, c'est vrai, mais la deuxième fois, il devrait imprimer les valeurs souhaitées, non?


oui mais évidemment quelque part qui passe ne fonctionne pas, pouvez-vous mettre console.log sur chaque composant et vérifier à quel moment est cassé?


Je devrais me connecter à la console Buttons , n'est-ce pas? parce que c'est le milieu? Mais comment dois-je le faire? Dans Ind je l'ai connecté, indéfini et dans Rain j'ai enregistré l'état et la référence de la fonction également .. tout fonctionne très bien.



0
votes

Vous n'avez mis aucun paramètre dans le bouton de clic . Cependant, la fonction reçoit des paramètres en tant que valeurs. Bien sûr, il pointe vers undefind.

onSelect = (newreport) => {
      this.setState({
        report: newreport
      })
      console.log("Parameter: ", newreport)
      console.log("State: ", this.state.report)
    return this.state.report;
    }

render(){
return(
<Buttons selectReport={this.onSelect("value")}
)


3 commentaires

Lorsque je fais cela ... et que je clique sur le bouton Opacité tactile , cela indique que this.props.navigation.state.params.selectreport n'est pas une fonction?


@random_user Il n'y a pas de valeur de résultat dans votre fonction. Veuillez saisir le résultat comme ma réponse.


J'ai fait ce que votre réponse a indiqué ... toujours l'erreur ci-dessus



1
votes

Lorsque vous utilisez la fonction de flèche, vous devez appeler comme,

export default class Ind extends Component {
  constructor(){
   super();
   this.state = { report: null}
  }
  onSelect = (newreport) => {
      console.log("Parameter: ", newreport)
      this.setState({
        report: newreport
      },()=> console.log("State: ", this.state.report)) //prints in callback
  }

  render(){
   return(
    <Buttons selectReport={() => this.onSelect}>
   )
  }
}

également setState est async donc vous devez utiliser callback dans setState pour imprimer la valeur.

Vous devez faire ceci,

<Buttons selectReport={() => this.onSelect} > //without parenthesis


8 commentaires

Quand j'utilise cela donne this.props.navigation.state.params.selectreport n'est pas une fonction mais si j'utilise this.onSelect} cela fonctionne. Pourquoi?


this.onSelect} lie this automatiquement.


Pourquoi est-ce si déroutant ... J'ai des difficultés avec la liaison . pouvez-vous diriger vers certaines ressources?


et qu'en est-il aussi des paramètres? qui a été mentionné dans une autre réponse?


Ce paramètre était statique dans une autre réponse. Lorsque vous passez une fonction au composant enfant et que vous attendez un paramètre de child, vous n'avez pas besoin de parenthèses et de child vous pouvez passer param.


Référez-vous à ceci quand utiliser la fonction de flèche et comment - reactjs.org/docs/faq-functions.html < / a>


Qu'en est-il des paramètres nécessaires comme indiqué par une autre réponse?


Ce paramètre n'est qu'une valeur statique, lorsque vous passez une valeur d'enfant à parent, il ne la remplacera pas et vous obtiendrez une valeur erronée dans parent.