vue3中使用ref和emit來減少props的使用示例詳解
前言
在之前開發(fā)vue2項目中,props 屬性在組件中經(jīng)常使用來進(jìn)行組件通信。現(xiàn)在在開發(fā)vue3項目的過程中,我們開發(fā)小組漸漸的減少props的使用,轉(zhuǎn)而用ref 和 emit 來代替。缺點不太清楚,但是好處還是挺多的。下面結(jié)合實際的開發(fā)常見來舉例。
示例
示例1
以彈窗組件來說,之前vue2時是通過props屬性來控制彈窗的打開,比如下面這個新增彈窗退貨的彈窗組件(大多數(shù)清空下,新增和修改一般是一個組件)
<add-return-goods :visible.sync="openEdit" :detail="rowData" :title="editTitle" @addSuccess="getTableInfo"></add-return-goods>
visible用來控制彈窗的顯示隱藏detail當(dāng)點擊修改時,用來向組件傳參title彈窗的標(biāo)題,同時也可以用來區(qū)分是新增彈窗還是,修改彈窗
第一個問題就是屬性多了就不容易管理,而且需要定義許多變量來作為參數(shù)。第二個問題就拿新增和修改來說,組件內(nèi)部要通過監(jiān)聽title來判斷當(dāng)前是新增還是修改,讓后來執(zhí)行不同的操作。
ref的優(yōu)點,在vue3,setup語法糖中,vue提供了defineExpose來向外暴露屬性和方法。針對上面的問題,只需要向外暴露一個新增方法和一個修改方法,修改和修改時只需要使用不同的方法即可。這樣就不再需要定義多余的變量,也不需要進(jìn)行監(jiān)聽
示例2
關(guān)于公共組件的開發(fā),比如有這樣一個彈窗組件

如果使用props來進(jìn)行封裝的話,基本需要下面這些屬性:
url:保存時,需要請求的接口params:參數(shù)(對象),保存時需要向后臺傳遞的參數(shù)- prop:屬性,因為狀態(tài)是可以修改的,所有需要一個屬性來進(jìn)行標(biāo)識,當(dāng)狀態(tài)改變后同步修改
params里面屬性的值
下面是借助ref和emit進(jìn)行的封裝
<template>
<el-dialog v-model="status.dialogVisible" title="批量修改狀態(tài)" width="400px" :close-on-click-modal="false" draggable
@close="closeDialog">
<el-form :model="status.form" label-position="top">
<el-form-item label="狀態(tài)選擇" prose="editStatus">
<el-radio-group v-model="status.form.editStatus">
<el-radio :label="1">使用</el-radio>
<el-radio :label="0">停用</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<span>
<el-button type="primary" :loading="status.saveLoading" @click="save">保存</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts">
export default {
name: 'batch-edit-state',
}
</script>
<script setup lang="ts">
import { reactive, defineExpose, defineEmits } from 'vue'
import { ElMessage } from 'element-plus'
import { BtUseAppStore } from 'beeboat-ui/es/core/store'
const appStore = BtUseAppStore()
const http = appStore.getHttp()
const emit = defineEmits(['save', 'saveSuccess'])
let status = reactive({
form: {
//修改狀態(tài)
editStatus: 1,
},
dialogVisible: false,
//保存加載
saveLoading: false,
})
//打開彈窗
let open = (value: number) => {
if (![0, 1].includes(value)) {
ElMessage.warning('狀態(tài)彈窗缺少入?yún)⒒騾?shù)值錯誤!')
return false
}
status.dialogVisible = true
status.form.editStatus = value
}
//關(guān)閉彈窗
let closeDialog = () => {
status.dialogVisible = false
status.form.editStatus = 1
status.saveLoading = false
}
//保存
let save = () => {
status.saveLoading = true
emit('save', status.form.editStatus, saveState)
}
//根據(jù)入?yún)ⅲ{(diào)用保存接口
let saveState = (url: string, params: any) => {
http.post(url, params)
.then(() => {
ElMessage.success('修改成功!')
closeDialog()
emit('saveSuccess')
})
}
defineExpose({
open,
})
</script>
<batch-edit-state ref="stateRef" @save="editStateSave" />
let editStateSave = (value: number, callback) => {
callback(url,params)
}
- 向外暴露一個
open方法用來打開彈窗,通過open方法的入?yún)磉M(jìn)行修改的初始化 - 當(dāng)點擊保存時,向父組件傳遞當(dāng)前的狀態(tài),以及一個保存的回調(diào)函數(shù)。
到此這篇關(guān)于vue3中使用ref和emit來減少props的使用的文章就介紹到這了,更多相關(guān)vue內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue3?reactive數(shù)據(jù)更新視圖不更新問題解決
這篇文章主要為大家介紹了vue3?reactive數(shù)據(jù)更新視圖不更新問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
vue element 中的table動態(tài)渲染實現(xiàn)(動態(tài)表頭)
這篇文章主要介紹了vue element 中的table動態(tài)渲染實現(xiàn)(動態(tài)表頭),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
element-ui table span-method(行合并)的實現(xiàn)代碼
element-ui官網(wǎng)中關(guān)于行合并的例子是根據(jù)行號進(jìn)行合并的,這顯然不符合我們?nèi)粘i_發(fā)需求,因為通常我們table中的數(shù)據(jù)都是動態(tài)生成的,非常具有實用價值,需要的朋友可以參考下2018-12-12
在vs code 中如何創(chuàng)建一個自己的 Vue 模板代碼
這篇文章主要介紹了在vs code 中如何創(chuàng)建一個自己的 Vue 模板代碼,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11

