Tengo un widget de chat que muestra una variedad de mensajes cada vez que me desplazo hacia arriba. El problema que estoy enfrentando ahora es que el control deslizante permanece fijo en la parte superior cuando se cargan los mensajes. Quiero que se centre en el último elemento del índice de la matriz anterior. Descubrí que puedo hacer referencias dinámicas pasando el índice, pero también necesitaría saber qué tipo de función de desplazamiento usar para lograr eso
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
fuente
fuente
Respuestas:
Reacciona 16.8 +, componente funcional
Haga clic aquí para ver una demostración completa de StackBlits
Reaccionar 16.3 +, componente de clase
Componente de clase: devolución de llamada de referencia
No use referencias de cadena.
Los árbitros de cadena perjudican el rendimiento, no son compostables y están saliendo (agosto de 2018).
recurso1 recurso2
Opcional: suavizar la animación de desplazamiento
Refiriéndose a un niño
Queremos que la referencia se una a un elemento dom, no a un componente de reacción. Entonces, al pasarlo a un componente hijo, no podemos nombrar la referencia de utilería.
Luego adjunte el accesorio de referencia a un elemento dom.
fuente
window.scrollTo(0, offsetTop)
es una mejor opción con mejor soporte entre los navegadores actualesesto funcionó para mí
EDITAR: quería ampliar esto basado en los comentarios.
fuente
Simplemente encuentre la posición superior del elemento que ya ha determinado https://www.w3schools.com/Jsref/prop_element_offsettop.asp y luego desplácese a esta posición a través del
scrollTo
método https://www.w3schools.com/Jsref/met_win_scrollto.aspAlgo como esto debería funcionar:
ACTUALIZAR:
desde Reaccionar v16.3 la
React.createRef()
se prefierefuente
ReactDOM.findDomNode()
es una mejor práctica: dado que React vuelve a representar los componentes, un div que simplemente obtiene por su ID podría no existir para el momento en que llama a la funciónfindDOMNode
. En la mayoría de los casos, puede adjuntar una referencia al nodo DOM y evitar usarlafindDOMNode
.this.myRef.current.scrollIntoView()
lugar dewindow.scrollTo(0, this.myRef)
.El uso de findDOMNode será desaprobado eventualmente.
El método preferido es usar referencias de devolución de llamada.
github eslint
fuente
Ahora puede usar
useRef
desde reaccionar hook APIhttps://reactjs.org/docs/hooks-reference.html#useref
declaración
componente
Utilizar
fuente
console.log
eso, está ejecutando suwindow.scrollTo
declaración (ajustada para mi caso) pero aún no se desplaza. ¿Podría esto estar relacionado con el hecho de que estoy usando un React Bootstrap Modal?También puede usar el
scrollIntoView
método para desplazarse a un elemento dado.fuente
Puede que llegue tarde a la fiesta, pero estaba tratando de implementar referencias dinámicas a mi proyecto de la manera adecuada y toda la respuesta que he encontrado hasta ahora no es tranquilamente satisfactoria para mi gusto, así que se me ocurrió una solución que creo que es simple y utiliza la forma de reacción nativa y recomendada para crear la referencia.
a veces encuentra que la forma en que se escribe la documentación supone que tiene una cantidad conocida de vistas y, en la mayoría de los casos, este número es desconocido, por lo que necesita una forma de resolver el problema en este caso, crear referencias dinámicas al número desconocido de vistas que necesita para mostrar en la clase
así que la solución más simple que se me ocurrió y funcionó a la perfección fue hacer lo siguiente
de esa manera el desplazamiento irá a la fila que esté buscando.
aplausos y espero que ayude a otros
fuente
Jul 2019 - Gancho / función dedicado
Un enlace / función dedicado puede ocultar detalles de implementación y proporciona una API simple a sus componentes.
Reacciona 16.8 + componente funcional
Úselo en cualquier componente funcional.
demo completa
Reaccionar 16.3 + componente de clase
Úselo en cualquier componente de clase.
Demo completa
fuente
Podrías intentarlo de esta manera:
fuente
Puedes usar algo como
componentDidUpdate
fuente
Tuve un escenario simple: cuando el usuario hace clic en el elemento del menú en mi barra de navegación de la interfaz de usuario del material, quiero desplazarlos hacia la sección de la página. Podría usar referencias y enhebrarlas a través de todos los componentes, pero odio enhebrar accesorios de múltiples componentes porque eso hace que el código sea frágil.
Acabo de usar Vanilla JS en mi componente de reacción, resulta que funciona bien. Coloqué una identificación en el elemento al que quería desplazarme y en mi componente de encabezado acabo de hacer esto.
fuente
Sigue estos pasos:
1) Instalar:
2) Importar el paquete:
3) Uso:
fuente
Aquí está el fragmento de código de Componente de clase que puede usar para resolver este problema:
Este enfoque utiliza la referencia y también se desplaza suavemente a la referencia objetivo
fuente
La mejor manera es usar
element.scrollIntoView({ behavior: 'smooth' })
. Esto desplaza el elemento a la vista con una bonita animación.Cuando lo combina con React
useRef()
, se puede hacer de la siguiente manera.Cuando desee desplazarse a un componente Reaccionar, debe reenviar la referencia al elemento representado. Este artículo profundizará en el problema .
fuente
(ref) => window.scrollTo(0, ref.current.offsetTop)
pero luego solo obtuve un pequeño desplazamiento desde la parte superior y no llegué al objetivo. Creo que esto se debió a que la ubicación del árbitro era alguien calculada al principio y luego no actualizada. Su sugerencia solucionó mi problema mientras que la respuesta aceptada no.Lo que funcionó para mí:
fuente
Solo un aviso, no pude hacer que estas soluciones funcionen en los componentes de la interfaz de usuario de materiales. Parece que no tienen la
current
propiedad.Acabo de agregar un vacío
div
entre mis componentes y configuré el accesorio de referencia en eso.fuente
fuente
Para cualquiera que haya leído esto y no haya tenido mucha suerte con las soluciones anteriores o solo quiera una solución sencilla, este paquete funcionó para mí: https://www.npmjs.com/package/react-anchor-link- alisar-desplazamiento . Happy Hacking!
fuente
Utilicé esto dentro de una función onclick para desplazarme suavemente a un div donde su id es "step2Div".
fuente