Компонент Flip Card в VueJs 3

Я хочу получить компонент флип-карты, подобный тому, что здесь, разработав общий компонент Vue, но я не понимаю, как я могу назначить весь лицевой компонент (передний / задний) в качестве задней или лицевой стороны карты. , и как я могу заблокировать свойство перелистывания (как вариант), пример лица (спереди/сзади):

<div id = "planflex" :style = "style">
    <div class = "block">
            <h2> {{ action_id }} </h2>
    </div>
    <div class = "block">
        <img 
        :src = "require(`../assets/legos/2x${size}${color}.png`)" 
        alt = "legos" 
        id = "lego">
    </div>
    <div class = "block " :id = "action_id" @click = "choose()">
        <h3> {{ actor }} </h3>
    </div>
</div>

Не могли бы вы рассказать мне, как я могу добиться этого правильно? заранее спасибо.

Компонент FlipCard.vue Vue, который я пытался разработать:

<template>
    <div id = "flashcard" class = "container" @dblclick = "toggleCard()">
  
      <transition name = "flip">
        <div v-bind:key = "flipped" class = "card">
            {{ flipped ? back : front }}
        </div>
      </transition>  
  </div>
</template>

<script>
  export default {
      name: "FlipCard",
      props: {
          front: {
              type: Object,
              required: true
          },
          back: {
              type: Object,
              required: true
          },
          flipped: {
              type: Boolean,
              default: false,
          },
      },
      methods: {
          toggleCard() {
              this.flipped = !this.flipped;
          },
      }
  }
</script>

Стиль.css

<style>
body {
    font-family: 'Montserrat', sans-serif;
    text-align: center;
  }
  
  ul {
    padding-left: 0;
    display: flex;
    flex-flow: row wrap;
  }
  
  li {
    list-style-type: none;
    padding: 10px 10px;
    transition: all 0.3s ease;
  }
  
  .container {
    max-width: 100%;
    padding: 2em;
  }
  
  .card {
    display: block;
    width: 150px;
    height: 175px;
    padding: 80px 50px;
    background-color: #51aae5;
    border-radius: 7px;
    margin: 5px;
    text-align: center;
    line-height: 27px;
    cursor: pointer;
    position: relative;
    color: #fff;
    font-weight: 600;
    font-size: 20px;
    -webkit-box-shadow: 9px 10px 22px -8px rgba(209,193,209,.5);
    -moz-box-shadow: 9px 10px 22px -8px rgba(209,193,209,.5);
    box-shadow: 9px 10px 22px -8px rgba(209,193,209,.5);
    will-change: transform;
  }
  
  li:hover{
    transform: scale(1.1);
  }
  
  li:nth-child(-n+3) .card{
    background-color: #e65f51;
    }
  
  li:nth-child(2n+1) .card{
    background-color: #a17de9;
    }
  
  li:nth-child(4n) .card{
    background-color: #feca34;
    }
  
  li:nth-child(5n-2) .card{
    background-color: #51aae5;
    }
  
  li:nth-child(4n+4) .card{
    background-color: #feca34;
    }
  
  li:nth-child(-7n+7) .card{
    background-color: #e46055;
    }
  
  .delete-card {
    position: absolute;
    right: 0;
    top: 0;
    padding: 10px 15px;
    opacity: .4;
    transition: all 0.5s ease;
  }
  
  .delete-card:hover, .error {
    opacity: 1;
    transform: rotate(360deg);
  }
  
  .flip-enter-active {
    transition: all 0.4s ease;
  }
  
  .flip-leave-active {
    display: none;
  }
  
  .flip-enter, .flip-leave {
    transform: rotateY(180deg);
    opacity: 0;
  
  }
</style>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лицевая сторона вашей карты выглядит хорошо, чтобы поместить ее в новый компонент, а затем flipCard.vue может отобразить этот компонент, спереди или сзади, как динамический компонент

flipCard.vue

<div v-bind:key = "flipped" class = "card">
  <component :is = "cardSide" />
</div>
<script>
import cardFront from "@/components/cardFront.vue";
import cardBack from "@/components/cardBack.vue";

export default {
  computed: {
    cardSide() {
      if (this.flipped) return cardFront;
      else return cardBack;
    },
  }
};
</script>

более подробно коды и бокс здесь.

Другой вариант — использовать слоты для отображения содержимого динамического компонента.

Родительский компонент

<flip-card>
  <template v-slot:front>
    <cardFront />
  </template>
  <template v-slot:back>
    <cardBack />
  </template>
</flip-card>

flipCard.vue

<template>
  <div id = "flashcard" class = "container" @click = "toggleCard()">
    <transition name = "flip">
      <div v-bind:key = "flipped" class = "card">
        <slot v-if = "!flipped" name = "front"></slot>
        <slot v-else name = "back"></slot>
      </div>
    </transition>
  </div>
</template>

еще более подробная коды и коробка

Другие вопросы по теме