本篇文章為大家帶來了關於vue的相關知識,其中主要介紹了關於vue3基於element-plus的組件二次封裝資料雙向綁定的相關內容,在實際開發中,經常需要基於element-plus封裝一些自己的客製化元件,方便快速建立我們目前的業務,下面一起來看一下,希望對大家有幫助。
【相關推薦:javascript影片教學、vue.js教學】
在實際開發中,經常需要基於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> <div>{{ props.blockName }}</div> <el-input></el-input> </div> </template> <script> 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> <div>{{ props.blockName }}</div> <el-select> <el-option></el-option> </el-select> </div> </template> <script> 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></baseinput> <baseselect></baseselect>
<template> <div> <el-dialog> <div>{{props.title}}</div> <slot></slot> <template> <span> <button>取消</button> <button>确定</button> </span> </template> </el-dialog> </div> </template> <script> 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> <div>对应的插槽内容</div> </basedialog>
以上是實例詳解vue基於element-plus的組件二次封裝的詳細內容。更多資訊請關注PHP中文網其他相關文章!