Si j'ai quelque chose comme
<Parent>
<Child1 />
<Child2 />
<Child3 />
</Parent>
Et je veux accéder à partir de Child2
où j'ai refs="child2refs"
Comment puis-je faire ça ?
Si j'ai quelque chose comme
<Parent>
<Child1 />
<Child2 />
<Child3 />
</Parent>
Et je veux accéder à partir de Child2
où j'ai refs="child2refs"
Comment puis-je faire ça ?
S'il ne peut pas être évité, le modèle suggéré extrait de la Documents sur React serait :
import React, { Component } from 'react';
const Child = ({ setRef }) => <input type="text" ref={setRef} />;
class Parent extends Component {
constructor(props) {
super(props);
this.setRef = this.setRef.bind(this);
}
componentDidMount() {
// Calling a function on the Child DOM element
this.childRef.focus();
}
setRef(input) {
this.childRef = input;
}
render() {
return <Child setRef={this.setRef} />
}
}
El Parent transmet une fonction en tant que prop liée à Parent's this
. Lorsque React appelle le L'enfant ref
accessoire setRef
il attribuera le L'enfant ref
à la Parent's childRef
propriété.
Le transfert de référence est une fonction opt-in qui permet à certains composants de prendre une référence qu'ils reçoivent et de la transmettre à un enfant (en d'autres termes, de la "transférer").
Nous créons Composants qui transmettent leur ref
con React.forwardRef
. Le retour Composant ref prop doit être du même type que le type de retour de la fonction React.createRef
. Chaque fois que React monte le noeud du DOM, la propriété current
de la ref
créé avec React.createRef
pointera vers le nœud DOM sous-jacent.
import React from "react";
const LibraryButton = React.forwardRef((props, ref) => (
<button ref={ref} {...props}>
FancyButton
</button>
));
class AutoFocus extends React.Component {
constructor(props) {
super(props);
this.childRef = React.createRef();
this.onClick = this.onClick.bind(this);
}
componentDidMount() {
this.childRef.current.focus();
}
onClick() {
console.log("fancy!");
}
render() {
return <LibraryButton onClick={this.onClick} ref={this.childRef} />;
}
}
Créé Composants transmettent leurs ref
à un nœud enfant.
function logProps(Component) {
class LogProps extends React.Component {
componentDidUpdate(prevProps) {
console.log('old props:', prevProps);
console.log('new props:', this.props);
}
render() {
const {forwardedRef, ...rest} = this.props;
// Assign the custom prop "forwardedRef" as a ref
return <Component ref={forwardedRef} {...rest} />;
}
}
// Note the second param "ref" provided by React.forwardRef.
// We can pass it along to LogProps as a regular prop, e.g. "forwardedRef"
// And it can then be attached to the Component.
return React.forwardRef((props, ref) => {
return <LogProps {...props} forwardedRef={ref} />;
});
}
Ver Transférer les références dans la documentation de React.
Transférer une référence vers le bas depuis le parent ne semble pas être la même chose qu'accéder à une référence enfant depuis le parent.
Ce n'est pas l'exemple que je veux. LibraryButton
n'est pas un class
. Pourriez-vous montrer un exemple dans class LibraryButton extends React.Component
? Merci.
Dans le cas de la transmission des références dans les HOC et les composants connectés, je pense qu'il est utile de mentionner que l'ancienne façon de faire était d'utiliser le paramètre options de la méthode connect. connect(mapStateToProps, null, null, { withRef: true })(Cmp);
et d'accéder à l'instance du composant enveloppé dans, par exemple, un HOC avec la fonction this.wrappedComponentRef.current.getWrappedInstance()
. Voir la section sur Utilisation de réfs sur des composants connectés aquí
Dans le composant parent, ajoutez une référence au composant enfant.
/*
/*
Parent component */ class Parent extends React.Component { componentDidMount() { // Access child component refs via parent component instance like this console.log(this.child.heading.getDOMNode()); }
render() { return ( <div> <Child ref={(node) => { this.child = node; }} /> </div> ); } }
Démonstration : https://codepen.io/itsfadnis/pen/aLWVVx?editors=0011
Je ne sais pas si cela dépend de la version num, mais dans React < 16.3 j'ai pu faire cela sans utiliser getDOMNode()
et utiliser simplement this.child.heading
@IanJMiller la référence est accessible sous la forme suivante this.child.heading
Dans l'exemple, je ne fais qu'imprimer le nœud de domaine qui lui est associé.
Si je console.log(this.props.children) à partir du rendu du composant parent, il affiche undefined :(
Voici un exemple qui se concentrera sur une entrée en utilisant des refs (testé dans React 16.8.6) :
Le composant Enfant :
class Child extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
render() {
return (<input type="text" ref={this.myRef} />);
}
}
Le composant Parent avec le composant Enfant à l'intérieur :
class Parent extends React.Component {
constructor(props) {
super(props);
this.childRef = React.createRef();
}
componentDidMount() {
this.childRef.current.myRef.current.focus();
}
render() {
return <Child ref={this.childRef} />;
}
}
ReactDOM.render(
<Parent />,
document.getElementById('container')
);
Le composant Parent avec this.props.children :
class Parent extends React.Component {
constructor(props) {
super(props);
this.childRef = React.createRef();
}
componentDidMount() {
this.childRef.current.myRef.current.focus();
}
render() {
const ChildComponentWithRef = React.forwardRef((props, ref) =>
React.cloneElement(this.props.children, {
...props,
ref
})
);
return <ChildComponentWithRef ref={this.childRef} />
}
}
ReactDOM.render(
<Parent>
<Child />
</Parent>,
document.getElementById('container')
);
En utilisant le transfert de référence, vous pouvez transmettre la référence du parent à l'enfant.
const FancyButton = React.forwardRef((props, ref) => (
<button ref={ref} className="FancyButton">
{props.children}
</button>
));
// You can now get a ref directly to the DOM button:
const ref = React.createRef();
<FancyButton ref={ref}>Click me!</FancyButton>;
Note Le deuxième argument ref n'existe que lorsque vous définissez un composant avec l'appel React.forwardRef. Les composants fonctionnels ou de classe ordinaires ne reçoivent pas l'argument ref, et ref n'est pas non plus disponible dans les props.
La redirection des références n'est pas limitée aux composants DOM. Vous pouvez également transférer des références à des instances de composants de classe.
Référence : Documentation React.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Pouvez-vous poster votre code react ici ? this.props.children devrait toujours word dans ce cas...
0 votes
Pour accéder à l'enfant, nous pouvons ajouter une référence à celui-ci <Child2 ref="child2" /> et y accéder par this.refs.child. Cela ne fonctionnera pas sur un composant connecté( un composant qui est connecté à redux ou à d'autres plugins ). Nous devons utiliser getWrappedInstance() pour obtenir l'instance enveloppée et ensuite nous pouvons accéder à l'état, aux refs et aux méthodes de ce composant. Voici la vidéo qui l'explique - youtu.be/VpdKjocgCtA
1 votes
Il y a maintenant la possibilité de faire suivre les arbitrages : reactjs.org/docs/forwarding-refs.html
0 votes
@DaveF Mais quand interrogez-vous le sélecteur, et dans combien de temps cet élément sera-t-il remplacé ? Le moins que l'on puisse dire, c'est qu'il n'est pas fiable.