ElementPlus Drawer 抽屜

2021-09-27 11:04 更新

Drawer 抽屜

有些時候, 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

當你不需要標題到時候, 你還可以去掉標題


當遇到不需要 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>

自定義內(nèi)容

和 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 Attributes

Drawer 和 Dialog 的屬性幾乎相同。

參數(shù)說明類型可選值默認值
model-value / v-model是否顯示 Drawerbooleanfalse
append-to-bodyDrawer 自身是否插入至 body 元素上。嵌套的 Drawer 必須指定該屬性并賦值為 truebooleanfalse
lock-scroll是否在 Drawer 出現(xiàn)時將 body 滾動鎖定booleantrue
before-close關(guān)閉前的回調(diào),會暫停 Drawer 的關(guān)閉function(done),done 用于關(guān)閉 Drawer
close-on-click-modal是否可以通過點擊 modal 關(guān)閉 Drawerbooleantrue
close-on-press-escape是否可以通過按下 ESC 關(guān)閉 Drawerbooleantrue
open-delayDrawer 打開的延時時間,單位毫秒number0
close-delayDrawer 關(guān)閉的延時時間,單位毫秒number0
custom-classDrawer 的自定義類名string
destroy-on-close控制是否在關(guān)閉 Drawer 之后將子元素全部銷毀boolean-false
modal是否需要遮罩層booleantrue
directionDrawer 打開的方向Directionrtl / ltr / ttb / bttrtl
show-close是否顯示關(guān)閉按鈕booleantrue
sizeDrawer 窗體的大小, 當使用 number 類型時, 以像素為單位, 當使用 string 類型時, 請傳入 'x%', 否則便會以 number 類型解釋number / string-'30%'
titleDrawer 的標題,也可通過具名 slot (見下表)傳入string
withHeader控制是否顯示 header 欄, 默認為 true, 當此項為 false 時, title attribute 和 title slot 均不生效boolean-true
modal-class遮罩層的自定義類名string--
z-index設置 z-indexnumber--

Drawer Slot

name說明
Drawer 的內(nèi)容
titleDrawer 標題區(qū)的內(nèi)容

Drawer Methods

name說明
handleClose用于關(guān)閉 Drawer, 該方法會調(diào)用傳入的 before-close 方法

Drawer Events

事件名稱說明回調(diào)參數(shù)
openDrawer 打開的回調(diào)
openedDrawer 打開動畫結(jié)束時的回調(diào)
closeDrawer 關(guān)閉的回調(diào)
closedDrawer 關(guān)閉動畫結(jié)束時的回調(diào)


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號