Come creare un'app di chat React.js in 10 minuti

Come apparirà l'app che costruiremo.

In questo articolo ti mostrerò il modo più semplice possibile per creare un'applicazione di chat utilizzando React.js. Sarà eseguito interamente senza codice lato server, poiché consentiremo all'API di Chatkit di gestire il back-end.

Suppongo che tu conosca JavaScript di base e che tu abbia già incontrato un po 'di React.js prima. A parte questo, non ci sono prerequisiti.

Nota: ho anche creato un corso gratuito completo su come creare un'app di chat React.js qui:
Fai clic sull'immagine per accedere al corso.

Se segui questo tutorial finirai con la tua applicazione di chat alla fine, su cui puoi ulteriormente approfondire se lo desideri.

Iniziamo!

Passaggio 1: suddivisione dell'interfaccia utente in componenti

React è costruito attorno ai componenti, quindi la prima cosa che vuoi fare quando crei un'app è quella di dividere l'interfaccia utente in componenti.

Iniziamo disegnando un rettangolo attorno all'intera app. Questo è il componente principale e l'antenato comune per tutti gli altri componenti. Chiamiamola app:

Dopo aver definito il componente radice, è necessario porsi la seguente domanda:

Quali figli diretti ha questo componente?

Nel nostro caso, ha senso dargli tre componenti figlio, che chiameremo quanto segue:

  • Titolo
  • MessagesList
  • SendMessageForm

Disegniamo un rettangolo per ciascuno di questi:

Questo ci offre una bella panoramica dei diversi componenti e dell'architettura alla base della nostra app.

Avremmo potuto continuare a chiederci quali figli hanno di nuovo questi componenti. Quindi avremmo potuto suddividere l'interfaccia utente in un numero ancora maggiore di componenti, ad esempio trasformando ciascuno dei messaggi nei propri componenti. Tuttavia, ci fermeremo qui per motivi di semplicità.

Passaggio 2: impostazione della base di codice

Ora dovremo configurare il nostro repository. Useremo la struttura più semplice possibile: un file index.html con collegamenti a un file JavaScript e un foglio di stile. Stiamo anche importando Chatkit SDK e Babel, che viene utilizzato per trasformare il nostro JSX:

Ecco un parco giochi Scrimba con il codice finale per il tutorial. Ti consiglio di aprirlo in una nuova scheda e giocarci ogni volta che ti senti confuso.

Fai clic sull'immagine per sperimentare l'intera base di codice.

In alternativa, è possibile scaricare il progetto Scrimba come file .zip ed eseguire un semplice server per farlo funzionare a livello locale.

Passaggio 3: creazione del componente radice

Con il repository in atto, siamo in grado di iniziare a scrivere del codice React, che faremo all'interno del file index.js.

Cominciamo con il componente principale, l'app. Questo sarà il nostro unico componente "intelligente", poiché gestirà i dati e la connessione con l'API. Ecco la configurazione di base per esso (prima di aver aggiunto qualsiasi logica):

class App estende React.Component {
  
  render () {
    ritorno (
      
                                     )   }
}

Come puoi vedere, esegue semplicemente il rendering di tre elementi secondari: i componenti , <MessageList> e <SendMessageForm>.</p><p>Lo renderemo un po 'più complesso, poiché i messaggi di chat dovranno essere archiviati nello stato di questo componente dell'app. Questo ci consentirà di accedere ai messaggi tramite this.state.messages e quindi di passarli ad altri componenti.</p><p>Inizieremo con l'utilizzo di dati fittizi in modo da poter comprendere il flusso di dati dell'app. Quindi lo sostituiremo con dati reali dall'API di Chatkit in seguito.</p><p>Creiamo una variabile DUMMY_DATA:</p><pre>const DUMMY_DATA = [   {     senderId: "perborgen",     testo: "chi vincerà?"   },   {     senderId: "janedoe",     testo: "chi vincerà?"   } ]</pre><p>Quindi aggiungeremo questi dati allo stato dell'app e li passeremo al componente MessageList come prop.</p><pre>class App estende React.Component {      constructor () {     super()     this.state = {        messaggi: DUMMY_DATA     }   }      render () {     ritorno (       <div className = "app">         <Messaggi MessageList = {this.state.messages} />         <SendMessageForm />      </ Div>     )   }</pre><pre>}</pre><p>Qui stiamo inizializzando lo stato nel costruttore e stiamo anche trasmettendo this.state.messages a MessageList.</p><blockquote>Tieni presente che stiamo chiamando super () nel costruttore. È necessario farlo se si desidera creare un componente con stato.</blockquote><h3>Passaggio 4: rendering dei messaggi fittizi</h3><p>Vediamo come possiamo rendere questi messaggi fuori nel componente MessageList. Ecco come appare:</p><pre>class MessageList estende React.Component {   render () {     ritorno (       <ul className = "message-list">         {this.props.messages.map (message => {           ritorno (            <li key = {message.id}>              <Div>                {} Message.senderId              </ Div>              <Div>                {messaggio di testo}              </ Div>            </ Li>          )        })}      </ Ul>     )   } }</pre><p>Questo è un cosiddetto componente stupido. Ci vuole un puntello, i messaggi, che contiene una matrice di oggetti. E poi stiamo semplicemente estraendo il testo e le proprietà del mittente dagli oggetti.</p><p>Con i nostri dati fittizi che fluiscono in questo componente, verrà visualizzato quanto segue:</p><img alt="" src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/ceadesc/1568822281416.png" /><p>Quindi ora abbiamo la struttura di base per la nostra app e siamo anche in grado di renderizzare i messaggi. Ottimo lavoro!</p><p>Ora sostituiamo i nostri dati fittizi con messaggi reali da una chat room!</p><h3>Passaggio 5: recupero delle chiavi API da Chatkit</h3><p>Per ricevere messaggi, dobbiamo collegarci all'API di Chatkit. E per farlo, ovviamente dobbiamo ottenere le chiavi API.</p><p>A questo punto, voglio incoraggiarti a seguire i miei passi in modo che tu possa avere la tua applicazione di chat attiva e funzionante. Puoi usare il mio parco giochi Scrimba per testare le tue chiavi API.</p><p>Inizia creando un account gratuito qui. Una volta fatto, vedrai la tua dashboard. Qui è dove crei nuove istanze di Chatkit. Creane uno e dagli il nome che preferisci:</p><img alt="" src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/ceadesc/1568822282720.png" /><p>Quindi verrai indirizzato all'istanza appena creata. Qui dovrai copiare quattro valori:</p><ul><li>Localizzatore istanza</li><li>Provider di token di prova</li><li>ID camera</li><li>Nome utente</li></ul><p>Inizieremo con l'istanza Locator:</p><img alt="È possibile copiare utilizzando l'icona sul lato destro del Localizzatore istanza." src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/ceadesc/1568822284773.png" /><p>E se scorri un po 'verso il basso troverai il Provider token di prova:</p><img alt="Nota: dovrai accedere alla casella ABILITATO per accedere al token." src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/ceadesc/1568822287062.png" /><p>Il prossimo passo è creare un utente e una stanza, che viene fatto sulla stessa pagina. Tieni presente che dovrai prima creare un utente, quindi sarai in grado di creare una stanza, che ti darà nuovamente accesso all'identificatore della stanza.</p><img alt="Scegli un nome utente, crea una stanza, quindi copia il nome utente e l'id della stanza." src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/ceadesc/1568822290410.png" /><p>Quindi ora hai trovato i tuoi quattro identificatori. Molto bene!</p><p>Tuttavia, prima di tornare alla base di codice, voglio che invii manualmente anche un messaggio dalla dashboard di Chatkit, poiché ciò ci aiuterà nel prossimo capitolo.</p><p>Ecco come farlo:</p><img alt="Invio di un messaggio dall'interfaccia utente di Chatkit" src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/ceadesc/1568822292928.png" /><p>Questo è così che abbiamo effettivamente un messaggio da renderizzare nel prossimo passaggio.</p><h3>Passaggio 6: rendering dei messaggi di chat reali</h3><p>Ora torniamo al nostro file index.js e memorizziamo questi quattro identificatori come variabili nella parte superiore del nostro file.</p><p>Ecco i miei, ma ti incoraggio a crearne uno tuo:</p><pre>const instanceLocator = "v1: us1: dfaf1e22-2d33-45c9-b4f8-31f634621d24"</pre><pre>const testToken = "https://us1.pusherplatform.io/services/chatkit_token_provider/v1/dfaf1e22-2d33-45c9-b4f8-31f634621d24/token"</pre><pre>const username = "perborgen"</pre><pre>const roomId = 9796712</pre><p>E con questo in atto, siamo finalmente pronti per connetterci con Chatkit. Ciò accadrà nel componente App, e più precisamente nel metodo componentDidMount. Questo è il metodo che dovresti usare quando colleghi i componenti di React.js alle API.</p><p>Per prima cosa creeremo un chatManager:</p><pre>componentDidMount () {   const chatManager = new Chatkit.ChatManager ({     instanceLocator: instanceLocator,     userId: nome utente,     tokenProvider: nuovo Chatkit.TokenProvider ({       url: testToken     })  })</pre><p>... e poi dochatManager.connect () per connettersi con l'API:</p><pre>  chatManager.connect (). then (currentUser => {       currentUser.subscribeToRoom ({       roomId: roomId,       ganci: {         onNewMessage: message => {           this.setState ({             messaggi: [... this.state.messages, message]           })         }       }     })   }) }</pre><p>Questo ci dà accesso all'oggetto currentUser, che è l'interfaccia per l'interazione con l'API.</p><blockquote>Nota: poiché avremo bisogno di usecurrentUser in seguito, archiviarlo nell'istanza facendo this.currentUser = currentUser.</blockquote><p>Quindi, chiamiamo currentUser.subscribeToRoom () e passiamo la nostra roomId e un hook onNewMessage.</p><p>L'hook onNewMessage viene attivato ogni volta che un nuovo messaggio viene trasmesso nella chat room. Quindi ogni volta che succede, aggiungeremo semplicemente il nuovo messaggio alla fine di this.state.messages.</p><p>Ciò comporta l'app che recupera i dati dall'API e quindi li rende fuori nella pagina.</p><img alt="" src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/ceadesc/1568822294654.png" /><p>È fantastico, dato che ora abbiamo lo scheletro per la nostra connessione client-server.</p><p>Woohoo!</p><h3>Passaggio 7: gestione dell'input dell'utente</h3><p>La prossima cosa che dovremo creare è il componente SendMessageForm. Questo sarà un cosiddetto componente controllato, il che significa che il componente controlla ciò che viene reso nel campo di input tramite il suo stato.</p><p>Dai un'occhiata al metodo render () e presta particolare attenzione alle linee che ho evidenziato:</p><pre>class SendMessageForm estende React.Component {   render () {     ritorno (       <form         className = "send-messaggio-form">         <input           onChange = {} this.handleChange           value = {} this.state.message           placeholder = "Digita il tuo messaggio e premi INVIO"           type = "text" />       </ Form>     )   } }</pre><p>Stiamo facendo due cose:</p><ol><li>Ascolto degli input dell'utente con il listener di eventi onChange, in modo da poter attivare il metodo handleChange</li><li>Impostazione esplicita del valore del campo di input utilizzando this.state.message</li></ol><p>La connessione tra questi due passaggi si trova all'interno del metodo handleChange. Aggiorna semplicemente lo stato a qualunque tipo di utente digiti nel campo di input:</p><pre>handleChange (e) {   this.setState ({     messaggio: e.target.value   }) }</pre><p>Ciò innesca un nuovo rendering e poiché il campo di input viene impostato esplicitamente dallo stato usando value = {this.state.message}, il campo di input verrà aggiornato.</p><p>Quindi, anche se l'app sembra immediata all'utente quando digita qualcosa nel campo di input, i dati passano effettivamente attraverso lo stato prima che React aggiorni l'interfaccia utente.</p><p>Per concludere questa funzione, dobbiamo dare al componente un costruttore. In esso, inizializzeremo entrambi lo stato e lo assoceremo nel metodo handleChange:</p><pre>constructor () {     super()     this.state = {        Messaggio: ''     }     this.handleChange = this.handleChange.bind (this) }</pre><p>Dobbiamo associare il metodo handleChange in modo da avere accesso a questa parola chiave al suo interno. Ecco come funziona JavaScript: per impostazione predefinita, questa parola chiave non è definita nel corpo di una funzione.</p><h3>Passaggio 8: invio di messaggi</h3><p>Il nostro componente SendMessageForm è quasi finito, ma dobbiamo anche occuparci dell'invio del modulo. Dobbiamo recuperare i messaggi e inviarli!</p><p>Per fare ciò agganceremo un gestore handleSubmit anche con il listener di eventi onSubmit nel <form>.</p><pre>render () {     ritorno (       <form         onSubmit = {} this.handleSubmit         className = "send-messaggio-form">         <input           onChange = {} this.handleChange           value = {} this.state.message           placeholder = "Digita il tuo messaggio e premi INVIO"           type = "text" />       </ Form>     )   }</pre><p>Dato che abbiamo il valore del campo di input memorizzato in this.state.message, in realtà è abbastanza facile passare i dati corretti insieme all'invio. Faremo semplicemente:</p><pre>handleSubmit (e) {   e.preventDefault ()   this.props.sendMessage (this.state.message)   this.setState ({     Messaggio: ''   }) }</pre><p>Qui, stiamo chiamando il prop sendMessage e passiamo this.state.message come parametro. Potresti essere un po 'confuso da questo, poiché non abbiamo ancora creato il metodo sendMessage. Tuttavia, lo faremo nella sezione successiva, poiché tale metodo è presente all'interno del componente App. Quindi non preoccuparti!</p><p>In secondo luogo, cancelliamo il campo di input impostando this.state.message su una stringa vuota.</p><p>Ecco l'intero componente SendMessageForm. Si noti che abbiamo anche associato questo al metodo handleSubmit:</p><pre>class SendMessageForm estende React.Component {   constructor () {     super()     this.state = {       Messaggio: ''     }     this.handleChange = this.handleChange.bind (this)     this.handleSubmit = this.handleSubmit.bind (this)   }</pre><pre>  handleChange (e) {     this.setState ({       messaggio: e.target.value     })   }</pre><pre>  handleSubmit (e) {     e.preventDefault ()     this.props.sendMessage (this.state.message)     this.setState ({       Messaggio: ''     })   }</pre><pre>  render () {     ritorno (       <form         onSubmit = {} this.handleSubmit         className = "send-messaggio-form">         <input           onChange = {} this.handleChange           value = {} this.state.message           placeholder = "Digita il tuo messaggio e premi INVIO"           type = "text" />       </ Form>     )   } }</pre><h3>Passaggio 9: invio dei messaggi a Chatkit</h3><p>Ora siamo pronti, quindi invia i messaggi a Chatkit. Questo è stato risolto nel componente App, dove creeremo un metodo chiamato this.sendMessage:</p><pre>sendMessage (testo) {   this.currentUser.sendMessage ({     testo,     roomId: roomId   }) }</pre><p>Prende un parametro (il testo) e chiama semplicemente this.currentUser.sendMessage ().</p><p>Il passaggio finale consiste nel passare questo al componente <SendMessageForm> come prop:</p><pre>/ * Componente app * /    render () {   ritorno (     <div className = "app">       <Titolo />       <Messaggi MessageList = {this.state.messages} />       <SendMessageForm sendMessage = {this.sendMessage} />   ) }</pre><p>E con ciò, abbiamo passato il gestore in modo che SendMessageForm possa invocarlo quando viene inviato il modulo.</p><h3>Passaggio 10: creazione del componente Titolo</h3><p>Per finire, creiamo anche il componente Titolo. È solo un semplice componente funzionale, ovvero una funzione che restituisce un'espressione JSX.</p><pre>funzione Title () {   return <p class = "title"> La mia fantastica app di chat </p> }</pre><p>È buona norma utilizzare componenti funzionali, poiché hanno più vincoli rispetto ai componenti di classe, il che li rende meno soggetti a bug.</p><h3>Il risultato</h3><p>E con quello sul posto hai la tua applicazione di chat che puoi usare per chattare con i tuoi amici!</p><img alt="" src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/ceadesc/1568822296050.png" /><p>Concediti una pacca sulla spalla se hai programmato fino alla fine.</p><p>Se vuoi imparare come sviluppare ulteriormente questo esempio, dai un'occhiata al mio corso gratuito su come creare un'app di chat con React qui.</p><p>Grazie per aver letto! Mi chiamo Per, sono il co-fondatore di Scrimba e adoro aiutare le persone ad apprendere nuove competenze. Seguimi su Twitter se desideri essere informato su nuovi articoli e risorse.</p></div><div class="neighbor-articles"><h4 class="ui header">Guarda anche</h4><a href="/question/how-to-split-a-tuple-in-python/" title="hogyan lehet kettéválasztani egy duplát a pythonban">hogyan lehet kettéválasztani egy duplát a pythonban</a><a href="/question/how-to-save-in-legend-of-zelda-nes/" title="come salvare in legend of zelda nes">come salvare in legend of zelda nes</a><a href="/question/how-to-make-a-pole-lathe/" title="come fare un tornio a palo">come fare un tornio a palo</a><a href="/question/how-to-pronounce-inej/" title="come si pronuncia inej">come si pronuncia inej</a><a href="/question/how-to-get-screws-in-fallout-76/" title="come ottenere viti in fallout 76">come ottenere viti in fallout 76</a><a href="/question/how-to-incorporate-fiverr-into-weebly/" title="come incorporare fiverr in weebly">come incorporare fiverr in weebly</a><a href="/question/how-to-find-eigenvalues-of-a-symmetric-matrix/" title="come trovare gli autovalori di una matrice simmetrica">come trovare gli autovalori di una matrice simmetrica</a><a href="/question/how-to-clean-leather-golf-gloves/" title="come pulire i guanti da golf in pelle">come pulire i guanti da golf in pelle</a></div></div><div class="article-sidebar"><div class="neighbor-articles"><h4 class="ui header">Guarda anche</h4><a href="/article/how-to-get-yourself-out-of-rock-bottom-48bea8/" title="Come uscire dal fondo della roccia">Come uscire dal fondo della roccia</a><a href="/article/how-to-build-your-online-brand-as-a-software-developer-758ffb/" title="Come costruire il tuo marchio online come sviluppatore di software">Come costruire il tuo marchio online come sviluppatore di software</a><a href="/article/bouquets-or-bitterness-how-to-bloom-where-you-are-planted-bbec32/" title="Mazzi o Amarezza? Come fiorire dove sei piantato">Mazzi o Amarezza? Come fiorire dove sei piantato</a><a href="/article/how-to-talk-to-someone-with-abandonment-issues-62ab2a/" title="Come parlare con qualcuno con problemi di abbandono">Come parlare con qualcuno con problemi di abbandono</a><a href="/article/3d-artists-how-to-make-money-working-on-decentraland-projects-5c87e7/" title="Artisti 3D: come guadagnare lavorando su progetti Decentraland">Artisti 3D: come guadagnare lavorando su progetti Decentraland</a><a href="/article/how-to-give-him-the-best-blowjob-of-his-life-6deb3c/" title="Come dargli il miglior pompino della sua vita">Come dargli il miglior pompino della sua vita</a><a href="/article/how-to-make-more-money-as-an-entrepreneur-3a8e74/" title="Come fare più soldi come imprenditore">Come fare più soldi come imprenditore</a><a href="/article/how-to-use-client-raindrop-without-using-the-hydrogen-api-42be5a/" title="Come utilizzare Client Raindrop SENZA utilizzando l'API Hydrogen">Come utilizzare Client Raindrop SENZA utilizzando l'API Hydrogen</a></div></div></div></main><div class="push"></div></div><footer><div class="flags-footer"><a href="https://uz.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="uz flag"></i></a><a href="https://bg.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="bg flag"></i></a><a href="https://et.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="ee flag"></i></a><a href="https://lt.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="lt flag"></i></a><a href="https://lv.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="lv flag"></i></a><a href="https://sr.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="rs flag"></i></a><a href="https://sl.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="si flag"></i></a><a href="https://sk.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="sk flag"></i></a><a href="https://uk.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="ua flag"></i></a><a href="https://sq.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="al flag"></i></a><a href="https://hy.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="am flag"></i></a><a href="https://is.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="is flag"></i></a><a href="https://az.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="az flag"></i></a><a href="https://kk.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="kz flag"></i></a><a href="https://fa.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="ir flag"></i></a><a href="https://tg.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="tj flag"></i></a><a href="https://ga.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="ie flag"></i></a><a href="https://be.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="by flag"></i></a><a href="https://ka.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="ge flag"></i></a><a href="https://ky.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="kg flag"></i></a><a href="https://lb.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="lu flag"></i></a><a href="https://lo.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="la flag"></i></a><a href="https://ar.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="sa flag"></i></a><a href="https://bn.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="in flag"></i></a><a href="https://ca.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="es flag"></i></a><a href="https://zh.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="cn flag"></i></a><a href="https://hr.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="hr flag"></i></a><a href="https://cs.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="cz flag"></i></a><a href="https://da.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="dk flag"></i></a><a href="https://nl.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="nl flag"></i></a><a href="https://tl.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="ph flag"></i></a><a href="https://fi.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="fi flag"></i></a><a href="https://fr.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="fr flag"></i></a><a href="https://de.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="de flag"></i></a><a href="https://el.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="gr flag"></i></a><a href="https://iw.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="il flag"></i></a><a href="https://hi.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="in flag"></i></a><a href="https://hu.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="hu flag"></i></a><a href="https://id.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="id flag"></i></a><a href="https://ja.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="jp flag"></i></a><a href="https://ko.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="kr flag"></i></a><a href="https://ms.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="my flag"></i></a><a href="https://mr.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="io flag"></i></a><a href="https://no.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="no flag"></i></a><a href="https://pl.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="pl flag"></i></a><a href="https://pt.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="pt flag"></i></a><a href="https://ro.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="ro flag"></i></a><a href="https://ru.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="ru flag"></i></a><a href="https://internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="es flag"></i></a><a href="https://sv.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="ch flag"></i></a><a href="https://ta.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="sg flag"></i></a><a href="https://te.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="in flag"></i></a><a href="https://th.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="th flag"></i></a><a href="https://tr.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="tr flag"></i></a><a href="https://ur.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="pk flag"></i></a><a href="https://vi.internautasporlapaz.org/article/how-to-build-a-react-js-chat-app-in-10-minutes-668d0a/"><i class="vn flag"></i></a></div>internautasporlapaz.org<!-- --> © <!-- -->2021<!-- --> </footer></div></div></div></body></html>