Как работают переходы с изображениями в Vue JS 3?

Мне не удалось применить плавный переход к изображению с помощью Vue JS 3. Переход отлично работает с текстом, но изображение просто загружается и отображается, как обычно, без применения перехода.

Я пытался создать загрузчик изображений, который будет показывать счетчик загрузки до тех пор, пока изображение не будет загружено, а затем исчезать счетчик загрузки и изображение после загрузки изображения. В настоящее время счетчик загрузки исчезает, как и ожидалось, но изображение не исчезает.

Вот что у меня есть в элементе изображения:

<script setup>
  import FadeTransition from '../transitions/fade-transition.vue';
  import { reactive } from 'vue'

  const props = defineProps({
    imgUrl: String,
    route: String
  })

  let getURL = function () {
    return new URL(props.imgUrl, import.meta.url);
  }

  let show = reactive({showing: false});
  let showImg = function () {
    show.showing = true;
  }
</script>

<template>
  <div class = "frame">
    <FadeTransition><div v-show = "!show.showing" class = "loader"></div></FadeTransition>
    <RouterLink :to = "props.route"><FadeTransition><img v-show = "show.showing" class = "image" :src = "getURL()" @load = "showImg()"/></FadeTransition></RouterLink>
  </div>
</template>

<style scoped>
  .frame {
    width: 33.3333%;
    aspect-ratio: 1/1;
    margin: 0px;
    /*inline-block leaves space for descenders (e.g: letter y or g) so space between rows is wrong*/
    display: inline-flex;
    position: relative;
    padding: 6px;
  }

  .image {
    width: calc(100% - 12px);
    height: calc(100% - 12px);
    position: absolute;
  }

  .loader {
    border: 4px solid var(--grey);
    border-top: 4px solid var(--darkGrey);
    border-radius: 50%;
    width: 30px;
    height: 30px;
    animation: spin 5s linear infinite;
    position: absolute;
    left: calc(50% - 15px);
    top: calc(50% - 15px);
  }

  @keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }
</style>

и компонент FadeTransition:

<script>
</script>

<template>
  <Transition name = "fade">
    <slot></slot> 
  </Transition>
</template>

<style>
  .fade-enter-active, 
  .fade-leave-active {
    transition: opacity 0.5s ease;
  }

  .fade-enter-from, 
  .fade-leave-to {
    opacity: 0;
  }
</style>

Я попытался заменить изображение на текстовый блок, который работает правильно, что привело меня к выводу, что проблема заключается в том, что переход неправильно применяется к изображению.

Как я могу заставить переход правильно применяться к изображению?

Это работает, когда я пробую это, я предполагаю, что это должно быть ваше showImg(). Можете ли вы добавить этот код к своему вопросу?

Moritz Ringler 10.05.2023 19:19

@MoritzRingler спасибо, теперь я включил всю SFC. Если я поменял изображение на текст, он работал нормально, просто кажется, что изображения не работают.

jban28 10.05.2023 20:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Хм, все, что я могу вам сказать, это то, что он отлично работает на детской площадке

Если imgUrl является реквизитом, я бы добавил наблюдатель, который сбрасывает компонент при изменении URL-адреса:

watch(
  () => props.imgUrl,
  () => {
    show.showing = false
  },
  {immediate: true}
)

В противном случае анимация загрузки и исчезновение не будут запускаться при изменении URL-адреса после начальной загрузки.

В остальном выглядит вполне нормально.

Пожалуйста, дайте мне знать, если я что-то упустил.

Странно, у меня там тоже работает. Я думаю, единственная разница в том, что мое изображение и переход также завернуты в ссылку маршрутизатора, но я не вижу, какая разница? И я визуализирую весь компонент, используя v-for для галереи из множества изображений, но опять же я не понимаю, почему это имеет значение, потому что каждый компонент должен быть независимым. Спасибо за попытку!

jban28 10.05.2023 20:51

Хм, если удалить RouterLink, он работает? Уверен, что это не то. Ставлю на пропавшего наблюдателя. Я добавил его в ссылку на игровую площадку, может быть, это поможет

Moritz Ringler 10.05.2023 21:08

Наблюдатель исправил! Спасибо! Можете ли вы объяснить, почему это так? Я новичок в Vue и раньше не встречал наблюдателей. Я предполагал, что каждый раз, когда компонент используется, он не зависит от каких-либо других экземпляров компонента.

jban28 10.05.2023 21:30

Во-первых, здорово, что это работает! Когда вы меняете свойство (например, imgUrl), компонент не инициализируется повторно, поэтому без наблюдателя теперь у вас есть новый URL-адрес, но show.showing по-прежнему верно из последнего URL-адреса, поэтому изображение отображается сразу, без затухания. и нагрузка. Наблюдатель обнаруживает изменение и сбрасывает show.showing, поэтому он снова работает. В общем, всякий раз, когда свойство запускает изменение компонента, вам необходимо сбросить его с помощью наблюдателя, если только вы не используете новый компонент (что обычно не то, что вы хотите делать).

Moritz Ringler 10.05.2023 21:51

Кстати. всякий раз, когда ответ помог вам, не забудьте проголосовать за него и / или отметить его как принятый ответ - баллы баллы, лол, так работает сайт

Moritz Ringler 10.05.2023 21:52

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

jban28 10.05.2023 22:21

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