範例詳解vue基於element-plus的元件二次封裝

2022-08-10 18:00:55
本篇文章給大家帶來了關於的相關知識,其中主要介紹了關於vue3基於element-plus的元件二次封裝資料雙向繫結的相關內容,在實際開發中,經常需要基於element-plus封裝一些自己的客製化化元件,方便快速構建我們當前的業務,下面一起來看一下,希望對大家有幫助。

【相關推薦:、】

基於element-plus的二次封裝資料雙向繫結

在實際開發中,經常需要基於element-plus封裝一些自己的客製化化元件,方便快速構建我們當前的業務。在vue2.0中父子元件資料的雙向繫結通常都是通過在props中傳值:value.sync,在子元件中使用,this.$emit(「update:value」, value)的方式,那麼我們怎樣在vue3中實現類似的父子元件的雙向繫結呢?

在vue2中,資料的響應式是基於Object.defineProperty物件進行資料的雙向繫結,這種劫持+釋出訂閱的模式並不能很好的檢測物件、陣列等複雜型別的資料。在vue3的資料的響應式是基於proxy的set、get方法,相對於Object.defineProperty的劫持,proxy代理的方式更為優雅。

具體實現思路如下:

表單的label和對應的選擇器、輸入框

效果預覽

在這裡插入圖片描述

el-input子元件的封裝 baseInput.vue

<template>
  <div class="base-input flex align-center">
    <div v-if="props.blockName">{{ props.blockName }}</div>
    <el-input placeholder="請輸入" v-model="chanValue"></el-input>
  </div>
</template>
<script setup>
import { computed } from 'vue'
const props = defineProps({
  blockName: {
    type: String,
    default: ''
  },
  value: {
    type: String,
    default: ''
  }
})
const emits = defineEmits(['update:value'])
// 通過重寫計算屬性的set和get方法,將計算屬性的結果繫結在輸入框的model中
const chanValue = computed({
  get: () => props.value,
  set: (val) => {
    emits('update:value', val)
  }
})
</script>

el-select子元件的封裝 baseSelect.vue

<template>
  <div class="base-select flex align-center">
    <div>{{ props.blockName }}</div>
    <el-select 
      v-model="chanValue" 
      :multiple="props.multiple" 
      :filterable="props.filterable" 
      :allow-create="props.allowCreate"
      :placeholder="placeholder" 
     >
      <el-option v-for="item in props.options" :key="item.value" :value="item.value" :label="item.label" />
    </el-select>
  </div>
</template>
<script setup>
import { computed } from 'vue'
const props = defineProps({
  blockName: {
    type: String,
    default: ''
  },
  value: {
    type: String,
    default: ''
  },
  placeholder: {
    type: String,
    default: '請選擇'
  },
  options: {
    type: Array,
    default() {
      return [{ value: '', label: '' }]
    }
  },
  // 一下三個屬性配合多選使用
  multiple: {
    type: Boolean,
    default: false
  },
  filterable: {
    type: Boolean,
    default: false
  },
  allowCreate: {
    type: Boolean,
    default: false
  }
})
const chanValue = computed({
  get: () => props.value,
  set: (val) => {
    emits('update:value', val)
  }
})
const emits = defineEmits(['update:value'])
</script>

其他元件的呼叫

<BaseInput blockName="傳入的label名稱" v-model:value="雙向繫結的資料" />
<BaseSelect blockName="傳入的label名稱" :options="選擇器的選項值" v-model:value="雙向繫結的資料" />

說明

利用computed的set,get方法,你可以進行父子元件的雙向繫結,再也不用擔心,子元件無法修改父元件的props而煩惱,其他的element的元件,大致實現思路都是如此。

基礎的dialog彈框

在這裡插入圖片描述

el-dialog子元件的封裝 baseDialog.vue

<template>
  <div>
    <el-dialog v-model="getShow" width="65%" :before-close="handlerCancer">
      <div>{{props.title}}</div>
      <slot/>
      <template #footer>
        <span>
          <button @click="handlerCancer">取消</button>
          <button @click="handlerSubmit">確定</button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import { computed } from 'vue'
const props = defineProps({
  title: {
   type: String,
   default:''
  },
  isShow: {
    type: Boolean,
    default: false
  }
})
const emits = defineEmits(['update:isShow'])
const handlerCancer = () => {
  emits('update:isShow', false)
}
const handlerSubmit = () => {
  // dialog 點選確定按鈕之前處理相關業務邏輯
  emits('update:isShow', false)
}
const getShow = computed({
  get: () => props.isShow,
  set: (val) => {
    emits('update:isShow', val)
  }
})
</script>

其他元件的呼叫

<BaseDialog title="傳入的標題名稱" v-model:isShow="isShow">
   <div>對應的插槽內容</div>
</BaseDialog>

注意事項

v-model雙向繫結預設的props名稱為value,像dialog這種繫結的是isShow,需要在v-model後面宣告雙向繫結的props引數名稱v-model:isShow,像input,select這種輸入框繫結預設為value,所以可以忽略不寫。若你係結其他值(即除了value以外的其他引數值),則需要v-model:isShow宣告

【相關推薦:、】

以上就是範例詳解vue基於element-plus的元件二次封裝的詳細內容,更多請關注TW511.COM其它相關文章!