有些時候, Dialog 組件并不滿足我們的需求, 比如你的表單很長, 亦或是你需要臨時展示一些文檔, Drawer 擁有和 Dialog 幾乎相同的 API, 在 UI 上帶來不一樣的體驗.
因為 Vue 提供了 v-model 的原生支持,所以以前的 visible.sync 已經(jīng)不再適用,請使用 v-model="visibleBinding" 的表達式來綁定是否顯示抽屜組件
呼出一個臨時的側(cè)邊欄, 可以從多個方向呼出
需要設置 model-value 屬性,它的類型是 boolean,當為 true 時顯示 Drawer。Drawer 分為兩個部分:title 和 body,title 需要具名為 title 的 slot, 也可以通過 title 屬性來定義,默認值為空。需要注意的是, Drawer 默認是從右往左打開, 當然可以設置對應的 direction, 詳細請參考 direction 用法 最后,本例還展示了 before-close 的用法
<template>
<el-radio-group v-model="direction">
<el-radio label="ltr">從左往右開</el-radio>
<el-radio label="rtl">從右往左開</el-radio>
<el-radio label="ttb">從上往下開</el-radio>
<el-radio label="btt">從下往上開</el-radio>
</el-radio-group>
<el-button @click="drawer = true" type="primary" style="margin-left: 16px;">
點我打開
</el-button>
<el-drawer
title="我是標題"
v-model="drawer"
:direction="direction"
:before-close="handleClose"
destroy-on-close
>
<span>我來啦!</span>
</el-drawer>
</template>
<script>
export default {
data() {
return {
drawer: false,
direction: 'rtl',
}
},
methods: {
handleClose(done) {
this.$confirm('確認關(guān)閉?')
.then((_) => {
done()
})
.catch((_) => {})
},
},
}
</script>
當你不需要標題到時候, 你還可以去掉標題
當遇到不需要 title 的場景時, 可以通過 withHeader 這個屬性來關(guān)閉掉 title 的顯示, 這樣可以留出更大的空間給到用戶, 為了用戶的可訪問性, 請務必設定 title 的值
<template>
<el-button @click="drawer = true" type="primary" style="margin-left: 16px;">
點我打開
</el-button>
<el-drawer title="我是標題" v-model="drawer" :with-header="false">
<span>我來啦!</span>
</el-drawer>
</template>
<script>
export default {
data() {
return {
drawer: false,
}
},
}
</script>
和 Dialog 組件一樣, Drawer 同樣可以在其內(nèi)部嵌套各種豐富的操作
<template>
<el-button type="text" @click="table = true">打開嵌套表格的 Drawer</el-button>
<el-button type="text" @click="dialog = true"
>打開嵌套 Form 的 Drawer</el-button
>
<el-drawer title="我嵌套了表格!" v-model="table" direction="rtl" size="50%">
<el-table :data="gridData">
<el-table-column property="date" label="日期" width="150"></el-table-column>
<el-table-column property="name" label="姓名" width="200"></el-table-column>
<el-table-column property="address" label="地址"></el-table-column>
</el-table>
</el-drawer>
<el-drawer
title="我嵌套了 Form !"
:before-close="handleClose"
v-model="dialog"
direction="ltr"
custom-class="demo-drawer"
ref="drawer"
>
<div class="demo-drawer__content">
<el-form :model="form">
<el-form-item label="活動名稱" :label-width="formLabelWidth">
<el-input v-model="form.name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="活動區(qū)域" :label-width="formLabelWidth">
<el-select v-model="form.region" placeholder="請選擇活動區(qū)域">
<el-option label="區(qū)域一" value="shanghai"></el-option>
<el-option label="區(qū)域二" value="beijing"></el-option>
</el-select>
</el-form-item>
</el-form>
<div class="demo-drawer__footer">
<el-button @click="cancelForm">取 消</el-button>
<el-button
type="primary"
@click="$refs.drawer.closeDrawer()"
:loading="loading"
>{{ loading ? '提交中 ...' : '確 定' }}</el-button
>
</div>
</div>
</el-drawer>
</template>
<script>
export default {
data() {
return {
table: false,
dialog: false,
loading: false,
gridData: [
{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀區(qū)金沙江路 1518 弄',
},
{
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀區(qū)金沙江路 1518 弄',
},
{
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀區(qū)金沙江路 1518 弄',
},
{
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀區(qū)金沙江路 1518 弄',
},
],
form: {
name: '',
region: '',
date1: '',
date2: '',
delivery: false,
type: [],
resource: '',
desc: '',
},
formLabelWidth: '80px',
timer: null,
}
},
methods: {
handleClose(done) {
if (this.loading) {
return
}
this.$confirm('確定要提交表單嗎?')
.then((_) => {
this.loading = true
this.timer = setTimeout(() => {
done()
// 動畫關(guān)閉需要一定的時間
setTimeout(() => {
this.loading = false
}, 400)
}, 2000)
})
.catch((_) => {})
},
cancelForm() {
this.loading = false
this.dialog = false
clearTimeout(this.timer)
},
},
}
</script>
Drawer 組件也擁有多層嵌套的方法
同樣, 如果你需要嵌套多層 Drawer 請一定要設置 append-to-body 屬性為 true
<template>
<el-button @click="drawer = true" type="primary" style="margin-left: 16px;">
點我打開
</el-button>
<el-drawer title="我是外面的 Drawer" v-model="drawer" size="50%">
<div>
<el-button @click="innerDrawer = true">打開里面的!</el-button>
<el-drawer
title="我是里面的"
:append-to-body="true"
:before-close="handleClose"
v-model="innerDrawer"
>
<p>_(:зゝ∠)_</p>
</el-drawer>
</div>
</el-drawer>
</template>
<script>
export default {
data() {
return {
drawer: false,
innerDrawer: false,
}
},
methods: {
handleClose(done) {
this.$confirm('還有未保存的工作哦確定關(guān)閉嗎?')
.then((_) => {
done()
})
.catch((_) => {})
},
},
}
</script>
Drawer 的內(nèi)容是懶渲染的,即在第一次被打開之前,傳入的默認 slot 不會被渲染到 DOM 上。因此,如果需要執(zhí)行 DOM 操作,或通過 ref 獲取相應組件,請在 open 事件回調(diào)中進行。
Drawer 提供一個 destroyOnClose API, 用來在關(guān)閉 Drawer 時銷毀子組件內(nèi)容, 例如清理表單內(nèi)的狀態(tài), 在必要時可以將該屬性設置為 true 用來保證初始狀態(tài)的一致性
Drawer 和 Dialog 的屬性幾乎相同。
參數(shù) | 說明 | 類型 | 可選值 | 默認值 |
---|---|---|---|---|
model-value / v-model | 是否顯示 Drawer | boolean | — | false |
append-to-body | Drawer 自身是否插入至 body 元素上。嵌套的 Drawer 必須指定該屬性并賦值為 true | boolean | — | false |
lock-scroll | 是否在 Drawer 出現(xiàn)時將 body 滾動鎖定 | boolean | — | true |
before-close | 關(guān)閉前的回調(diào),會暫停 Drawer 的關(guān)閉 | function(done),done 用于關(guān)閉 Drawer | — | — |
close-on-click-modal | 是否可以通過點擊 modal 關(guān)閉 Drawer | boolean | — | true |
close-on-press-escape | 是否可以通過按下 ESC 關(guān)閉 Drawer | boolean | — | true |
open-delay | Drawer 打開的延時時間,單位毫秒 | number | — | 0 |
close-delay | Drawer 關(guān)閉的延時時間,單位毫秒 | number | — | 0 |
custom-class | Drawer 的自定義類名 | string | — | — |
destroy-on-close | 控制是否在關(guān)閉 Drawer 之后將子元素全部銷毀 | boolean | - | false |
modal | 是否需要遮罩層 | boolean | — | true |
direction | Drawer 打開的方向 | Direction | rtl / ltr / ttb / btt | rtl |
show-close | 是否顯示關(guān)閉按鈕 | boolean | — | true |
size | Drawer 窗體的大小, 當使用 number 類型時, 以像素為單位, 當使用 string 類型時, 請傳入 'x%', 否則便會以 number 類型解釋 | number / string | - | '30%' |
title | Drawer 的標題,也可通過具名 slot (見下表)傳入 | string | — | — |
withHeader | 控制是否顯示 header 欄, 默認為 true, 當此項為 false 時, title attribute 和 title slot 均不生效 | boolean | - | true |
modal-class | 遮罩層的自定義類名 | string | - | - |
z-index | 設置 z-index | number | - | - |
name | 說明 |
---|---|
— | Drawer 的內(nèi)容 |
title | Drawer 標題區(qū)的內(nèi)容 |
name | 說明 |
---|---|
handleClose | 用于關(guān)閉 Drawer, 該方法會調(diào)用傳入的 before-close 方法 |
事件名稱 | 說明 | 回調(diào)參數(shù) |
---|---|---|
open | Drawer 打開的回調(diào) | — |
opened | Drawer 打開動畫結(jié)束時的回調(diào) | — |
close | Drawer 關(guān)閉的回調(diào) | — |
closed | Drawer 關(guān)閉動畫結(jié)束時的回調(diào) | — |
更多建議: