vue3中使用ref和emit來減少props的使用示例詳解
前言
在之前開發(fā)vue2項目中,props
屬性在組件中經(jīng)常使用來進(jìn)行組件通信?,F(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-06vue 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-11element-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