Кнопки перехода Vue появляются и исчезают

У меня есть проект, который содержит форму. Когда форма успешно получена серверной частью, кнопка должна быть заменена другой кнопкой, которая подтверждает пользователю, что его запрос прошел.

Но когда я пытаюсь сделать это с помощью Vue и переходов, я могу поменять местами кнопки, но постепенное появление и исчезновение не работает. Кнопки просто мгновенно меняются местами.

Это переход с кнопками внутри шаблона:

<transition name = "fade" mode = "out-in">
    <button
        v-if = "!valid"
        class = "my-3 px-4 py-3 rounded-md shadow-sm text-base font-medium text-white-primary bg-red-primary hover:bg-red-secondary"
        @click = "checkForm"
    >
        Request Beta Access
    </button>
    <button
        v-if = "valid"
        class = "my-3 px-4 py-3 rounded-md shadow-sm text-base font-medium text-white-primary bg-green-300 hover:bg-red-secondary"
        @click = "checkForm"
    >
        Request Sended
    </button>
</transition>

Это функция, в которой моя локальная переменная valid изменяется. На данный момент я использую тайм-аут, чтобы имитировать отправку формы в серверную часть. Первый setTimeout имитирует небольшую задержку при отправке формы на сервер. Второй тайм-аут предназначен для отображения кнопки успеха в течение 2 секунд путем изменения локальной действительной переменной:

async sendBetaRequest () {
    setTimeout(() => {
        this.clearForm()
        this.valid = true

        setTimeout(() => {
            this.valid = false
        }, 2000)
    }, 1000)
},

Можете ли вы включить свои классы перехода CSS?

Daniel_Knights 21.12.2020 11:04

У меня нет классов перехода CSS. Я нашел этот пример в документации vue vuejs.org/v2/guide/transitions.html#Transition-Modes. Я думал, что добавление имени и режима к переходу сделает переход.

Stephen 21.12.2020 11:09

Вам нужно где-то определить переход. Самый распространенный способ — использование классов CSS , но вы также можете использовать хуки JavaScript.

Daniel_Knights 21.12.2020 11:13

У меня не будет того же css, что и у кнопки в примере с документами vue. Я не знаю, как это сделать в css.

Stephen 21.12.2020 11:32
Поведение ключевого слова "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) для оценки ваших знаний,...
1
4
610
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Как я сказал в своем комментарии, вам нужно определить переход самостоятельно, Vue не предоставляет их вам.

Самый распространенный метод — использование CSS-классов.

Вот пример:

new Vue({
  el: '#app',
  data: {
    valid: false
  },
  methods: {
    sendBetaRequest() {
      setTimeout(() => {
        this.valid = true

        setTimeout(() => {
          this.valid = false
        }, 2000)
      }, 1000)
    },
  }
})
.fade-enter-active,
.fade-leave-active {
  opacity: 1;
  transition: opacity 0.3s;
}

.fade-leave-to,
.fade-enter {
  opacity: 0;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id = "app">
  <transition name = "fade" mode = "out-in">
    <button v-if = "!valid" @click = "sendBetaRequest" :key = "1">
        Request Beta Access
    </button>
    <button v-else :key = "2">
        Request Sended
    </button>
  </transition>
</div>

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

Извините, я новичок в переходах и Vue. Но где мне точно определить сценарий?

Stephen 21.12.2020 12:06

Какой скрипт вы имеете в виду?

Daniel_Knights 21.12.2020 12:07

<script src = "cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></…>

Stephen 21.12.2020 12:07

Хорошая штука, без проблем. Этот скрипт — просто CDN-версия Vue для работы фрагмента SO.

Daniel_Knights 21.12.2020 12:11

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