Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

137
Vistas
Vue.js muestra los mensajes de chat anteriores sin cambiar la posición de los mensajes actuales en la pantalla

Uso v-for para representar la lista de mensajes. cuando se procesa el primer lote de mensajes, uso scrollIntoView() en el más nuevo para que el contenedor se desplace hacia abajo. a medida que el usuario se desplaza hacia arriba, busco mensajes anteriores para crear un desplazamiento continuo. el problema es que cuando se procesan nuevos mensajes, el desplazamiento va a la parte superior del contenedor.

Intenté guardar la identificación del primer mensaje en la lista antes de actualizar la lista con los mensajes obtenidos y luego volver a desplazarme a ese mensaje, pero provoca un salto en la pantalla por un momento y no es una buena experiencia para el usuario.

¿Cómo puedo anteponer y representar mensajes más antiguos en la lista de mensajes para que los mensajes actuales permanezcan en su lugar dondequiera que estén en la pantalla?

la lista de mensajes se almacena en vuex y la actualizo usando esta acción:

 HandleMessageList({state, commit}, msgList) { const currentMessages = state.messages const updatedMessages = msgList.concat(currentMessages) commit('SET_MESSAGES', updatedMessages) }

y en plantilla:

 <template> <div class=msg-container" ref="messageDisplayArea"> <message-object v-for="msg in msgList" :key="msg.id" /> </div> </template> <script> import {mapState} from "vuex"; export default { name: "MessageDisplay", components: { MessageObject, }, computed: { ...mapState({ msgList: state => state.messages, }), }, updated() { this.$nextTick(() => this.scrollToTarget()) }, mounted() { this.$refs.messageDisplayArea.addEventListener('scroll', this.handleUserScroll) }, beforeDestroy() { this.$refs.messageDisplayArea.removeEventListener('scroll', this.handleUserScroll) }, methods: { scrollToTarget() { // ... scroll back to the position before message list update }, handleUserScroll(e) { const scrollTop = e.target.scrollTop const scrollHeight = e.target.scrollHeight const elementHeight = e.target.offsetHeight if (scrollTop === 0 && elementHeight < scrollHeight) { // ... fetch older messages } }, }, } </script>

versiones:

 vue 2.6.10 vuex 3.0.1
about 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Encontré el comportamiento que quería en este componente Quasar

es un componente de desplazamiento infinito, pero la parte principal es que el desplazamiento puede ser inverso, lo cual es necesario para el desplazamiento de un mensaje de chat.

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda