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

作者:@我不认识你 时间:2024-04-27 16:02:02 

前言

在之前开发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

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

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

如果使用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 方法的入参来进行修改的初始化

  • 当点击保存时,向父组件传递当前的状态,以及一个保存的回调函数。

来源:https://blog.csdn.net/weixin_41897680/article/details/125323563

标签:vue,ref,emit,props
0
投稿

猜你喜欢

  • Golang 统计字符串字数的方法示例

    2024-02-17 07:35:44
  • getdata table表格数据join mysql方法

    2024-01-25 17:55:08
  • 多个jquery.datatable共存,checkbox全选异常的快速解决方法

    2024-05-11 09:18:50
  • 详解python数值与字符串高级用法

    2021-08-07 15:05:52
  • 常见数据库系统比较 Oracle数据库

    2024-01-26 04:18:57
  • python中threading超线程用法实例分析

    2023-12-14 13:05:45
  • 苹果Macbook Pro13 M1芯片安装Pillow的方法步骤

    2021-01-11 18:23:46
  • Python访问MongoDB,并且转换成Dataframe的方法

    2022-07-18 20:32:07
  • 解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题

    2024-04-27 16:17:33
  • 基于Python实现主机远程控制

    2023-11-24 17:27:31
  • 如何通过pycharm实现对数据库的查询等操作(非多步操作)

    2024-01-25 03:31:37
  • Python中22个万用公式的小结

    2022-12-15 21:06:38
  • 解决pandas read_csv 读取中文列标题文件报错的问题

    2023-04-16 06:54:37
  • 对pyqt5之menu和action的使用详解

    2022-03-12 23:00:37
  • PHP实现克鲁斯卡尔算法实例解析

    2023-09-08 19:35:57
  • 详解python分布式进程

    2023-07-01 16:25:16
  • 最适合人工智能开发的5种编程语言 附人工智能入门书籍

    2023-06-02 03:15:18
  • 妙用Dreamweaver MX共享WPS Office文件

    2010-09-05 21:18:00
  • Mysql中Insert into xxx on duplicate key update问题

    2024-01-23 22:32:36
  • Django商城项目注册功能的实现

    2022-01-19 05:22:36
  • asp之家 网络编程 m.aspxhome.com