vue3中使用ref和emit来减少props的使用示例详解

 更新时间:2022年06月21日 11:24:21   作者:@我不认识你  
现在在开发vue3项目的过程中,我们开发小组渐渐的减少props的使用,转而用ref 和 emit 来代替,这篇文章主要介绍了vue3中使用ref和emit来减少props的使用,需要的朋友可以参考下

前言

在之前开发vue2项目中,props 属性在组件中经常使用来进行组件通信。现在在开发vue3项目的过程中,我们开发小组渐渐的减少props的使用,转而用refemit 来代替。缺点不太清楚,但是好处还是挺多的。下面结合实际的开发常见来举例。

示例

示例1

以弹窗组件来说,之前vue2时是通过props属性来控制弹窗的打开,比如下面这个新增弹窗退货的弹窗组件(大多数清空下,新增和修改一般是一个组件)

<add-return-goods :visible.sync="openEdit" :detail="rowData" :title="editTitle" @addSuccess="getTableInfo"></add-return-goods>
  • visible 用来控制弹窗的显示隐藏
  • detail 当点击修改时,用来向组件传参
  • title 弹窗的标题,同时也可以用来区分是新增弹窗还是,修改弹窗

第一个问题就是属性多了就不容易管理,而且需要定义许多变量来作为参数。第二个问题就拿新增和修改来说,组件内部要通过监听title来判断当前是新增还是修改,让后来执行不同的操作。

ref的优点,在vue3,setup语法糖中,vue提供了defineExpose来向外暴露属性和方法。针对上面的问题,只需要向外暴露一个新增方法和一个修改方法,修改和修改时只需要使用不同的方法即可。这样就不再需要定义多余的变量,也不需要进行监听

示例2

关于公共组件的开发,比如有这样一个弹窗组件

在这里插入图片描述

如果使用props来进行封装的话,基本需要下面这些属性:

  • url:保存时,需要请求的接口
  • params:参数(对象),保存时需要向后台传递的参数
  • prop:属性,因为状态是可以修改的,所有需要一个属性来进行标识,当状态改变后同步修改 params里面属性的值

下面是借助refemit进行的封装

<template>
    <el-dialog v-model="status.dialogVisible" title="批量修改状态" width="400px" :close-on-click-modal="false" draggable
        @close="closeDialog">
        <el-form :model="status.form" label-position="top">
            <el-form-item label="状态选择" 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: {
        //修改状态
        editStatus: 1,
    },
    dialogVisible: false,
    //保存加载
    saveLoading: false,
})

//打开弹窗
let open = (value: number) => {
    if (![0, 1].includes(value)) {
        ElMessage.warning('状态弹窗缺少入参或参数值错误!')
        return false
    }
    status.dialogVisible = true
    status.form.editStatus = value
}

//关闭弹窗
let closeDialog = () => {
    status.dialogVisible = false
    status.form.editStatus = 1
    status.saveLoading = false
}

//保存
let save = () => {
    status.saveLoading = true
    emit('save', status.form.editStatus, saveState)
}

//根据入参,调用保存接口
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 方法的入参来进行修改的初始化
  • 当点击保存时,向父组件传递当前的状态,以及一个保存的回调函数。

到此这篇关于vue3中使用ref和emit来减少props的使用的文章就介绍到这了,更多相关vue内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue-cli3.0如何使用prerender-spa-plugin插件预渲染

    vue-cli3.0如何使用prerender-spa-plugin插件预渲染

    这篇文章主要介绍了vue-cli3.0如何使用prerender-spa-plugin插件预渲染,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • vue+element tree懒加载更新数据的示例代码

    vue+element tree懒加载更新数据的示例代码

    这篇文章主要介绍了vue+element tree懒加载更新数据,文中给大家补充介绍了Vue Element Ui 树形表懒加载新增、修改、删除等操作后局部数据更新的详细代码,感兴趣的朋友跟随小编一起看看吧
    2022-09-09
  • 一文搞定vue3中的函数式弹窗

    一文搞定vue3中的函数式弹窗

    函数式弹窗是一种使用函数来创建弹窗的技术,它可以简化弹窗的使用,只需要在需要弹窗的地方调用函数就可以了,下面我们就来看看vue3中函数式弹窗的具体应用吧
    2024-01-01
  • vue中的封装常用工具类

    vue中的封装常用工具类

    这篇文章主要介绍了vue中的封装常用工具类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Vue cli3 库模式搭建组件库并发布到 npm的流程

    Vue cli3 库模式搭建组件库并发布到 npm的流程

    这篇文章主要介绍了Vue cli3 库模式搭建组件库并发布到 npm,以下一个简单的颜色选择器插件 vColorPicker 讲述从开发到上线到npm的流程,需要的朋友可以参考下
    2018-10-10
  • vue自定义指令directive的使用方法

    vue自定义指令directive的使用方法

    这篇文章主要介绍了vue自定义指令directive的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • element step组件在另一侧加时间轴显示

    element step组件在另一侧加时间轴显示

    本文主要介绍了element step组件在另一侧加时间轴显示,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • vue3 setup语法糖之父子组件之间的传值方法

    vue3 setup语法糖之父子组件之间的传值方法

    父组件向子组件传值的时候,子组件是通过props来接收的,然后以变量的形式将props传递到setup语法糖果中使用,本文给大家介绍vue3 setup语法糖之父子组件之间的传值,感兴趣的朋友一起看看吧
    2023-12-12
  • 用vue实现注册页效果 vue实现短信验证码登录

    用vue实现注册页效果 vue实现短信验证码登录

    这篇文章主要为大家详细介绍了用vue实现注册页,短信验证码登录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Vue Cli项目重构为Vite的方法步骤

    Vue Cli项目重构为Vite的方法步骤

    本文主要介绍了Vue Cli项目重构为Vite的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论