<template> <div> <!-- image , --> <slot name="image"> <!-- --> <a :href="url" class="snippet__image"> <img :src="image"> </a> </slot> <slot name="title"> <a :href="url" class="snippet__title">{{ title }}</a> </slot> <div v-if="!inCart" @click="add" :class="{ 'snippet__buy--load': load }" class="snippet__control" > <slot name="button"> <div class="snippet__button"></div> </slot> </div> <div v-if="inCart" class="snippet__control"> <div class="snippet__button"></div> </div> <div v-if="load" class="snippet__load"></div> </div> </template> <script> // vuex import { mapState, mapActions } from 'vuex' export default { props: { id: { type: Number, required: true }, url: { type: String }, image: { type: String }, title: { type: String } }, data() { return { // load: false, // inCart: false, } }, computed: { ...mapState({ // cartItems: ({cart}) => cart.items }), }, mounted() { this.$nextTick(() => { // this.inCart = this.cartItems.some(item => item.id === this.id) }) }, methods: { ...mapActions([ // 'addToCart' ]), add() { // this.load = true // this.addToCart({ id: this.id }) } }, watch: { // cartItems(items) { // this.load = false // this.inCart = items.some(item => item.id === this.id) } } } </script>
<snippet :id="1" class="snippet"> <a slot="image" href="#" class="snippet__image"> <img src="photo.jpg"> </a> <a slot="title" href="#" class="snippet__title"> 1</a> <div slot="button" class="snippet__button"></div> </snippet>
<catalog-list> <snippet v-for="item in items" :key="item.id" v-bind="item"></snippet> </catalog-list>
Source: https://habr.com/ru/post/422465/