J'ai deux composants. Un parent et un enfant.
À l'intérieur du composant parent, j'ai un bouton. Si l'utilisateur clique sur ce bouton, je veux faire un ScrollIntoView vers un autre bouton à l'intérieur du composant enfant.
Je suppose que je veux définir une référence au bouton de l'enfant de sorte que je puisse, à l'intérieur de l'événement onClick du bouton parent, faire un :
ref.scrollIntoView({block: 'end', behavior: 'smooth'});
qui fera défiler jusqu'au bouton dans le composant enfant.
Voici un exemple simplifié :
Fichier ParentComponent.jsx
import React, {useRef} from 'react';
import ChildComponent from './ChildComponent';
const ParentComponent = props => {
const childReference = useRef(null);
const onClick = () => {
childReference.scrollIntoView({block: 'end', behavior: 'smooth'});
}
return (
<>
<...some other components>
Cliquez pour être redirigé
);
};
Fichier ChildComponent.jsx
import React from 'react';
const ChildComponent = (props, ref) => {
const { name, value, description } = props;
return (
<...some other components>
Vous devriez être redirigé vers moi
);
};
ChildComponent.propTypes = {
name: PropTypes.string.isRequired,
value: PropTypes.number,
description: PropTypes.string,
};
ChildComponent.defaultProps = {
value: 0,
description: '',
};
export default React.forwardRef(ChildComponent);
Je sais que le code ci-dessus ne fonctionne pas, c'était juste pour illustrer ce que j'essaie de réaliser.
J'ai vraiment essayé toutes les autres solutions que j'ai pu trouver en faisant des recherches sur Google et elles semblent toutes si faciles, mais aucune ne semble fonctionner pour mon cas d'utilisation. J'ai également essayé d'utiliser forwardRef, mais cela ne résout pas mon problème.
MISE À JOUR
Je suppose que j'ai été un peu vague sur ce qui ne fonctionne pas. J'ai reçu beaucoup de messages d'erreur différents avec la mise en œuvre.
Voici l'un d'entre eux:
Les composants de fonction ne peuvent pas recevoir de références. Les tentatives d'accès à cette référence échoueront. Vouliez-vous utiliser React.forwardRef()?
Solution
D'accord. Je pensais rassembler les éléments ici avec la solution fournie par @Vencovsky.
Voici l'implémentation complète avec les deux exemples de composants vus dans la question :
Fichier ParentComponent.jsx
import React, { useRef } from 'react';
import ChildComponent from './ChildComponent';
const ParentComponent = props => {
const childReference = useRef(null);
const scrollIntoView = () => {
childReference.current.scrollIntoView({block: 'center', inline: 'center', behavior: 'smooth'});
}
return (
<>
<...some other component>
Cliquez pour être redirigé
);
};
export default ParentComponent;
Fichier ChildComponent.jsx
import React, {forwardRef} from 'react';
import PropTypes from 'prop-types';
const ChildComponent = forwardRef((props, ref) => {
const { name, value, description } = props;
return(
<>
<...some other components>
Vous devriez être redirigé vers moi
);
});
ChildComponent.propTypes = {
name: PropTypes.string.isRequired,
value: PropTypes.number,
description: PropTypes.string,
};
ChildComponent.defaultProps = {
value: 0,
description: '',
};
export default ChildComponent;