Como mencionó Tushar, puedes mantener un div ficticio en la parte inferior de tu chat:
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>
);
}
y luego desplácese hasta él cada vez que se actualice su componente (es decir, estado actualizado a medida que se agregan nuevos mensajes):
scrollToBottom = () => {
this.messagesEnd.scrollIntoView({ behavior: "smooth" });
}
componentDidMount() {
this.scrollToBottom();
}
componentDidUpdate() {
this.scrollToBottom();
}
Estoy usando el método estándar Element.scrollIntoView aquí.
this.messagesEnd.scrollIntoView()
funcionó bien para mí. No hubo necesidad de usarfindDOMNode()
.scrollToBottom(){this.scrollBottom.scrollIntoView({ behavior: 'smooth' })}
que funcione en versiones más nuevasSolo quiero actualizar la respuesta para que coincida con el nuevo
React.createRef()
método , pero es básicamente lo mismo, solo tenga en cuenta lacurrent
propiedad en la referencia creada:ACTUALIZAR:
Ahora que los ganchos están disponibles, estoy actualizando la respuesta para agregar el uso de los ganchos
useRef
yuseEffect
, lo real que hace la magia (las referencias de React y elscrollIntoView
método DOM) sigue siendo el mismo:También hizo un codeandbox (muy básico) si desea verificar el comportamiento https://codesandbox.io/s/scrolltobottomexample-f90lz
fuente
this.messagesEnd.current
siempre existe. Sin embargo, es importante notar que llamarthis.messagesEnd.current
antes del primer render resultará en el error que señaló. Thnx.this.messagesEnd
en su primer ejemplo en el método scrollTo?useEffect
método debe colocarse con() => {scrollToBottom()}
. Muchas gracias de todos modosNo utilice
findDOMNode
Componentes de clase con ref
Componentes funcionales con ganchos:
fuente
behavior
(no se puede editar porque "las ediciones deben tener al menos 6 caracteres", suspiro).scrollIntoView
consmooth
es muy pobre en este momento.Gracias a @enlitement
debemos evitar usar
findDOMNode
, podemos usarrefs
para realizar un seguimiento de los componentesreferencia:
fuente
Puedes usar
ref
s para realizar un seguimiento de los componentes.Si conoce una forma de establecer el valor
ref
de un componente individual (el último), ¡publíquelo!Esto es lo que encontré que funcionó para mí:
fuente
react-scrollable-feed se desplaza automáticamente hacia abajo hasta el último elemento si el usuario ya estaba en la parte inferior de la sección desplazable. De lo contrario, dejará al usuario en la misma posición. Creo que esto es bastante útil para los componentes de chat :)
Creo que las otras respuestas aquí forzarán el desplazamiento cada vez, sin importar dónde esté la barra de desplazamiento. El otro problema
scrollIntoView
es que se desplazará por toda la página si su div desplazable no estaba a la vista.Se puede usar así:
Sólo asegúrese de tener un componente contenedor con una específica
height
omax-height
Descargo de responsabilidad: soy el propietario del paquete
fuente
Haga referencia a su contenedor de mensajes.
Encuentra tu contenedor de mensajes y haz que su
scrollTop
atributo sea igualscrollHeight
:Evocar el método anterior en
componentDidMount
ycomponentDidUpdate
.Así es como estoy usando esto en mi código:
fuente
Creé un elemento vacío al final de los mensajes y me desplacé hasta ese elemento. No es necesario realizar un seguimiento de las referencias.
fuente
Si desea hacer esto con React Hooks, puede seguir este método. Porque se ha colocado un div ficticio en la parte inferior del chat. useRef Hook se utiliza aquí.
Referencia de la API de Hooks: https://reactjs.org/docs/hooks-reference.html#useref
fuente
La mejor y más fácil forma que recomendaría es.
Mi versión de ReactJS: 16.12.0
Estructura HTML dentro de la
render()
funciónscrollToBottom()
función que obtendrá la referencia del elemento. y desplácese según lascrollIntoView()
función.y llama a la función anterior dentro
componentDidMount()
ycomponentDidUpdate()
para obtener más explicaciones sobre la
Element.scrollIntoView()
visita developer.mozilla.orgfuente
No pude hacer que ninguna de las respuestas a continuación funcionara, pero simples js me hicieron el truco:
fuente
Ejemplo de trabajo:
Puede utilizar el
scrollIntoView
método DOM para hacer que un componente sea visible en la vista.Para esto, mientras renderiza el componente, simplemente proporcione una ID de referencia para el elemento DOM usando el
ref
atributo. Luego usa el métodoscrollIntoView
delcomponentDidMount
ciclo de vida. Solo estoy poniendo un código de muestra funcional para esta solución. El siguiente es un componente que se representa cada vez que se recibe un mensaje. Debe escribir código / métodos para renderizar este componente.Aquí
this.props.message.MessageId
está el ID único del mensaje de chat en particular pasado comoprops
fuente
fuente
Me gusta hacerlo de la siguiente manera.
fuente
gracias 'metakermit' por su buena respuesta, pero creo que podemos hacerlo un poco mejor, para desplazarse hacia abajo, deberíamos usar esto:
pero si desea desplazarse hacia arriba, debe usar esto:
y estos códigos son comunes:
fuente
Como otra opción, vale la pena mirar el componente de desplazamiento de reacción .
fuente
Utilizando
React.createRef()
fuente
Así es como resolvería esto en TypeScript (usando la referencia a un elemento de destino al que se desplaza):
Para obtener más información sobre el uso de ref con React y Typescript, puede encontrar un excelente artículo aquí .
fuente
Versión completa (mecanografiado):
fuente
Property 'scrollIntoView' does not exist on type 'RefObject<unknown>'.
yType 'HTMLDivElement | null' is not assignable to type 'RefObject<unknown>'. Type 'null' is not assignable to type 'RefObject<unknown>'.
así ...