Откройте диалоговое окно Vuetify из шаблона компонента в VueJS
Я использую VueJS Vuetify framework и мне нужно открыть диалоговое окно, которое импортируется как шаблон компонента из другого шаблона. После того, как меню на App.vue нажал, модальный должен открыться. Вот моя настройка:
- App.vue = шаблон навигации с кнопкой Меню
- модала.vue = модальный шаблон, импортированный как глобальный в главный.js
main.js
import Modal from './components/Modal.vue'
Vue.component('modal', Modal)
модала.шаблон вю:
<template>
<v-layout row justify-center>
<v-btn color="primary" dark @click.native.stop="dialog = true">Open Dialog</v-btn>
<v-dialog v-model="dialog" max-width="290">
<v-card>
<v-card-title class="headline">Use Google's location service?</v-card-title>
<v-card-text>Let Google help apps determine location. This means sending anonymous location data to Google, even when no apps are running.</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="green darken-1" flat="flat" @click.native="dialog = false">Disagree</v-btn>
<v-btn color="green darken-1" flat="flat" @click.native="dialog = false">Agree</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-layout>
</template>
<script>
export default {
data () {
return {
dialog: false
}
}
}
</script>
Как открыть диалоговое окно?
5 ответов
вы можете открыть диалоговое окно с помощью пользовательских событий и с помощью шина событий для не родительско-дочерней связи.
если ваше приложение становится немного сложнее, я рекомендую вам использовать Vuex для государственного управления.
решение шины событий:
в своем main.js или в новом файле создайте и экспортируйте новый экземпляр Vue:
export const bus = new Vue()
на app.vue импорт bus
и генерировала событие:
<template>
<div>
<button @click.prevent="openMyDialog()">my button</button>
</div>
</template>
<script>
import {bus} from '../main' // import the bus from main.js or new file
export default {
methods: {
openMyDialog () {
bus.$emit('dialog', true) // emit the event to the bus
}
}
}
</script>
на модала.vue также импортируйте шину и слушайте событие в созданном крючке:
<script>
import {bus} from '../main'
export default {
created () {
var vm = this
bus.$on('dialog', function (value) {
vm.dialog = value
})
}
}
</script>
я смог обойти это без необходимости в глобальной шине событий.
я использовал вычисленное свойство с геттером и сеттером. Поскольку Vue предупреждает Вас о мутации родительского свойства напрямую, в сеттере я просто испустил событие для родителя.
вот код:
родительский компонент:
<template>
<v-btn color="accent" large @click.stop="showScheduleForm=true">
<ScheduleForm :visible="showScheduleForm" @close="showScheduleForm=false" />
</template>
<script>
import ScheduleForm from '~/components/ScheduleForm'
export default {
data () {
return {
showScheduleForm: false
}
},
components: {
ScheduleForm
}
}
</script>
дочерний компонент (графика):
<template>
<v-dialog v-model="show" max-width="500px">
<v-card>
<v-card-actions>
<v-btn color="primary" flat @click.stop="show=false">Close</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<script>
export default {
props: ['visible'],
computed: {
show: {
get () {
return this.visible
},
set (value) {
if (!value) {
this.$emit('close')
}
}
}
}
}
</script>
есть много способов сделать это, например, Vuex, Event Bus, Props, с помощью которых вы можете управлять, должен ли модальный открыть или закрыть.Я покажу вам мой любимый способ, используя
.sync
модификатор:
сначала я упрощу вам вопрос(часть кода)
родительский компонент
<template>
<div>
<button @click="dialog=true">Open Dialog</button>
<Child :dialog.sync="dialog" />
</div>
</template>
<script>
import Child from './Child.vue'
export default {
components: {
Child
},
data: {
return {
dialog: false
}
}
}
</script>
Дочерний (Диалоговый) Компонент
<template>
<v-layout row justify-center>
<v-dialog v-model="dialog" persistent max-width="290">
<v-card>
<v-card-title class="headline">Use Google's location service?</v-card-title>
<v-card-text>Let Google help apps determine location. This means sending anonymous location data to Google, even when no apps are running.</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="green darken-1" flat @click.native="close">Close</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-layout>
</template>
<script>
export default {
props: {
dialog: {
default: false
}
},
methods: {
close() {
this.$emit('update:dialog', false)
}
}
}
</script>
в своем App.vue
template
добавить
<modal></model>
он будет отображать ваш текущий Modal.vue
шаблон v-btn
и v-dialog
теперь внутри него будет один button
- Open Dialog
при нажатии на который откроется модальное.
самый простой способ я нашел, чтобы сделать это:
в data() компонента верните атрибут, скажем, диалог.
при включении компонента можно задать ссылку на тег компонента. Например:
import Edit from '../payment/edit.vue';
<edit ref="edit_reference"></edit>
затем внутри моего компонента, я поставил метод:
open: function () {
var vm = this;
vm.dialog = true;
}
наконец, я могу вызвать его от родителя, используя:
editar(item)
{
var vm = this;
vm.$refs.edit_reference.open();
}