页面复用 -- 添加用户和编辑用户共用Drawer抽屉组件

一、功能介绍  

        在table表格页面中,有添加用户功能和编辑用户功能,两个功能弹出的页面是一样的(使用element plus抽屉组件Drawer),具体页面如图所示:

添加页面

 

编辑页面

二、要点总结

        1、两个页面不同之处,title不同:添加页面为添加用户,编辑页面为编辑用户。点击不同按钮触发的回调,显示对应的title;

        2.内容不同:添加页面对比编辑页面,多了一项用户密码输入框;

        3.内容不同隐含两个页面接口请求不相同,接口参数也需要注意。

        面对不同之处,具体应该怎么书写代码呢?

三、细节展示

        1、做标识区分

        抽屉显示与隐藏:这点很简单。声明一个中间变量  const drawer = ref<boolean>(false)   ,点击回调赋值为true则显示,false则关闭显示。   

        一开始写代码的时候,先写的是添加用户页面,也就先定义好了接口需要用到的参数。

接口参数

         后面为了区分点击不同按钮显示不同页面,这里对接口参数使用 Object.assign() 对接口参数浅拷贝(Object.assign()在最后详细介绍,这里先知道是浅拷贝即可),添加新的字段名 id 作为两个页面的区分点:有 id 则显示添加用户页面,没有 id 则显示编辑用户页面。

         这里需要注意的是:无论是编辑页面还是新增页面,校验信息显示需要去除。所以需要添加清除上一次校验错误提示。不然再一次点击时,上一次的错误提示任然存在。

第二次点击仍然存在上一次校验错误提示

2、标识在代码上的体现

        html代码中,页面标题 title 需要区分,以及页面中不需要的 input 输入框也要区分。上面提到的通过给参数添加 id 作为标识此时此刻便起到作用。

标题和输入框的显示与隐藏

        ts 代码中也是根据 addForm.id 是否存在,提示相应的成功和失败提示:有 id 则提示更新成功或者更新失败,没有 id 则提示添加成功或添加失败。

标识在ts代码上的体现

这里额外提两个注意点:

        1. <template #header> 插槽是 el-drawer 组件标题插槽,对应显示标题的位置

        2. 编辑按钮数据回显也是通过插槽实现 <template #default="{ row }">

template插槽实现数据回显

         也许应该注意到,点击确认添加 / 编辑用户的回调里面,应该发送接口请求。<标识在ts代码上的体现> 这幅图中只看到了一个请求函数,实际上这个函数中也做了区分。接下来跳转到同一个确定按钮(新增成功和编辑成功使用的是同一个按钮)请求函数是怎样区分新增请求个编辑请求的。 

         这里也是一样的,在发送请求之前,先判断传入参数中是否有 id 属性,如果有,调取更新请求,如果没有则调取新增请求。个人认为这一点处理非常巧妙,简化很多代码并且思路清晰。

补充:关于Object.assign()

        MDN给的解释是:Object.assign() 静态方法将一个或者多个源对象中所有可枚举自有属性复制到目标对象,并返回修改后的目标对象。(Object.assign() - JavaScript | MDN

        个人的理解:Object.assign() 可以用来复制对象的可枚举属性到目标对象,目标对象存在的属性,会被源对象替换;目标对象不存在的属性,会添加到目标对象中。有点绕,直接看两个案例吧。 

1.目标对象存在的属性,会被源对象替换

let target = { name: '高启强' ,age: '36' };
let source = { hobby: '抓高启强' };
let result = Object.assign ( target, source );
console.log(result) //{ name: '高启强', age: '36', hobby: '抓高启强' }

2.目标对象不存在的属性,会添加到目标对象中

let target = { name: '高启强' ,age: '36' , Ghobby: '房地产开发' };
let source = { name: '安欣' , age: '35' , Ahobby: '抓高启强' };
let result = Object.assign ( target, source );
console.log(result) //{ name: '安欣', age: '35', Ghobby: '房地产开发', Ahobby: '抓高启强' }
// source中的name'安欣'替换了'高启强',age'35'替换了'36',其他非共同属性则添加到目标对象 source 当中。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要在el-drawer头部添加元素,你可以使用以下方法。首先,给需要滚动的元素添加以下属性:overflow-x: hidden; overflow-y: auto; height: calc(100vh - 120px); 这样可以隐藏x轴滚动条,并设置高度使得元素在头部和底部之间滚动。 然后,在使用el-drawer时,你可以审查元素并发现关闭后,弹窗只是display:none,但仍然存在于DOM结构中。因此,在弹窗中的组件不会触发生命周期钩子。为了解决这个问题,你可以使用两种方法。第一种是设置destroy-on-close="true",这样在关闭时会销毁弹窗组件,避免触发生命周期钩子。另外,你还可以设置append-to-body="true",close-on-press-escape="false",visible.sync="drawer",direction="direction",custom-class="myclass"和before-close="handleClose"来进行更多的设置。第二种方法是使用v-if="drawer"来控制弹窗的显示与隐藏,同时也可以设置append-to-body="true",close-on-press-escape="false",visible.sync="drawer",direction="direction",custom-class="myclass"和before-close="handleClose"。 另外,如果你想要调整抽屉打开时添加到头部的额外高度,可以使用heightPadding变量来进行设置。你可以在组件页面中设置这个变量,并根据需要进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [el-drawer满屏时,内容超出不会滚动](https://blog.csdn.net/weixin_45286211/article/details/123892951)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [elementui el-drawer使用的技巧记录](https://blog.csdn.net/qq_27702739/article/details/121622586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [bottom-drawer:一个固定的底部抽屉 Polymer JS 组件,类似于 Discourse 的回复 composer](https://download.csdn.net/download/weixin_42129113/19853201)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tomtomgogo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值