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项目打包并发布的完整步骤记录

    Vue项目打包并发布的完整步骤记录

    在一般情况下,vue项目代码部署发布只需将代码打包后直接上传到服务器即可,下面这篇文章主要给大家介绍了关于Vue项目打包并发布的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 在vue项目中引入highcharts图表的方法(详解)

    在vue项目中引入highcharts图表的方法(详解)

    下面小编就为大家分享一篇在vue项目中引入highcharts图表的方法(详解),具有很好的参考价值,希望对大家有所帮助
    2018-03-03
  • vue使用WebSocket模拟实现聊天功能

    vue使用WebSocket模拟实现聊天功能

    这篇文章主要介绍了vue使用WebSocket模拟实现聊天功能,通过创建node服务和server.js文件实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • Element Dropdown下拉菜单的使用方法

    Element Dropdown下拉菜单的使用方法

    这篇文章主要介绍了Element Dropdown下拉菜单的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 基于Vue3实现的图片散落效果实例

    基于Vue3实现的图片散落效果实例

    最近工作中遇到一个效果还不错,所以想着实现一下,下面这篇文章主要给大家介绍了关于如何基于Vue3实现的图片散落效果的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • vue实现鼠标经过动画

    vue实现鼠标经过动画

    这篇文章主要为大家详细介绍了vue实现鼠标经过动画的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • Vue利用openlayers实现点击弹窗的方法详解

    Vue利用openlayers实现点击弹窗的方法详解

    点击弹窗其实就是添加一个弹窗图层,然后在点击的时候让他显示出来罢了。本文将利用openlayers实现这一效果,快跟随小编一起学习一下吧
    2022-06-06
  • uniapp项目国际化标准的配置与实现

    uniapp项目国际化标准的配置与实现

    UniApp是一种基于Vue.js的跨平台开发框架,可以快速地开发同时运行在多个平台的应用程序,这篇文章主要介绍了uniapp项目国际化标准的配置与实现,需要的朋友可以参考下
    2023-11-11
  • vue实现同时设置多个倒计时

    vue实现同时设置多个倒计时

    这篇文章主要为大家详细介绍了vue实现同时设置多个倒计时,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • vue二选一tab栏切换新做法实现

    vue二选一tab栏切换新做法实现

    这篇文章主要介绍了vue二选一tab栏切换新做法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论