data() {
return {
activeItems: [],
lastClickedId: null
}
},
methods: {
click(items, buttonId) {
const itemsArray = Array.isArray(items) ? items : [items];
// Если кликаем второй раз по той же кнопке
if (this.lastClickedId === buttonId) {
this.activeItems = [];
this.lastClickedId = null;
} else {
this.activeItems = itemsArray;
this.lastClickedId = buttonId;
}
this.applyStyles();
},
applyStyles() {
for (let node in this.nodes) {
this.nodes[node].style.opacity = this.activeItems.includes(node) ? 1 : 0.3;
}
}
}
В коде при событии клик, передавай и id @click="click(button.items, button.id)" - который как раз является индексом
// В дочернем компоненте - передаем все файлы сразу
attachThumbnail: function (e, curObj) {
e.target.closest('.area-upload').classList.remove('drag-file');
e.target.closest('.area-upload').style.display = 'flex';
let files = e.target.files || e.dataTransfer.files;
let allowFiles = this.validateFiles(e, files, curObj);
this.$emit('attachThumbnail', curObj, Array.from(allowFiles));
},
// В родительском компоненте - обрабатываем последовательно
async attachThumbnail(curObj, files) {
let index = this.formData.materialFiles.findIndex(item => item.lang === curObj.lang);
for (let i = 0; i < files.length; i++) {
let file = files[i];
let filePosition = this.formData.materialFiles[index].files.restFiles.length;
console.log('Array length ' + filePosition);
try {
const response = await this.uploadFile(curObj, file, 'rest', filePosition);
const data = await response.json();
console.log('append file');
this.formData.materialFiles[index].files.restFiles.push({
name: data.fileName,
id: data.id
});
} catch (error) {
console.log(error);
}
}
}
Пример определения
function getMousePosition(evt) {
const CTM = svg.getScreenCTM();
return {
x: (evt.clientX - CTM.e) / CTM.a,
y: (evt.clientY - CTM.f) / CTM.d
};
}
$q.platform.is.cordova
import { useQuasar } from 'quasar'
setup () {
const $q = useQuasar()
$q.platform.is.mobile
}
$q.platform.is.cordova
import { Platform } from 'quasar'
<script setup>
import { useRouter } from 'vue-router';
import { computed, watch } from 'vue';
import { useAuthStore } from '@/stores/auth'; // Пример с Pinia
const router = useRouter();
const authStore = useAuthStore();
const userRole = computed(() => authStore.role);
watch(userRole, (newRole) => {
if (newRole !== 'admin') {
router.push('/');
}
});
</script>
router.beforeEach((to, from, next) => {
const hasAccess = checkUserAccess(to);
if (!hasAccess) {
next('/');
} else {
next();
}
});
$.ajax({
url: '/ajax.php', // URL для обработки клика
type: 'POST',
data: {
action: 'increment_click', // Действие для обработки
notification_id: notificationDetails[i]['id'] // ID уведомления
},
success: function(response) {
console.log('Click counter updated.');
},
error: function() {
// Обработка ошибок, если нужно
console.log('Error updating click counter.');
}
});
if ($_POST['action'] == 'increment_click' && isset($_POST['notification_id'])) {
.....
логика обновления по инкрименту нотификатору
}