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

如果使用props來進(jìn)行封裝的話,基本需要下面這些屬性:
url:保存時(shí),需要請(qǐng)求的接口params:參數(shù)(對(duì)象),保存時(shí)需要向后臺(tái)傳遞的參數(shù)- prop:屬性,因?yàn)闋顟B(tài)是可以修改的,所有需要一個(gè)屬性來進(jìn)行標(biāo)識(shí),當(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ù)值錯(cuò)誤!')
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)
}
- 向外暴露一個(gè)
open方法用來打開彈窗,通過open方法的入?yún)磉M(jìn)行修改的初始化 - 當(dāng)點(diǎn)擊保存時(shí),向父組件傳遞當(dāng)前的狀態(tài),以及一個(gè)保存的回調(diào)函數(shù)。
到此這篇關(guān)于vue3中使用ref和emit來減少props的使用的文章就介紹到這了,更多相關(guān)vue內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue3?reactive數(shù)據(jù)更新視圖不更新問題解決
這篇文章主要為大家介紹了vue3?reactive數(shù)據(jù)更新視圖不更新問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
vue element 中的table動(dòng)態(tài)渲染實(shí)現(xiàn)(動(dòng)態(tài)表頭)
這篇文章主要介紹了vue element 中的table動(dòng)態(tài)渲染實(shí)現(xiàn)(動(dòng)態(tài)表頭),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
vue3+ts+vite2項(xiàng)目實(shí)戰(zhàn)踩坑記錄
最近嘗試上手Vue3+TS+Vite,對(duì)比起Vue2有些不適應(yīng),但還是真香,下面這篇文章主要給大家介紹了關(guān)于vue3+ts+vite2項(xiàng)目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
VUE 單頁面使用 echart 窗口變化時(shí)的用法
這篇文章主要介紹了VUE 單頁面使用 echart 窗口變化時(shí)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
vue移動(dòng)端項(xiàng)目緩存問題實(shí)踐記錄
最近在做一個(gè)vue移動(dòng)端項(xiàng)目,被緩存問題搞得頭都大了,積累了一些經(jīng)驗(yàn),特此記錄總結(jié)下,分享到腳本之家平臺(tái),對(duì)vue移動(dòng)端項(xiàng)目緩存問題實(shí)踐記錄感興趣的朋友跟隨小編一起看看吧2018-10-10
element-ui table span-method(行合并)的實(shí)現(xiàn)代碼
element-ui官網(wǎng)中關(guān)于行合并的例子是根據(jù)行號(hào)進(jìn)行合并的,這顯然不符合我們?nèi)粘i_發(fā)需求,因?yàn)橥ǔN覀僼able中的數(shù)據(jù)都是動(dòng)態(tài)生成的,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-12-12
在vs code 中如何創(chuàng)建一個(gè)自己的 Vue 模板代碼
這篇文章主要介紹了在vs code 中如何創(chuàng)建一個(gè)自己的 Vue 模板代碼,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

