CursosEmpresasBlogLiveConfPrecios

Actions

Clase 5 de 8 • Curso de Vue.js: Manejo del Estado con Pinia

Clase anteriorSiguiente clase

Contenido del curso

Introducción
  • 1
    De Vuex a Pinia

    De Vuex a Pinia

    03:01
Conceptos fundamentales
  • 2
    Instalación y boilerplate de Pinia

    Instalación y boilerplate de Pinia

    09:23
  • 3
    defineStore y state

    defineStore y state

    15:22
  • 4
    Getters

    Getters

    12:52
  • 5
    Actions

    Actions

    16:02
  • 6
    Uso fuera de componentes

    Uso fuera de componentes

    11:23
Cierre del curso
  • 7
    Diferencias entre Vuex y Pinia

    Diferencias entre Vuex y Pinia

    05:03
  • 8
    Despedida

    Despedida

    02:22
    Ameth Ordoñez Erazo

    Ameth Ordoñez Erazo

    student•
    hace 3 años

    Para lograr enviar un mensaje presionando la tecla Enter, pueden hacer lo siguiente: En MessagesView.vue, el footer lo deje igual, solo agregando un v-on con el evento keyUp:

    <footer> <textarea rows="3" v-model="newMessage" @keyup.enter="sendMessage" ></textarea> <button @click="sendMessage"> <Icon icon="carbon:send-alt" /> </button> </footer>

    La función sendMessage queda así:

    const sendMessage = () => { addMessage({ message: newMessage.value, channelId: channelId.value, }); newMessage.value = ""; scrollToBottom(); };

    Y addMessage es una actions (función) en messages.js:

    const addMessage = (newMessage) => { messages.value.push({ id: Date.now(), author: 1, message: newMessage.message, timestamp: new Date().toLocaleTimeString(), read: false, channelId: parseInt(newMessage.channelId), }); };
    kenedy carlos de la torre mendoza

    kenedy carlos de la torre mendoza

    student•
    hace 3 años

    Aun tengo la duda cuando declaro una action y lo veo en el navegador solo esta disponible cuando el componente que lo usa esta activo - pero en vuex todo el tiempo esta disponible - esto es correcto?

      Diana Martinez

      Diana Martinez

      student•
      hace 3 años

      Si, me parece que es correcto.

    Ana Selene Zarate Lopez

    Ana Selene Zarate Lopez

    student•
    hace 3 años

    Profesora Diana logre hacer el reto!! comparto mi solución En channels.js añadi este getter![](

    carbon.png
    Y en MessageView.vue importe mi channelsStore y añadi la constante del mismo, al final en la linea 62 en mi template lo mande llamar ![](
    carbon (1).png
    y funciono! gracias profesora, me ayudo muchisimo!

      Julian David Alzate Cuervo

      Julian David Alzate Cuervo

      student•
      hace 2 años

      excelente solución, gracias por compartir, me basé en la tuya apra implementar en mi código

    Rene Linares

    Rene Linares

    student•
    hace 2 años

    Hola👋🏻 No me queda algo claro: Por qué para acceder al state dentro del mismo modulo para los getters pasamos el state por parámetro sin embargo para los actions accedemos a través del contexto this? Funcionaría la misma lógica, solo que al revés? Es decir, usar this dentro de un getter para acceder al state y en el caso de los actions pasar el state como un parámetro?

      Diana Martinez

      Diana Martinez

      student•
      hace 2 años

      Esta es una aplicación de ejemplo, lo que te haga más sentido, si funciona, está bien.

    Lavinia Manzanarez

    Lavinia Manzanarez

    student•
    hace un año

    Este es el getter que agregué en el stor de channels:

    getChannelTitle: (state) => (channelId) => { return state.channels.find((channel) => channel.id == channelId).name ?? 'No channel name'; }
    Lavinia Manzanarez

    Lavinia Manzanarez

    student•
    hace un año

    La parte de los mensajes no me estaba funcionando, en caso de que se encuentren con algo parecido. Lo resolví forzando el valor a tipo numero. En MessagesView.vue:

    channelId.value = Number(id);
    Axlin Miranda

    Axlin Miranda

    student•
    hace 2 años

    Saludos, comparto mi solución:

    En el store de channels le anexe en el getter:

    getChannelById: (state) => (channelId) => {          return state.channels.find(channel => channel.id === channelId)        } ```En el store de messages le anexe en el getter: ```js getCountContact: (state) => (channelId) => { const contactStore = useContactStore(); return state.messages.filter(message => message.channelId === channelId) .map(message => { const user = contactStore.getContactById(message.author) return { ...user } }) } ```En el archivo MessageView: ```js watch( () => route.params.id, (id) => { channelId.value = Number(id); scrollToBottom(); const channel = channelStore.getChannelById(channelId.value); if (channel) { title.value = channel.name; people.value = messageStore.getCountContact(channelId.value); } }, { immediate: true } );
    SANTIAGO  OCHOA

    SANTIAGO OCHOA

    student•
    hace 2 años

    mi codigo para mostrar los contactos de una conversacion

    const contactsView = computed(() => messagesView.value.reduce((acc, currentValue) => { if (!acc?.includes(currentValue.author.id)) { acc.push(currentValue.author.id) } return acc; }, []) .map(author_id => contactsStore.getContactById(author_id)));

    Felix Torres Javier Antonio

    Felix Torres Javier Antonio

    student•
    hace 3 años

    Agregué el mismo watch que estaba en la vista de mensajes, para cambiar los titulos del header dinamicamente.

    Screen Shot 2022-10-05 at 8.32.17.png
    Uriel Solis Salinas

    Uriel Solis Salinas

    student•
    hace 3 años

    Respecto a los retos, yo así los solucioné: .

    • Reto avatares en la parte de arriba:
    // MessagesView.js // Función para ver los avatares de los contactos que están en el canal const contactsView = computed(() => { const contacts = messagesView.value.map((message) => message.author); // Se obtienen los contactos que enviaron mensajes en el canal return contacts.filter((contact, index) => { // Se filtran los contactos para que no se repitan // contact => Contacto actual // index => Índice del contacto actual return contacts.findIndex((c) => c.id === contact.id) === index; // Se retorna el índice del primer contacto que coincida con el actual }); }); // En el template: <div class="people-item" v-for="contact in contactsView" :key="contact.id" > <img :src="contact.avatar" :alt="contact.name" /> </div>
    • Reto actualizar el titulo del canal:
    const updateTitle = () => { const channel = channelsStore.channels.find( (channel) => channel.id === channelId.value ); // Se obtiene el canal actual if (channel) { title.value = channel.name; // Se actualiza el nombre del canal } else { title.value = "Nombre del canal"; } }; watch( // Cuando cambia el ID del canal actual, se actualizan los datos del canal. () => route.params.id, (id) => { channelId.value = parseInt(id); // Se actualiza el ID del canal actual scrollToBottom(); updateTitle(); }, { immediate: true } );

    Cualquier duda me pueden preguntar!!

    Felix Torres Javier Antonio

    Felix Torres Javier Antonio

    student•
    hace 3 años

    No me la compliqué y para mostrar los contactos, solo agregué un array de canales en el store de contactos.

    cree un componente de contactos y solo mostré las fotos.

    contacts: [ { id: 1, name: "Tú", avatar: "/avatars/avatar.jpeg", channels:[1,4,5] }, { id: 2, name: "Jason", avatar: "/avatars/avatar-02.jpg", channels:[1,4]}, { id: 3, name: "Janet", avatar: "/avatars/avatar-03.jpg", channels:[1,2]}, ],
    Screen Shot 2022-10-05 at 9.47.30.png
      Diego Fernando Leyton Ledesma

      Diego Fernando Leyton Ledesma

      student•
      hace 3 años

      Hermano una pregunta, ¿Cómo hiciste para ubicar los avatars en el extremo superior derecho?, yo lo intenté asignándole un space-beetwen al contenedor padre mas cercano, pero al estar la etiqueta img dentro de un bucle se ve de esta manera

      Screenshot_1.png

    Ruben Gallegos Hernandez

    Ruben Gallegos Hernandez

    student•
    hace 3 años

    Para el nombre del chat creé un getter dentro de channels.js que recibe el channelId, busca por el id y luego retorna solo el nombre.

    getters:{ getTitleChannel : (state) => (channelId) => state.channels.find((channel) => channel.id === channelId).name, }

    En lo de las imágenes no sabía como quitar los duplicados que obtenía al listar cada autor de la lista de mensajes. Así que me puse a investigar y encontré una solución con filter y findIndex y así pude quitar los duplicados. Este código lo agregé dentro de contacts.js

    getters:{ getContactsByChannelId : (state) => (channelId) =>{ const messagesStore = useMessagesStore(); return messagesStore.findMessagesByChannelId(channelId) .map((message)=>{ return state.getContactById(message.author) }) .filter((contact,index,listContacts)=>{ return index == listContacts.findIndex((elementList)=>{ return elementList.id ==contact.id }) }) }, }

    Igual cualquier sugerencia es recibida ya que sigo aprendiendo Js 😄

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads