#javascript #vue.js #bootstrap-modal
#javascript #vue.js #bootstrap-модальный
Вопрос:
Я хочу дождаться успеха axios, чтобы запустить модальный режим, или не запустить модальный режим без изменения каких-либо существующих стилей. Текущий код всегда запускается без ожидания ответа axios, даже если был добавлен v-if .
Текущий код:
<template>
<div>
<div class="col-12 text-center">
<a @click="func()" class="btn btn-sm btn-round btn-success save-button" data-toggle="modal" data-target="#success-save">submit</a>
</div>
<div v-if="modalDisplay" class="modal modal-top fade" id="success-save" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">amp;times;</span>
</button>
<h3 class="text-center" style="color:white;"><strong>Success</strong></h3>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
modalDisplay: false,
}
},
methods: {
func() {
axios.post('/some/uri', {
'content': 'abc',
})
.then(response => {
this.modalDisplay = true;
});
},
}
</script>
Я пробовал переместить v-if и другие, но это все еще не работает, или это уже работает, но стиль изменился, ваше решение будет очень полезным, спасибо!
Редактировать: я использую Vue 2.6.11, изменил код
Комментарии:
1. Можете ли вы сказать мне, используете ли вы vue 2 или vue 3?
2. Итак, если вы добавите консоль. войдите в
.then(response => {
обработчик, который он немедленно выводит на консоль?3. @devil-0-per vue 2.6.11
4. @Anatoly да, если успех
5. Может быть, ваш запрос слишком быстрый?)
Ответ №1:
В Vue 2.x шаблоны должны содержать только один элемент внутри него. Попробуйте поместить все теги в div следующим образом
<template>
<div>
<div class="col-12 text-center">
<a @click="func()" class="btn btn-sm btn-round btn-success save-button" data-toggle="modal" data-target="#success-save">submit</a>
</div>
<div v-if="modalDisplay" class="modal modal-top fade" id="success-save" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">amp;times;</span>
</button>
<h3 class="text-center" style="color:white;"><strong>Success</strong></h3>
</div>
</div>
</div>
</div>
</div>
</template>
Также добавьте блок кэша к вашему вызову axios
axios.post('/some/uri', {
'content': 'abc',
})
.then(response => {
this.modalDisplay = true;
})
.catch(error=> {
console.log(error);
});
В Vue 3 вы можете использовать фрагменты для достижения этой цели без объединения в один узел
Вы можете найти реализацию здесь
Комментарии:
1. сбой вашего API? у вас есть какие-либо журналы об этом? Вы также можете добавить блок кэша в
axios
запрос, чтобы найти его здесь.2. Я не думаю, что проблема в этом. Кнопка выполняется сначала, прежде чем ждать успешного завершения axios (что просто изменяет значение modalDisplay). Таким образом, проблема в том, как дождаться успешного завершения Axios, а затем переключить modalDisplay без изменения существующего стиля.
3. Проверьте эту реализацию здесь . Кнопка появляется после нажатия на кнопку codepen.io/devil-0-per/pen/dyXrMGY