2020-11-04 10:30:14 +08:00
現在のページの状態を保持したまま、ユーザーに情報を提供します。
### 基本的な使い方
2021-09-04 19:29:28 +08:00
dialog は dialog ボックスをポップアップ表示します。
2020-11-04 10:30:14 +08:00
2021-09-04 19:29:28 +08:00
:::demo `model-value / v-model` 属性に `Boolean` を設定し、それが `true` のときに dialog を表示します。dialog は `body` と `footer` の 2 つの部分からなり、後者は `footer` という名前の `スロット` を必要とします。オプションの `title` 属性 (デフォルトでは空) はタイトルを定義するためのものです。最後に、この例では `before-close` がどのように使われるかを示します。
2020-11-04 10:30:14 +08:00
```html
2021-09-04 19:29:28 +08:00
< el-button type = "text" @click =" dialogVisible = true"
>click to open the Dialog< /el-button
>
2020-11-04 10:30:14 +08:00
< el-dialog
title="Tips"
2020-11-04 11:15:05 +08:00
v-model="dialogVisible"
2020-11-04 10:30:14 +08:00
width="30%"
2021-09-04 19:29:28 +08:00
:before-close="handleClose"
>
2020-11-04 10:30:14 +08:00
< span > This is a message< / span >
2020-11-04 11:15:05 +08:00
< template #footer >
< span class = "dialog-footer" >
< el-button @click =" dialogVisible = false" > Cancel</ el-button >
2021-09-04 19:29:28 +08:00
< el-button type = "primary" @click =" dialogVisible = false"
>Confirm< /el-button
>
2020-11-04 11:15:05 +08:00
< / span >
< / template >
2020-11-04 10:30:14 +08:00
< / el-dialog >
< script >
export default {
data() {
return {
2021-09-04 19:29:28 +08:00
dialogVisible: false,
}
2020-11-04 10:30:14 +08:00
},
methods: {
handleClose(done) {
this.$confirm('Are you sure to close this dialog?')
2021-09-04 19:29:28 +08:00
.then((_) => {
done()
2020-11-04 10:30:14 +08:00
})
2021-09-04 19:29:28 +08:00
.catch((_) => {})
},
},
}
2020-11-04 10:30:14 +08:00
< / script >
2021-06-10 23:55:46 +08:00
<!--
< setup >
import { defineComponent, ref } from 'vue';
import { ElMessageBox } from 'element-plus';
export default defineComponent({
setup() {
const dialogVisible = ref(false);
const handleClose = (done) => {
ElMessageBox
.confirm('Are you sure to close this dialog?')
.then((_) => {
done();
})
.catch((_) => {});
};
return {
dialogVisible,
handleClose,
};
},
});
< / setup >
-->
2020-11-04 10:30:14 +08:00
```
2021-09-04 19:29:28 +08:00
2020-11-04 10:30:14 +08:00
:::
:::tip
2021-09-04 19:29:28 +08:00
`before-close` はユーザが閉じるアイコンか背景をクリックしたときにのみ動作します。footer`という名前のスロットにdialogを閉じるボタンがある場合、ボタンのクリックイベントハンドラに`before-close`と同じように`before-close` を追加することができます。
2020-11-04 10:30:14 +08:00
:::
### カスタマイズ
dialog の内容は何でも構いません、テーブルやフォームであっても構いません。この例では、要素テーブルとフォームを dialog で使う方法を示しています。
:::demo
```html
2021-09-04 19:29:28 +08:00
< el-button type = "text" @click =" dialogTableVisible = true"
>open a Table nested Dialog< /el-button
>
2020-11-04 10:30:14 +08:00
2020-11-23 09:47:23 +08:00
< el-dialog title = "Shipping address" v-model = "dialogTableVisible" >
2020-11-04 10:30:14 +08:00
< el-table :data = "gridData" >
< el-table-column property = "date" label = "Date" width = "150" > < / el-table-column >
< el-table-column property = "name" label = "Name" width = "200" > < / el-table-column >
< el-table-column property = "address" label = "Address" > < / el-table-column >
< / el-table >
< / el-dialog >
<!-- Form -->
2021-09-04 19:29:28 +08:00
< el-button type = "text" @click =" dialogFormVisible = true"
>open a Form nested Dialog< /el-button
>
2020-11-04 10:30:14 +08:00
2020-11-23 09:47:23 +08:00
< el-dialog title = "Shipping address" v-model = "dialogFormVisible" >
2020-11-04 10:30:14 +08:00
< el-form :model = "form" >
< el-form-item label = "Promotion name" :label-width = "formLabelWidth" >
< el-input v-model = "form.name" autocomplete = "off" > < / el-input >
< / el-form-item >
< el-form-item label = "Zones" :label-width = "formLabelWidth" >
< el-select v-model = "form.region" placeholder = "Please select a zone" >
< el-option label = "Zone No.1" value = "shanghai" > < / el-option >
< el-option label = "Zone No.2" value = "beijing" > < / el-option >
< / el-select >
< / el-form-item >
< / el-form >
2020-11-23 09:47:23 +08:00
< template #footer >
< span class = "dialog-footer" >
< el-button @click =" dialogFormVisible = false" > Cancel</ el-button >
2021-09-04 19:29:28 +08:00
< el-button type = "primary" @click =" dialogFormVisible = false"
>Confirm< /el-button
>
2020-11-23 09:47:23 +08:00
< / span >
< / template >
2020-11-04 10:30:14 +08:00
< / el-dialog >
< script >
export default {
data() {
return {
2021-09-04 19:29:28 +08:00
gridData: [
{
date: '2016-05-02',
name: 'John Smith',
address: 'No.1518, Jinshajiang Road, Putuo District',
},
{
date: '2016-05-04',
name: 'John Smith',
address: 'No.1518, Jinshajiang Road, Putuo District',
},
{
date: '2016-05-01',
name: 'John Smith',
address: 'No.1518, Jinshajiang Road, Putuo District',
},
{
date: '2016-05-03',
name: 'John Smith',
address: 'No.1518, Jinshajiang Road, Putuo District',
},
],
2020-11-04 10:30:14 +08:00
dialogTableVisible: false,
dialogFormVisible: false,
form: {
name: '',
region: '',
date1: '',
date2: '',
delivery: false,
type: [],
resource: '',
2021-09-04 19:29:28 +08:00
desc: '',
2020-11-04 10:30:14 +08:00
},
2021-09-04 19:29:28 +08:00
formLabelWidth: '120px',
}
},
}
2020-11-04 10:30:14 +08:00
< / script >
2021-06-10 23:55:46 +08:00
<!--
< setup >
import { defineComponent, reactive, toRefs } from 'vue';
export default defineComponent({
setup() {
const state = reactive({
gridData: [
{
date: '2016-05-02',
name: 'John Smith',
address: 'No.1518, Jinshajiang Road, Putuo District',
},
{
date: '2016-05-04',
name: 'John Smith',
address: 'No.1518, Jinshajiang Road, Putuo District',
},
{
date: '2016-05-01',
name: 'John Smith',
address: 'No.1518, Jinshajiang Road, Putuo District',
},
{
date: '2016-05-03',
name: 'John Smith',
address: 'No.1518, Jinshajiang Road, Putuo District',
},
],
dialogTableVisible: false,
dialogFormVisible: false,
form: {
name: '',
region: '',
date1: '',
date2: '',
delivery: false,
type: [],
resource: '',
desc: '',
},
formLabelWidth: '120px',
});
return {
...toRefs(state),
};
},
});
< / setup >
-->
2020-11-04 10:30:14 +08:00
```
2021-09-04 19:29:28 +08:00
2020-11-04 10:30:14 +08:00
:::
2021-09-04 19:29:28 +08:00
### ネストされた dialog
ある dialog が他の dialog にネストになっている場合は `append-to-body` が必要です。
:::demo 通常、ネストになった dialog を使うことはお勧めしません。複数の dialog をページ上でレンダリングしたい場合は、単にそれらをフラットにして隣接することができます。dialog を別の dialog の中に入れ子にしなければならない場合は、入れ子にした dialog の `append-to-body` を true に設定すると、親ノードではなくボディに追加され、両方の dialog が正しくレンダリングされます。
2020-11-04 10:30:14 +08:00
```html
< template >
2021-09-04 19:29:28 +08:00
< el-button type = "text" @click =" outerVisible = true"
>open the outer Dialog< /el-button
>
2020-11-04 11:15:05 +08:00
2020-11-23 09:47:23 +08:00
< el-dialog title = "Outer Dialog" v-model = "outerVisible" >
2020-11-04 10:30:14 +08:00
< el-dialog
2021-09-04 19:29:28 +08:00
width="30%"
title="Inner Dialog"
v-model="innerVisible"
append-to-body
>
2020-11-04 10:30:14 +08:00
< / el-dialog >
2020-11-23 09:47:23 +08:00
< template #footer >
< div class = "dialog-footer" >
< el-button @click =" outerVisible = false" > Cancel</ el-button >
2021-09-04 19:29:28 +08:00
< el-button type = "primary" @click =" innerVisible = true"
>open the inner Dialog< /el-button
>
2020-11-23 09:47:23 +08:00
< / div >
< / template >
2020-11-04 10:30:14 +08:00
< / el-dialog >
< / template >
< script >
export default {
data() {
return {
outerVisible: false,
2021-09-04 19:29:28 +08:00
innerVisible: false,
}
},
2020-11-04 10:30:14 +08:00
}
< / script >
2021-06-10 23:55:46 +08:00
<!--
< setup >
import { defineComponent, ref } from 'vue';
export default defineComponent({
setup() {
return {
outerVisible: ref(false),
innerVisible: ref(false),
};
},
});
< / setup >
-->
2020-11-04 10:30:14 +08:00
```
2021-09-04 19:29:28 +08:00
2020-11-04 10:30:14 +08:00
:::
### 中央揃えコンテンツ
2021-09-04 19:29:28 +08:00
dialog の内容を中央揃えにすることができます。
2020-11-04 10:30:14 +08:00
2021-09-04 19:29:28 +08:00
:::demo `center` を `true` に設定すると、dialog のヘッダとフッタを水平方向に中央揃えにします。`center`は Dialog のヘッダとフッタにのみ影響します。dialog のボディは何でもいいので、中央揃えにすると見栄えが悪くなることがあります。ボディも中央揃えにしたい場合は、CSS を書く必要があります。
2020-11-04 10:30:14 +08:00
2021-09-04 19:29:28 +08:00
```html
< el-button type = "text" @click =" centerDialogVisible = true"
>Click to open the Dialog< /el-button
>
< el-dialog title = "Warning" v-model = "centerDialogVisible" width = "30%" center >
< span
>It should be noted that the content will not be aligned in center by
default< /span
>
2020-11-23 09:47:23 +08:00
< template #footer >
< span class = "dialog-footer" >
< el-button @click =" centerDialogVisible = false" > Cancel</ el-button >
2021-09-04 19:29:28 +08:00
< el-button type = "primary" @click =" centerDialogVisible = false"
>Confirm< /el-button
>
2020-11-23 09:47:23 +08:00
< / span >
< / template >
2020-11-04 10:30:14 +08:00
< / el-dialog >
< script >
export default {
data() {
return {
2021-09-04 19:29:28 +08:00
centerDialogVisible: false,
}
},
}
2020-11-04 10:30:14 +08:00
< / script >
2021-06-10 23:55:46 +08:00
<!--
< setup >
import { defineComponent, ref } from 'vue';
export default defineComponent({
setup() {
return {
centerDialogVisible: ref(false),
};
},
});
< / setup >
-->
2020-11-04 10:30:14 +08:00
```
2021-09-04 19:29:28 +08:00
2020-11-04 10:30:14 +08:00
:::
:::tip
2021-09-04 19:29:28 +08:00
dialog の内容は遅延的にレンダリングされます。つまり、デフォルトのスロットは最初に開かれるまで DOM にレンダリングされません。したがって、DOM の操作を行ったり `ref` を使ってコンポーネントにアクセスする必要がある場合は、`open` イベントコールバックで行います。
2020-11-04 10:30:14 +08:00
:::
2021-09-04 19:29:28 +08:00
### dialog 内の要素を破棄する (translation needed)
2020-11-04 10:30:14 +08:00
2020-12-07 00:13:05 +08:00
When this is feature is enabled, the content under default slot will be destroyed with a `v-if` directive. Enable this when you have perf concerns.
:::demo Note that by enabling this feature, the content will not be rendered before `transition.beforeEnter` dispatched, there will only be `overlay` `header(if any)` `footer(if any)` .
```html
2021-09-04 19:29:28 +08:00
< el-button type = "text" @click =" centerDialogVisible = true"
>Click to open Dialog< /el-button
>
2020-12-07 00:13:05 +08:00
< el-dialog
title="Notice"
v-model="centerDialogVisible"
width="30%"
destroy-on-close
2021-09-04 19:29:28 +08:00
center
>
< span
>Notice: before dialog gets opened for the first time this node and the one
bellow will not be rendered< /span
>
2020-12-07 00:13:05 +08:00
< div >
< strong > Extra content (Not rendered)< / strong >
< / div >
< template #footer >
< span class = "dialog-footer" >
< el-button @click =" centerDialogVisible = false" > Cancel</ el-button >
2021-09-04 19:29:28 +08:00
< el-button type = "primary" @click =" centerDialogVisible = false"
>Confirm< /el-button
>
2020-12-07 00:13:05 +08:00
< / span >
< / template >
< / el-dialog >
< script >
export default {
data() {
return {
2021-09-04 19:29:28 +08:00
centerDialogVisible: false,
}
},
}
2020-12-07 00:13:05 +08:00
< / script >
2021-06-10 23:55:46 +08:00
<!--
< setup >
import { defineComponent, ref } from 'vue';
export default defineComponent({
setup() {
return {
centerDialogVisible: ref(false),
};
},
});
< / setup >
-->
2020-12-07 00:13:05 +08:00
```
2020-11-04 10:30:14 +08:00
2020-12-09 18:23:15 +08:00
:::tip
When using `modal` = false, please make sure that `append-to-body` was set to **true** , because `Dialog` was positioned by `position: relative` , when `modal` gets removed, `Dialog` will position itself based on the current position in the DOM, instead of `Document.Body` , thus the style will be messed up.
:::
2020-11-04 10:30:14 +08:00
### 属性
2021-09-04 19:29:28 +08:00
| Attribute | Description | Type | Accepted Values | Default |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | --------------- | ------- |
| model-value / v-model | dialog の可視性 | boolean | — | — |
| title | dialog のタイトルを指定します。名前付きスロットで渡すこともできます (次のテーブルを参照してください)。 | string | — | — |
| width | dialog の幅 | string / number | — | 50% |
| fullscreen | dialog が全画面を占めるかどうか | boolean | — | false |
| top | dialogCSS の `margin-top` の値 | string | — | 15vh |
| modal | マスクが表示されているかどうか | boolean | — | true |
| append-to-body | dialog 自身をボディに追加するかどうかを指定します。入れ子になった dialog は、この属性を `true` に設定しなければなりません。 | boolean | — | false |
| lock-scroll | dialog 表示中にボディのスクロールを無効にするかどうか | boolean | — | true |
| custom-class | dialog 用のカスタムクラス名 | string | — | — |
| open-delay | Time(milliseconds) before open | number | — | 0 |
| close-delay | Time(milliseconds) before close | number | — | 0 |
| close-on-click-modal | マスクをクリックして dialog を閉じることができるかどうか | boolean | — | true |
| close-on-press-escape | ESC を押して dialog を閉じることができるかどうか | boolean | — | true |
| show-close | 閉じるボタンを表示するかどうか | boolean | — | true |
| before-close | コールバックを使用することで、dialog が閉じるのを防ぐことができます。 | function(done), done is used to close the Dialog | — | — |
| center | ヘッダーとフッターを中央に配置するかどうか | boolean | — | false |
| destroy-on-close | dialog を閉じたときに dialog 内の要素を破棄する | boolean | — | false |
2020-11-04 10:30:14 +08:00
### スロット
2021-09-04 19:29:28 +08:00
| Name | Description |
| ------ | --------------------- |
| — | dialog の内容 |
| title | dialog タイトルの内容 |
| footer | dialog フッターの内容 |
2020-11-04 10:30:14 +08:00
### イベント
2021-09-04 19:29:28 +08:00
| Event Name | Description | Parameters |
| ---------- | --------------------------------------------------------------------- | ---------- |
| open | dialog が開いたときにトリガーされます。 | — |
| opened | dialog のオープニングアニメーションが終了したときにトリガーされます。 | — |
| close | dialog が閉じたときにトリガーされます。 | — |
| closed | dialog 終了アニメーションの終了時にトリガーされます。 | — |