const thumbs = reactive([null, null, null]);
v-for="(swiper, i) in thumbs" @swiper="thumbs[i]=$event" :thumbs="{ swiper }"transformAssetUrls. Однако открыв доки я вижу там: Converts src to provider optimized URLs
import img from '~/assets/images/header.jpg'? import Wordpress from '../assets/wordpress-logotype-wmark.png';
import Bitrix from '@/assets/logotip/1c_bitrix_logo.svg.png';
const brandImgs = {
'1C Bitrix': Bitrix,
Wordpress,
};/public и указывать не относительные пути в рамках проекта, а абсолютные от корня:const brandImgs = {
'1C Bitrix': '/logotip/1c_bitrix_logo.svg.png',
'Wordpress': '/logotip/wordpress-logotype-wmark.png',
};reactive/ref объекта, чтоб получить эрзац-стор, тупо: // где-нибудь
export const basket = reactive([]); // или ref([]) по вкусу.
// везде где надо
import { basket } from './...'store если можно делать так? Потому что сторы учитывают работу в режиме SSR, а также позволяют удобную отладку в случае множества запутанных связей. store - только pinia, а не vuex. Не вижу причин его не использовать.EventBus: с одной стороны новичку её использовать категорически не рекомендуется, т.к. работа со store куда удобнее, очевиднее и надёжнее. Однако и совсем отрицать её использование тоже не следует, шина отлично подходит для случаев когда мы имеем дело именно с событиями, а не изменением состояния. Т.е. послать какой-нить notification или лог - самое оно, использовать для изменения basket, как в вашем случае - нет. const myDirective = {
created(el, binding, vnode, prevVnode) {
otherDirective?.created(el, binding, vnode, prevVnode);
...
},
beforeMount(el, binding, vnode, prevVnode) {
otherDirective?.beforeMount(el, binding, vnode, prevVnode);
...
},
....
}import { useSlots, withDirectives, resolveDirective } from 'vue'
export default {
setup() {
const htmlDirective = {
mounted(el, html) {
el.innerHTML = html.value
}
}
const colorDirective = {
mounted(el, color) {
el.style.color = color.value
}
}
// const someDirective = resolveDirective('some-directive');
const slots = useSlots();
return () => withDirectives(slots.default()[0], [
[htmlDirective, 'some html'],
[colorDirective, 'red'],
])
}
}<wrapper><some-compnent /></wrapper> scoped стилей: переданный внутрь класс не будет работать сам по себе, т.к. привязан к scope родительского компонента, придётся использовать псвевдоселектор :deep(), а это уже чревато коллизиями.item, где одновременно были бы равны item.product.article, item.size и item.warehouse.id, т.к. только в таком случае ветка уйдёт в нужную вам сторону. Если логика предполагалась какой-то другой - уточняйте.reactive вместо ref, код чище и приятней будет. @side-emit="(side, id) => {
this.players[id].side = side;
...
}"this, а внутри шаблона он не нужен, т.к. либо раскрывается неявно автоматически, либо, в случае со <script setup>, не используется вовсе. Следует запомнить: никакого this в шаблонах. @side-emit="(side, id) => {
players[id].side = side;
...
}"this в данном конкретном случае. Просто так совпало.@side-emit="someValue = $event ? 1 : 2", а что-то сложнее просто выносить в метод компонента\composition функцию: @side-emit="onSlideEmit". MediaRecorder, сам аудио-поток(stream) у вас всё ещё захвачен и вы можете слушать его дальше. function stopStream(stream) {
stream.getTracks().forEach(
(track) => track.readyState === 'live' && track.stop()
);
}window.dataLayer уже существует.window.dataLayer.push переопределён или window.dataLayer является реактивным (vue?) массивом и отслеживает добавления.(что суть одно)push вызывается некая функция, которая без всяких проверок на то что значение не пустое делает условно так: puhedValue.ecommerce.hasOwnProperty(...) на чём благополучно и падает.ecommerce: null, эта хрень ожидает, что ecommerce будет объектом и никак иначе.null, что тоже вариант).