Comme Tushar l'a mentionné, vous pouvez garder un div factice au bas de votre discussion:
render () {
return (
<div>
<div className="MessageContainer" >
<div className="MessagesList">
{this.renderMessages()}
</div>
<div style={{ float:"left", clear: "both" }}
ref={(el) => { this.messagesEnd = el; }}>
</div>
</div>
</div>
);
}
puis faites défiler jusqu'à chaque fois que votre composant est mis à jour (c'est-à-dire que l'état est mis à jour lorsque de nouveaux messages sont ajoutés):
scrollToBottom = () => {
this.messagesEnd.scrollIntoView({ behavior: "smooth" });
}
componentDidMount() {
this.scrollToBottom();
}
componentDidUpdate() {
this.scrollToBottom();
}
J'utilise la norme Element.scrollIntoView méthode ici.
this.messagesEnd.scrollIntoView()
a bien fonctionné pour moi. Il n'y avait aucun besoin d'utiliserfindDOMNode()
.scrollToBottom(){this.scrollBottom.scrollIntoView({ behavior: 'smooth' })}
pour la faire fonctionner dans les versions plus récentesJe veux juste mettre à jour la réponse pour qu'elle corresponde à la nouvelle
React.createRef()
méthode , mais c'est fondamentalement la même chose, gardez simplement à l'esprit lacurrent
propriété dans la référence créée:METTRE À JOUR:
Maintenant que les hooks sont disponibles, je mets à jour la réponse pour ajouter l'utilisation des hooks
useRef
etuseEffect
, la vraie chose à faire de la magie (Refs React etscrollIntoView
méthode DOM) reste la même:Également créé un code et une boîte (très basique) si vous voulez vérifier le comportement https://codesandbox.io/s/scrolltobottomexample-f90lz
la source
this.messagesEnd.current
existe toujours. Néanmoins, il est important de noter que l'appelthis.messagesEnd.current
avant le premier rendu entraînera l'erreur que vous avez signalée. Thnx.this.messagesEnd
contient votre premier exemple de la méthode scrollTo?useEffect
méthode doit être placée avec() => {scrollToBottom()}
. Merci beaucoup quand mêmeNe pas utiliser
findDOMNode
Composants de classe avec ref
Composants fonctionnels avec crochets:
la source
behavior
(impossible de modifier car "les modifications doivent comporter au moins 6 caractères", soupir).scrollIntoView
avecsmooth
est très faible pour le moment.Merci à @enlitement
nous devrions éviter d'utiliser
findDOMNode
, nous pouvons utiliserrefs
pour garder une trace des composantsréférence:
la source
Vous pouvez utiliser
ref
s pour suivre les composants.Si vous connaissez un moyen de définir le
ref
composant d'un composant individuel (le dernier), veuillez poster!Voici ce que j'ai trouvé a fonctionné pour moi:
la source
react-scrollable-feed fait automatiquement défiler jusqu'au dernier élément si l'utilisateur était déjà en bas de la section déroulante. Sinon, il laissera l'utilisateur dans la même position. Je pense que c'est assez utile pour les composants de chat :)
Je pense que les autres réponses ici forceront le défilement à chaque fois, peu importe où se trouvait la barre de défilement. L'autre problème avec
scrollIntoView
est qu'il fera défiler toute la page si votre div à défilement n'était pas visible.Il peut être utilisé comme ceci:
Assurez-vous simplement d'avoir un composant wrapper avec un
height
oumax-height
Clause de non-responsabilité: je suis le propriétaire du colis
la source
Faites référence à votre conteneur de messages.
Trouvez votre conteneur de messages et rendez son
scrollTop
attribut égalscrollHeight
:Evoquez la méthode ci-dessus sur
componentDidMount
etcomponentDidUpdate
.Voici comment j'utilise ceci dans mon code:
la source
J'ai créé un élément vide à la fin des messages et j'ai fait défiler jusqu'à cet élément. Pas besoin de garder une trace des références.
la source
Si vous voulez faire cela avec React Hooks, cette méthode peut être suivie. Pour un div factice a été placé au bas de la discussion. useRef Hook est utilisé ici.
Référence de l'API Hooks: https://reactjs.org/docs/hooks-reference.html#useref
la source
Le moyen le plus simple et le meilleur que je recommanderais est.
Ma version ReactJS: 16.12.0
Structure HTML à l' intérieur de la
render()
fonctionscrollToBottom()
fonction qui obtiendra la référence de l'élément. et faites défiler selon lascrollIntoView()
fonction.et appelez la fonction ci-dessus à l'intérieur
componentDidMount()
etcomponentDidUpdate()
pour plus d'explications sur la
Element.scrollIntoView()
visite developer.mozilla.orgla source
Je n'ai pu obtenir aucune des réponses ci-dessous, mais de simples js ont fait l'affaire pour moi:
la source
Exemple de travail:
Vous pouvez utiliser la
scrollIntoView
méthode DOM pour rendre un composant visible dans la vue.Pour cela, lors du rendu du composant, donnez simplement un ID de référence pour l'élément DOM à l'aide de l'
ref
attribut. Ensuite, utilisez la méthodescrollIntoView
sur lecomponentDidMount
cycle de vie. Je mets juste un exemple de code fonctionnel pour cette solution. Ce qui suit est un composant rendu à chaque fois qu'un message est reçu. Vous devez écrire du code / des méthodes pour rendre ce composant.Voici
this.props.message.MessageId
l'ID unique du message de discussion particulier passé commeprops
la source
la source
J'aime le faire de la manière suivante.
la source
merci 'metakermit' pour sa bonne réponse, mais je pense que nous pouvons l'améliorer un peu, pour faire défiler vers le bas, nous devrions utiliser ceci:
mais si vous voulez faire défiler vers le haut, vous devez utiliser ceci:
et ces codes sont communs:
la source
Comme autre option, il vaut la peine de regarder le composant de défilement de réaction .
la source
En utilisant
React.createRef()
la source
Voici comment résoudre ce problème dans TypeScript (en utilisant la référence vers un élément ciblé vers lequel vous faites défiler):
Pour plus d'informations sur l'utilisation de ref avec React et Typescript, vous pouvez trouver un excellent article ici .
la source
Version complète (Typescript):
la source
Property 'scrollIntoView' does not exist on type 'RefObject<unknown>'.
etType 'HTMLDivElement | null' is not assignable to type 'RefObject<unknown>'. Type 'null' is not assignable to type 'RefObject<unknown>'.
donc ...