欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue3中使用ref和emit來減少props的使用示例詳解

 更新時間:2022年06月21日 11:24:21   作者:@我不認(rèn)識你  
現(xiàn)在在開發(fā)vue3項目的過程中,我們開發(fā)小組漸漸的減少props的使用,轉(zhuǎn)而用ref 和 emit 來代替,這篇文章主要介紹了vue3中使用ref和emit來減少props的使用,需要的朋友可以參考下

前言

在之前開發(fā)vue2項目中,props 屬性在組件中經(jīng)常使用來進(jìn)行組件通信?,F(xiàn)在在開發(fā)vue3項目的過程中,我們開發(fā)小組漸漸的減少props的使用,轉(zhuǎn)而用refemit 來代替。缺點不太清楚,但是好處還是挺多的。下面結(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里面屬性的值

下面是借助refemit進(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ù)更新視圖不更新問題解決

    這篇文章主要為大家介紹了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)表頭)

    這篇文章主要介紹了vue element 中的table動態(tài)渲染實現(xiàn)(動態(tài)表頭),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • vue3+ts+vite2項目實戰(zhàn)踩坑記錄

    vue3+ts+vite2項目實戰(zhàn)踩坑記錄

    最近嘗試上手Vue3+TS+Vite,對比起Vue2有些不適應(yīng),但還是真香,下面這篇文章主要給大家介紹了關(guān)于vue3+ts+vite2項目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • VUE 單頁面使用 echart 窗口變化時的用法

    VUE 單頁面使用 echart 窗口變化時的用法

    這篇文章主要介紹了VUE 單頁面使用 echart 窗口變化時的用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue3中引入scss文件的方法步驟

    Vue3中引入scss文件的方法步驟

    這篇文章主要給大家介紹了關(guān)于Vue3中引入scss文件的方法步驟,在實際項目中,各種樣式往往有很多重復(fù)的情況,為了能夠使樣式的后續(xù)開發(fā)和維護(hù)更加愜意,將這些共同的代碼進(jìn)行命名然后調(diào)用這些變量是一個很好的選擇,需要的朋友可以參考下
    2023-08-08
  • 手把手教你如何在vue項目中使用rem布局

    手把手教你如何在vue項目中使用rem布局

    公司內(nèi)部一直有大屏的需求,也一直再做,中途也踩了一些坑,但是沒有認(rèn)真的來總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于如何在vue項目中使用rem布局的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • vue移動端項目緩存問題實踐記錄

    vue移動端項目緩存問題實踐記錄

    最近在做一個vue移動端項目,被緩存問題搞得頭都大了,積累了一些經(jīng)驗,特此記錄總結(jié)下,分享到腳本之家平臺,對vue移動端項目緩存問題實踐記錄感興趣的朋友跟隨小編一起看看吧
    2018-10-10
  • element-ui table span-method(行合并)的實現(xiàn)代碼

    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 模板代碼

    這篇文章主要介紹了在vs code 中如何創(chuàng)建一個自己的 Vue 模板代碼,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • vue3 銷毀組件方法及問題解決方案

    vue3 銷毀組件方法及問題解決方案

    這篇文章主要介紹了vue3 銷毀組件方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04

最新評論