5
votes

Impossible d'appeler la méthode du composant enfant à partir du composant parent dans React Native

J'ai un composant React Native qui contient un composant , et je souhaite pouvoir appeler l'une des méthodes de Child dans Parent. Après avoir lu un tas d'autres articles, voici ce que j'ai:

export default class Parent extends Component {
  render() {
    return(
      <View>
        <TouchableOpacity
          onPress={() => this.child.method1()}
        />
        <Child
          onRef={ref => (this.child = ref)}
        />
      </View>
    )
  }
}

Parent

export default class Child extends Component {
  method1() {
    console.log("success");
  }
  render() {
    return(
      <View/>
    )
  }
}

J'obtiens l'erreur "_this2.child.method1 is not a function."

D'autres choses que j'ai essayées utilisent refInput au lieu de onRef , et en faisant ref => {this.child = ref} au lieu de ref => (this.child = ref ) .

Des idées?

Merci!


1 commentaires

toute solution encore


4 Réponses :


2
votes

Une façon de le faire est de passer une fonction à l'enfant, à laquelle l'enfant peut passer une fonction. Par exemple:

<TouchableOpacity
  onPress={() => this.childFunc()}
/>
<Child addMethod={func => this.childFunc = func}/>

Ensuite, appelez simplement le props.addFunc (this.method1) depuis l'intérieur de l'enfant. Assurez-vous simplement que votre ce est celui que vous voulez.

Plus important encore, vous devriez vous demander pourquoi vous devez faire cela en premier lieu .


0 commentaires

0
votes

Utilisez ref pour appeler la méthode enfant

export default class Parent extends Component {
  render() {
    return(
      <View>
        <TouchableOpacity
          onPress={() => this.refs.child.method1()}//<---------
        />
        <Child
          ref="child"//<-------
        />
      </View>
    )
  }
}


1 commentaires

Vous suggérez l'utilisation d'une ancienne API " API héritée: String Refs " " Nous vous déconseillons car les références de chaîne ont certains problèmes sont considérés comme hérités et seront probablement supprimés dans l'une des futures versions ."



5
votes

Vous pouvez créer une référence en utilisant React.createRef dans le constructeur et l'attribuer à l'instance de composant enfant en utilisant ref prop

Publier que vous pouvez accéder à l'enfant en utilisant this.child.current

Exemple de code:

this.child.current.getWrappedInstance()

Démo de travail

IF votre composant enfant est connecté à connect depuis redux, vous pouvez toujours accéder à childRef en définissant l'option withRef sur true dans connect

connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(Child);

Si vous utilisez la version 6 ou supérieure de redux, définir la propriété forwardRef au lieu de withRef

connect(mapStateToProps, mapDispatchToProps, null, { withRef: true })(Child);

Une fois que vous faites cela dans le parent, vous pourrez accéder à la référence cchild avec

class Child extends React.Component {
  myMethod() {
    console.log("myMethod called");
  }

  render() {
    return <Text>This is child</Text>;
  }
}

class App extends Component {
  constructor() {
    super();
    this.child = React.createRef();
  }
  render() {
    return (
      <View style={styles.app}>
        <View style={styles.header}>
          <Image
            accessibilityLabel="React logo"
            source={{ uri: logoUri }}
            resizeMode="contain"
            style={styles.logo}
          />
          <Text style={styles.title}>React Native for Web</Text>
        </View>
        <Child ref={this.child} />
        <Button
          onPress={() => {
            this.child.current.myMethod();
          }}
          title="Example button(Click to trigger Child)"
        />
      </View>
    );
  }
}


14 commentaires

Cela ne fonctionne pas, c'est dire this.child.current.myMethod n'est pas une fonction


Veuillez consulter la démo. Ça marche. Définissez également l'attribut comme une référence sur Child


Pouvez-vous avoir une démo sur mobile, j'ai déjà dit qu'il fonctionnait dans la plateforme web react


Je viens de vérifier votre code dans expo snack, il fonctionne là-bas, mais je ne sais pas pourquoi il ne fonctionne pas sur mon appareil IOS.


Utilisez une fonction distincte pour handlePress comme indiqué dans l'expo


Je pense que le problème est avec ma version native de réaction, bcz je viens de créer une collation expo de mon code, et cela fonctionne dans expo. mais ça ne fonctionne pas sur mon simulateur.


@SagarChavada vous pouvez essayer de mettre à jour votre version de react, react-native et react-dom


Je viens de créer un nouveau projet avec la dernière configuration, mais cela ne fonctionne toujours pas, pour le moment ma version de réaction est ==>. "react": "16.11.0", "react-native": "0.62.2", quel est le vôtre?


assurez-vous que react et react-dom ont tous deux la même version dans votre code


@SagarChavada Ohh, vous enveloppiez votre composant enfant avec connect. Voulez-vous que je change ma réponse pour cela?


@SagarChavada a mis à jour ma réponse pour qu'elle fonctionne également avec connect


voulez-vous dire this.child.current.getWrappedInstance (). methodName () non?


@SagarChavada oui, pour exécuter la méthode


Merci, tu es une bouée de sauvetage



0
votes

J'ai enfin trouvé le problème.

La réponse de @Shubham khatri fonctionnera certainement, elle ne fonctionnera pas uniquement avec redux.

si votre classe enfant est enveloppée avec connect

export default connect(mapStateToProps)(Athletes);

Cela ne fonctionnera pas dans ce cas, alors assurez-vous de l'utiliser de manière normale, si vous voulez appeler une méthode enfant depuis la classe parent.


0 commentaires