【Vue】컴퍼넌트의 버튼을 부모로부터 지정한다
컴포넌트 트리거를 외출
Vuetify의 v-slot:activator와 같이 컴포넌트를 기동하는 버튼을 외부에서 지정 가능한 컴포넌트를 작성합니다.
FormDialog.vue
<template>
<v-dialog v-model="dialog" persistent max-width="600px">
<template v-slot:activator="{ on }">
<!-- slotで呼び出し元から起動ボタンを指定可能にする -->
<slot
name="activator"
:on="{ click: open }"
></slot>
</template>
<v-card>
<v-card-title>
<span class="headline">入力フォーム</span>
</v-card-title>
<v-card-text>
<form>
<v-textarea
v-model="text"
label="フォーム"
:counter="1000"
></v-textarea>
</form>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="blue darken-1" text @click.native="dialog = false">
キャンセル
</v-btn>
<v-btn color="blue darken-1" text @click.native="save()">
更新
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<script>
export default {
data() {
return {
// ダイアログ制御用変数
dialog: false,
// 入力用変数
text: ''
}
},
methods: {
// 何もせずにただダイアログを開く
open() {
// ダイアログをオープン
this.dialog = true
}
}
}
</script>
slot에서 이벤트를 상위 구성 요소에 전달합니다. 여기에서는 다음과 같이 onClick에서 컴포넌트 내의 open() 메소드를 호출하도록 설정하고 있습니다.
<slot
name="activator"
:on="{ click: open }"
></slot>
호출자의 구성 요소는 다음과 같습니다.
index.vue(호출자)
<template>
<v-row align="center" justify="center">
<v-col cols="12">
<h1>ボタン配置ページ</h1>
</v-col>
<v-col cols="12">
<!-- コンポーネントの呼び出し -->
<FormDialog>
<!-- v-slotでボタンを親から指定する -->
<template v-slot:activator="{ on }">
<v-btn v-on="on">
Dialog
</v-btn>
</template>
</FormDialog>
</v-col>
</v-row>
</template>
<script>
export default {
components: {
FormDialog: () => import('@/components/FormDialog')
}
}
</script>
아래에서 호출자의 버튼에 FormDialog에서 지정한 이벤트가 등록됩니다.
<template v-slot:activator="{ on }">
<v-btn v-on="on">
Dialog
</v-btn>
</template>
다른 핸들러 추가
호출원마다 버튼을 눌렀을 때의 동작이 다른 경우는 이벤트 핸들러를 별명으로 건네줄 수도 있습니다.
FormDialog.vue 부분 발췌
<slot
name="activator"
:on="{ click: open }"
:onFillin="{ click: openWithFillin }" <!-- 別のメソッドを登録 -->
></slot>
<中略>
methods: {
// 何もせずにただダイアログを開く
open() {
// ダイアログをオープン
this.dialog = true
},
// デフォルト値をフィルインしてダイアログを開く
openWithFillin() {
// 値をフィルイン
this.text = 'デフォルト値'
// ダイアログをオープン
this.dialog = true
}
}
}
</script>
호출자는 다음과 같이 onFillin을 사용한다.
index.vue(호출자 부분 발췌)
<FormDialog>
<template v-slot:activator="{ onFillin }">
<v-btn v-on="onFillin">
Dialog
</v-btn>
</template>
</FormDialog>
Vuetify의 v-slot : activator와 함께 사용
예를 들면 다이얼로그의 버튼에 호버했을 때는 버튼의 설명을 내고, 클릭했을 때는 다이얼로그를 열도록 하고 싶은 경우는, v-tooltip등과 병용합니다.
이런 경우
이 경우, 컴퍼넌트의 핸들러를 병합합니다.
index.vue(호출자 부분 발췌)
<FormDialog>
<template v-slot:activator="{ onFillin }">
<v-tooltip top>
<template v-slot:activator="{ on }">
<!-- v-tooltipのonとFormDialogのonFillinをマージ -->
<v-btn icon v-on="Object.assign(on, onFillin)">
<v-icon>mdi-information</v-icon>
</v-btn>
</template>
<span>
ボタンの説明
</span>
</v-tooltip>
</template>
</FormDialog>
참고
Vue.js 범위가 있는 슬롯
Vuetify의 v-slot : activator 사용법
Reference
이 문제에 관하여(【Vue】컴퍼넌트의 버튼을 부모로부터 지정한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/uhcuf/items/c2bf9cf07eed661acf2c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)