Я пытаюсь создать многоразовый компонент, который называется v-dialog
.
Идея состоит в том, что когда всплывающее диалоговое окно будет состоять из двух кнопок, которые называются submit
и cancel
.
Кнопка submit
диалогового компонента будет связана с различными действиями в зависимости от того, какую кнопку нажимает пользователь.
Например, button A
будет вызывать имя функции A
, а button B
будет вызывать имя функции B
и так далее, когда пользователь нажимает кнопку submit
в диалоговом окне.
Допустим, это файл компонента, который я назвал DialogReusable.vue
<v-dialog
v-model = "dialog"
persistent
max-width = "300"
>
<v-card>
<v-card-title
class = "text-h5"
style = "word-break: break-word"
>
Title
</v-card-title>
<v-card-actions>
<v-spacer />
<v-btn
color = "green darken-1"
text
@click = "dialog = false"
>
Cancel Button
</v-btn>
<v-btn
class = "primary"
@click = "functionSubmits()"
>
Submit
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
А это родительский файл, который я назвал MainParent.vue
Для этого файла у него есть 3 кнопки, которые ссылаются на разные функции.
Когда пользователь нажимает на каждую кнопку, должен появиться Dialog
, а когда пользователь нажимает кнопку submit
в диалоговом окне, он вызывает соответствующее имя функции, которое я установил @click
для каждой кнопки.
<v-btn
v-if = "condition"
color = "primary"
dark
@click = "functionA()"
>
Function A
</v-btn>
<v-btn
v-if = "condition"
class = "primary"
@click = "functionB()"
>
Function B
</v-btn>
<v-btn
v-if = "condition"
class = "primary"
@click = "functionC()"
>
Function C
</v-btn>
Это концепция передачи функций через атрибут props
в Vue.
Позвольте мне показать вам первый пример передачи функции из родительского в дочерний компонент.
Получение значения от родителя
Если вы хотите, чтобы дочерний компонент имел доступ к родительскому методу, кажется очевидным, что нужно просто передать метод прямо в качестве опоры.
<!-- Parent -->
<template>
<ChildComponent :method = "parentMethod" />
</template>
// Parent
export default {
methods: {
parentMethod() {
// ...
}
}
}
И ваш дочерний компонент будет выглядеть так:
// Child
export default {
props: {
method: { type: Function },
},
mounted() {
// Use the parent function directly here
this.method();
}
}
Получение значения от ребенка
В другом случае вы можете захотеть получить значение из дочернего компонента в родительский, например, функция в родительском компоненте имеет имя параметра.
<!-- Parent -->
<template>
<ChildComponent :method = "parentMethod" />
</template>
// Parent
export default {
methods: {
parentMethod(valueFromChild) {
// Do something with the value
console.info('From the child:', valueFromChild);
}
}
}
Где в дочернем компоненте вы передаете значение при его вызове:
// Child
export default {
props: {
method: { type: Function },
},
mounted() {
// Pass a value to the parent through the function
this.method("some param name");
}
}
Что касается вашего вопроса, я думаю, вы можете добиться следующего:
Допустим, у вас есть 3 кнопки отправки, и у каждой кнопки свое действие.
Сначала давайте создадим многоразовое всплывающее диалоговое окно, которое действует как дочерний компонент.
<template>
<v-dialog
:value = "dialog"
persistent
max-width = "300"
@input = "$emit('input', $event)"
>
<v-card>
<v-card-title
class = "text-h5"
style = "word-break: break-word"
>
Title Dialog
</v-card-title>
<v-card-actions>
<v-spacer />
<v-btn
color = "green darken-1"
text
@click = "close"
>
Cancel
</v-btn>
<v-btn
class = "primary"
@click = "onBtnSubmit"
>
Confirm
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<script>
export default {
name: 'Dialog',
props: {
dialog: {
type: Boolean,
required: true
},
buttonActionName: {
type: String,
required: true
},
method: {
type: Function,
required: true
}
},
methods: {
close() {
this.$emit('close-dialog')
},
onReportBtnSubmit() {
if (this.buttonActionName.length > 0) {
this.method(this.buttonActionName)
} else {
this.method()
}
this.close()
}
}
}
</script>
<style scoped>
</style>
Я предположил, что вы понимаете концепцию передачи функций через атрибут props
в Vue.
// This dialog will pass function `firstBtnSubmit` without param name
<Dialog
:dialog.sync = "firstBtnDialog"
:method = "firstBtnSubmit"
button-action-name = ""
@close-dialog = "firstBtnDialog= false;"
/>
<v-btn
@click = "showDialogFirstBtn">
firstBtnClick
</v-btn>
// This dialog will pass function `secondBtnSubmit` with param name
<Dialog
:dialog.sync = "secondBtnDialog"
:method = "secondBtnSubmit"
button-action-name = "id1"
@close-dialog = "secondBtnDialog = false;"
/>
<v-btn
@click = "showDialogSecBtn">
secondBtnClick
</v-btn>
// you can create a third button below by yourself.
export default {
data() {
return {
firstBtnDialog: false,
secondBtnDialog: false,
thirdBtnDialog: false,
},
methods: {
firstBtnSubmit() {
// Do your stuff
},
secondBtnSubmit(param) {
// do your staff with param
},
thirdBtnSubmit () {
// do your stuff
},
// To trigger dialog to pop up
showDialogFirstBtn() {
this.firstBtnDialog = true;
},
showDialogSecBtn() {
this.secondBtnDialog= true;
},
showDialogThirdBtn() {
this.thirdBtnDialog= true;
}
}
}
Примечание
Я НЕ владею всем содержимым, которое я написал здесь.
Все содержимое я получил с другого сайта
Концепция передачи функции в качестве реквизита
Как использовать повторно используемый компонент в Vue: Stackoverflow