J'ai un widget de chat qui affiche un tableau de messages à chaque fois que je fais défiler vers le haut. Le problème auquel je suis confronté maintenant est que le curseur reste fixe en haut lorsque les messages se chargent. Je veux qu'il se concentre sur le dernier élément d'index du tableau précédent. J'ai compris que je pouvais créer des références dynamiques en passant un index, mais j'aurais également besoin de savoir quel type de fonction de défilement utiliser pour y parvenir
handleScrollToElement(event) {
const tesNode = ReactDOM.findDOMNode(this.refs.test)
if (some_logic){
//scroll to testNode
}
}
render() {
return (
<div>
<div ref="test"></div>
</div>)
}
javascript
reactjs
ecmascript-6
Edmamerto
la source
la source
Réponses:
React 16.8 +, composant fonctionnel
Cliquez ici pour une démo complète sur StackBlits
React 16.3 +, composant de classe
Composant de classe - Rappel de référence
N'utilisez pas de références String.
Les références de chaîne nuisent aux performances, ne sont pas composables et sont en voie de disparition (août 2018).
ressource1 ressource2
Facultatif: animation de défilement lisse
Passer ref à un enfant
Nous voulons que la référence soit attachée à un élément dom, pas à un composant de réaction. Ainsi, lorsque nous le passons à un composant enfant, nous ne pouvons pas nommer la référence prop.
Ensuite, attachez le prop de référence à un élément dom.
la source
window.scrollTo(0, offsetTop)
est une meilleure option avec un meilleur support parmi les navigateurs actuelscela a fonctionné pour moi
EDIT: Je voulais développer cela en fonction des commentaires.
la source
Trouvez simplement la position supérieure de l'élément que vous avez déjà déterminé https://www.w3schools.com/Jsref/prop_element_offsettop.asp puis faites défiler jusqu'à cette position via la
scrollTo
méthode https://www.w3schools.com/Jsref/met_win_scrollto.aspQuelque chose comme ça devrait fonctionner:
METTRE À JOUR:
depuis React v16.3 le
React.createRef()
est préféréla source
ReactDOM.findDomNode()
est une meilleure pratique - puisque React restitue les composants, un div que vous obtenez simplement par son ID peut ne pas exister au moment où vous appelez la fonctionfindDOMNode
. Dans la plupart des cas, vous pouvez attacher une référence au nœud DOM et éviter d'utiliserfindDOMNode
du tout.this.myRef.current.scrollIntoView()
place dewindow.scrollTo(0, this.myRef)
.L'utilisation de findDOMNode sera finalement obsolète.
La méthode préférée consiste à utiliser des références de rappel.
github eslint
la source
Vous pouvez maintenant utiliser l'
useRef
API React Hookhttps://reactjs.org/docs/hooks-reference.html#useref
déclaration
composant
Utilisation
la source
console.log
cela, il exécute votrewindow.scrollTo
déclaration (ajustée pour mon cas) mais pourtant elle ne défile pas. Cela pourrait-il être lié au fait que j'utilise un React Bootstrap Modal?Vous pouvez également utiliser la
scrollIntoView
méthode pour faire défiler jusqu'à un élément donné.la source
Je suis peut-être en retard à la fête, mais j'essayais de mettre en œuvre des références dynamiques à mon projet de la bonne manière et toutes les réponses que j'ai trouvées jusqu'à ce que je sache ne sont pas satisfaisantes à mon goût, alors j'ai trouvé une solution qui, je pense, est simple et utilise la manière native et recommandée de réagir pour créer la ref.
Parfois, vous trouvez que la façon dont la documentation est écrite suppose que vous avez une quantité connue de vues et dans la plupart des cas, ce nombre est inconnu, vous avez donc besoin d'un moyen de résoudre le problème dans ce cas, créez des références dynamiques pour le nombre inconnu de vues dont vous avez besoin à montrer en classe
donc la solution la plus simple à laquelle je pouvais penser et qui fonctionnait parfaitement était de faire comme suit
de cette façon, le défilement ira à la ligne que vous recherchez.
bravo et espère que cela aide les autres
la source
Juil 2019 - Crochet / fonction dédié
Un hook / fonction dédié peut masquer les détails de l'implémentation et fournit une API simple à vos composants.
React 16.8 + Composant fonctionnel
Utilisez-le dans n'importe quel composant fonctionnel.
démo complète
Composant de classe React 16.3 +
Utilisez-le dans n'importe quel composant de classe.
Démo complète
la source
Vous pouvez essayer de cette façon:
la source
Vous pouvez utiliser quelque chose comme
componentDidUpdate
la source
J'ai eu un scénario simple, lorsque l'utilisateur clique sur l'élément de menu dans ma barre de navigation de l'interface utilisateur matérielle, je veux les faire défiler jusqu'à la section de la page. Je pourrais utiliser des refs et les passer à travers tous les composants, mais je déteste les accessoires de threading avec plusieurs composants car cela rend le code fragile.
Je viens d'utiliser vanilla JS dans mon composant de réaction, il s'avère que cela fonctionne très bien. J'ai placé un identifiant sur l'élément vers lequel je voulais faire défiler et dans mon composant d'en-tête, je viens de le faire.
la source
Suivez ces étapes:
1) installer:
2) Importez le package:
3) utilisation:
la source
Voici l' extrait de code du composant de classe que vous pouvez utiliser pour résoudre ce problème:
Cette approche a utilisé la référence et défile également en douceur vers la référence cible
la source
La meilleure façon est d'utiliser
element.scrollIntoView({ behavior: 'smooth' })
. Cela fait défiler l'élément en vue avec une belle animation.Lorsque vous le combinez avec React
useRef()
, cela peut être fait de la manière suivante.Lorsque vous souhaitez faire défiler jusqu'à un composant React, vous devez transmettre la référence à l'élément rendu. Cet article approfondira le problème .
la source
(ref) => window.scrollTo(0, ref.current.offsetTop)
mais n'obtenais qu'un petit décalage par rapport au sommet et n'atteignais pas la cible. Je crois que c'était parce que l'emplacement de l'arbitre était quelqu'un calculé au début et ensuite non mis à jour. Votre suggestion a résolu mon problème, contrairement à la réponse acceptée.Ce qui a fonctionné pour moi:
la source
Attention, je ne pouvais pas faire fonctionner ces solutions sur les composants de l'interface matérielle. On dirait qu'ils n'ont pas la
current
propriété.Je viens d'ajouter un vide
div
parmi mes composants et de définir l'accessoire de référence dessus.la source
la source
Pour tous ceux qui lisent ceci qui n'ont pas eu beaucoup de chance avec les solutions ci-dessus ou qui veulent simplement une solution simple, ce package a fonctionné pour moi: https://www.npmjs.com/package/react-anchor-link- défilement lisse . Bon piratage!
la source
J'ai utilisé ceci dans une fonction onclick pour faire défiler en douceur jusqu'à un div où son id est "step2Div".
la source