【相關推薦:、】
在實際開發中,經常需要基於element-plus封裝一些自己的客製化化元件,方便快速構建我們當前的業務。在vue2.0中父子元件資料的雙向繫結通常都是通過在props中傳值:value.sync,在子元件中使用,this.$emit(「update:value」, value)的方式,那麼我們怎樣在vue3中實現類似的父子元件的雙向繫結呢?
在vue2中,資料的響應式是基於Object.defineProperty物件進行資料的雙向繫結,這種劫持+釋出訂閱的模式並不能很好的檢測物件、陣列等複雜型別的資料。在vue3的資料的響應式是基於proxy的set、get方法,相對於Object.defineProperty的劫持,proxy代理的方式更為優雅。
具體實現思路如下:
<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>
<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的元件,大致實現思路都是如此。
<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其它相關文章!