Praktické príklady s Vue – 3/x
Tento príklad je “vrcholom” z zmysle, že kým v prvom sme si predviedli vykreslenie vymyslených údajov AJAX-om, v druhom už to boli reálne údaje získavané v reálnom čase cez WebSockets, tak v tomto príklade si vykreslujeme údaje tiež v reálnom čase, ale tento krát vlastné, s pomocou Firebase.
Jednoduchý “serverless” chat
Tento krát je kód naprosto jednoduchý a z vlastností Vue prakticky takmer nové neukazuje. Ale tento krát ide o to, aby ste si uvedomili, že s platformami ako Firebase, alebo Kinvey ani len nepotrebujete server – tvoríte takzvané “serverless” aplikácie. Avšak pozor. Napriek tomu označeniu “serverless” je to však klasická aplikácia. V konečnom dôsledku nič také ako “serverless” neexistuje. Tou “bezserverovosťou” je myslené skôr to, že si nemusíte prenajímať vlastný virtuálny server, rozbehávať na ňom minimálne Node, Webpack a nejakú databázu, ale že si prenajmete už hotový, nakonfigurovaný server poskytovaný ako službu. BaaS – Backend as a Service. A keďže aj to je dnes vo svete obľúbený prístup k tvorbe web aplikácií, tak nech o ňom viete a nech máte aspoň jednoduchú ukážku ako na to:
<style> .container { border: 1px solid black; width: 500px; margin: 0 auto; padding: 0 5px; background-color: white; position: relative; } .new-msg { padding: 10px 0; text-align: center; } </style> <div id="app" class="container"> <div class="new-msg"> <input @keydown.enter="sendMsg" v-model="message" maxlength="140"> <button @click="sendMsg">↵</button> </div> <ul> <li v-for="(msg, idx) in descending" :key="idx"> <div class="header"> <span class="user"> <span v-html="userIcon"></span> {{ msg.user }} </span> <span class="time"> <span v-html="timeIcon"></span> {{ msg.time }} </span> </div> <p>{{ msg.text }}</p> </li> </ul> </div> <script src="https://unpkg.com/moment@2.18.1/min/moment.min.js"></script> <script src="https://unpkg.com/vue@2.4.4/dist/vue.js"></script> <script src="https://www.gstatic.com/firebasejs/4.4.0/firebase-app.js"></script> <script src="https://www.gstatic.com/firebasejs/4.4.0/firebase-auth.js"></script> <script src="https://www.gstatic.com/firebasejs/4.4.0/firebase-database.js"></script> <script> new Vue({ el: '#app', data: { user: '', message: '', messages: [], fb: null, db: null, table: null, query: null, fbConf: { apiKey: 'AIzaSyAmSOSEmbX_UqIXjZqUMqlIAdfK7SC8VBI', authDomain: 'hat-a132d.firebaseapp.com', databaseURL: 'https://chat-a132d.firebaseio.com' }, userIcon: ` <svg id="i-user" viewBox="0 0 32 32" width="16" height="16" fill="none" stroke="currentcolor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"> <path d="M22 11 C22 16 19 20 16 20 13 20 10 16 10 11 10 6 12 3 16 3 20 3 22 6 22 11 Z M4 30 L28 30 C28 21 22 20 16 20 10 20 4 21 4 30 Z" /> </svg> `, timeIcon: ` <svg id="i-clock" viewBox="0 0 32 32" width="14" height="14" fill="none" stroke="currentcolor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"> <circle cx="16" cy="16" r="14" /> <path d="M16 8 L16 16 20 20" /> </svg> ` }, computed: { descending () { return Array.from(this.messages).reverse() } }, methods: { logIn (user) { this.user = user.uid.substr(0, 8) }, sendMsg () { if (this.message) { this.table.push().set({ user: this.user, timestamp: this.fb.database.ServerValue.TIMESTAMP, content: this.message }) this.message = '' } }, listMsg (data) { if (this.messages.length > 19) { this.messages.shift() } this.messages.push({ user: data.val().user, time: moment(data.val().timestamp).format('HH:mm:ss'), text: data.val().content }) } }, created () { this.fb = firebase this.fb.initializeApp(this.fbConf) this.fb.auth().signInAnonymously() this.fb.auth().onAuthStateChanged(this.logIn) this.db = this.fb.database() this.table = this.db.ref('messages') this.query = this.table.orderByChild('timestamp').limitToLast(20) this.query.on('child_added', this.listMsg) } }) </script>
[iframe src=”https://jsfiddle.net/provuecateur/27fpjgv0/embedded/result,html,css,js/” width=”100%” height=”910″]