Rumah > Soal Jawab > teks badan
Saya sedang mengusahakan sistem suka/tidak suka pada Laravel/VueJS.
Sistem saya berfungsi, tetapi saya mahu mengelakkan spammer.
Butang suka:
<a v-on:click="like(10, $event)"> <i class="fas fa-heart"></i> </a>
10 ialah id pos, ia dijana dalam laravel Blade...
Ini adalah cara saya cuba mengelakkan spammer:
const app = new Vue({ el: '#app', data() { return { allowed: true, }; }, methods: { like: function (id, event) { if (this.allowed) { axios.post('/posts/' + id + '/like', { post_id: id, }) .then((response) => { this.allowed = false; //Set allowed to false, to avoid spammers. ..... code which changes fa-heart, changes class names, texts etc .... // send notification to user Vue.toasted.show('Bla bla bla successfuly liked post', { duration: 2000, onComplete: (function () { this.allowed = true //After notification ended, user gets permission to like/dislike again. }) });
Tetapi ada sesuatu yang hilang di sini, atau saya melakukan sesuatu yang salah. Apabila saya mengklik pada ikon yang serupa dengan sangat cepat dan menyemak permintaan, axios menghantar 3-4-5 permintaan (bergantung pada kelajuan anda mengklik)
Hanya selepas 3-5 permintaan data.allowed
才会变成 false
. kenapa? Saya mahu:
P粉7524794672024-02-27 10:11:57
this.allowed = false;
akan terus dipanggil sehingga panggilan API selesai, membolehkan anda menghantar lebih banyak spam pada masa ini.
Sahkan if(this.allowed)
后立即将其设置为false
.
if (this.allowed) { this.allowed = false; // Then do the call }
P粉4773692692024-02-27 09:15:48
like: function (id, event) { // first, check if the `like` can be sent to server if (!this.allowed) return; // remember that we are sending request, not allowed to `like` again this.allowed = false; var self = this; // you need this to remember real this axios.post('/posts/' + id + '/like', { post_id: id, }).then((response) => { ..... code .... // send notification to user Vue.toasted.show('Bla bla bla successfuly liked post', { duration: 2000, onComplete: function () { //After notification ended, user gets permission to like/dislike again. self.allowed = true; } ); }).catch(function() { // maybe you also need this catch, in case network error occurs self.allowed = true; }) ....