你还在重复编写表单代码吗?封装一个组件不香吗?

2023-10-29 21:40

本文主要是介绍你还在重复编写表单代码吗?封装一个组件不香吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

说在前面

🎈表单是我们平时在很多情况下都会用到的,那么重复的编写表单代码会不会让你感到厌烦呢?如果将其封装成一个可配置组件的话是不是会减少我们很多的工作量。

组件效果

image.png

具体效果如上图,组件主要包括三部分,分别是上面头部标题,中间的表单主体以及下面的操作按钮三大部分。

组件实现

image.png

组件可以具体划分为这么几部分进行实现:

1、弹窗遮罩

使用一个fixed定位的view元素覆盖整个页面,设置合适的背景颜色、层级和透明度即可。

  • wxml
<view bindtap="hideModal" catchtouchmove="preventTouchMove" class="modal-mask" wx:if="{{!hiddenmodalput}}"></view>
  • wxss
.modal-mask {width: 100%;height: 100%;position: fixed;top: 0;left: 0;background: #000;opacity: 0.5;overflow: hidden;z-index: 9000;color: #fff;
}

2、表单组件

2.1 配置规则定义

我们是希望可以通过传入配置信息到组件中,组件就可以生成我们想要的对应的表单呈现出来,那么我们需要先将配置信息的相关规则定义好,如下:

formData:[{name:'platform',cname:'平台|软件',value:'',type:'input',hide:false,placeholder:'平台|软件',},{name:'account',cname:'账号',value:'',type:'input',hide:false,placeholder:'账号',},{name:'password',cname:'密码',value:'',type:'input',hide:false,placeholder:'密码',},{name:'mark',cname:'备注',value:'',type:'textarea',hide:false,placeholder:'备注',}
],

上面是我自己定义的一个配置信息规则的例子,这里的配置项主要有6项,分别是:
name:该表单项的字段名;
cname:该表单项的中文名;
value:该表单项的值;
type:该表单项的展示类型;
hide:是否展示该表单项;
placeholder:该表单项的默认提示内容;
这是我结合自己的需求做出的一个配置,大家可以根据自己的实际需求来制定自己的配置信息。

2.2 配置规则处理

定义好了自己组件的一个配置规则之后,我们就需要在组件中对其进行适配处理了,下面还是以我上面制定的规则为例,简单描述一下处理过程:

  • 参数定义
    先在组件的properties中定义好需要父组件传入的参数。
properties: {formData:Array,hiddenmodalput:Boolean,tip:String
},
2.2.1 表单渲染

我们需要根据父组件传入的配置表生成对应的表单项,我们可以根据配置项的type字段来确定需要生成的表单项类型,如input为输入框、textarea为多行文本输入框、date为日期选择框、time为时间选择框……更多的类型可以自由扩展,我们只需要在这里进行一次处理,后面调用的时候传入对应的类型即可自动生成,这样可以省去我们很多重复的代码工作,具体实现代码如下:

<view catchtouchmove="preventTouchMove" class="modal-dialog" wx:if="{{!hiddenmodalput}}"><view class="modal-title">{{tip}}</view><view class="modal-content"><view wx:for="{{showFormData}}" wx:key="index"><view wx:if="{{!item.hide && item.type=='input'}}" class="modal-input"><input data-ind="{{index}}" bindinput="inputItem" class="input" maxlength="20" placeholder="{{item.placeholder}}" placeholderClass="input-holder" type="text" value="{{item.value}}"></input></view><view wx:if="{{!item.hide && item.type=='textarea'}}" class="modal-input"><textarea data-ind="{{index}}" bindinput="inputItem" class="input" maxlength="20" placeholder="{{item.placeholder}}" placeholderClass="input-holder" type="text" value="{{item.value}}"></textarea></view><view wx:if="{{!item.hide && item.type=='date'}}" class="modal-input"><picker data-ind="{{index}}" bindchange="inputItem" class="input-holder" end="2100-01-01" mode="date" start="{{item.value}}" value="{{item.value}}"><input class="input" disabled="ture" maxlength="20" placeholder="{{item.placeholder}}" placeholderClass="input-holder" type="text" value="{{item.value}}"></input></picker></view><view wx:if="{{!item.hide && item.type=='time'}}" class="modal-input"><picker data-ind="{{index}}" bindchange="inputItem" class="in" mode="time" start=""><input class="input" maxlength="20" placeholder="{{item.placeholder}}" placeholderClass="input-holder" type="text" value="{{item.value}}"></input></picker></view></view></view><view class="modal-footer"><view bindtap="cancel" class="btn-cancel" data-status="cancel">取消</view><view bindtap="confirm" class="btn-confirm" data-status="confirm">确定</view></view>
</view>
2.2.2 表单项数据监听

将表单项渲染展示出来之后,我们还需要可以对其进行数据处理,所以我们要监听每一个表单项的数值变化,并实时传递给父组件,父组件也可以及时根据表单项数值的变化进行一些相关的逻辑处理,这里我是这样处理的,我们以input类型的表单项来举例,代码如下:

<view wx:if="{{!item.hide && item.type=='input'}}" class="modal-input"><input data-ind="{{index}}" bindinput="inputItem" class="input" maxlength="20" placeholder="{{item.placeholder}}" placeholderClass="input-holder" type="text" value="{{item.value}}"></input>
</view>

看完上面代码可以发现,我们在组件的input事件上绑定了一个函数inputItem,通过这个函数来进行数据处理,那么让我们继续看看这个函数又进行了什么操作。

inputItem:function(e){let ind = e.target.dataset.ind;let val = e.detail.value;this.triggerEvent("inputItem", {ind:ind,val:val});
},

其实这个函数并没有进行什么特殊的处理,只是将数组变化的表单项下标和变化后的数组传递给父组件。

3、底部按钮

表单在填写完之后往往需要进行一个提交的操作,所以这里我也将确认按钮封装到了组件中。

<view class="modal-footer"><view bindtap="cancel" class="btn-cancel" data-status="cancel">取消</view><view bindtap="confirm" class="btn-confirm" data-status="confirm">确定</view>
</view>
confirm:function(){this.triggerEvent("confirm",{});
},
cancel:function(){this.triggerEvent("cancel",{});
}

组件使用

组件封装完了之后我们就该来使用一下试试效果了,那么具体该怎么使用呢?

1、组件引入

需要现在需要使用组件的页面json文件中引入组件

"usingComponents": {"modalDialog": "../../../components/modalDialog/modalDialog"
},

2、页面中使用

引入之后我们就该在页面中使用了,我们可以直接使用引入时定义的名称作为标签名,将相关的配置信息和事件绑定到组件上即可,代码如下:

  • wxml页面
<modalDialog bind:inputItem="inputItem" bind:cancel="cancel" bind:confirm="confirm" hiddenmodalput="{{hiddenmodalput}}" formData="{{formData}}"tip="{{tip}}">
</modalDialog>
  • 表单配置项
formData:[{name:'platform',cname:'平台|软件',value:'',type:'input',placeholder:'平台|软件',},{name:'account',cname:'账号',value:'',type:'input',placeholder:'账号',},{name:'password',cname:'密码',value:'',type:'input',placeholder:'密码',},{name:'mark',cname:'备注',value:'',type:'textarea',placeholder:'备注',}
],
tip:'添加信息',
hiddenmodalput:true,
  • 表单项数据监听
inputItem:function(e){let formData = this.data.formData;formData[e.detail.ind].value = e.detail.val;this.setData({formData:formData});
},
  • 取消按钮
cancel: function() {this.setData({hiddenmodalput: true});this.clearFormData();
},
  • 确认按钮
confirm: function() {this.setData({hiddenmodalput: true});this.clearFormData();
},

源码地址

该组件是在我的一个开源项目中封装使用的,需要查看源码的可以到该项目中查看:\

Gitee源码:https://gitee.com/zheng_yongtao/me-and-my-doodle/tree/master/miniprogram/components/modalDialog

觉得有帮助的同学可以帮忙给我点个star,感激不尽~~~
有什么想法或者改良可以给我提个pr,十分欢迎~~~
有什么问题都可以在评论告诉我~~~

往期精彩

vue封装一个图案手势锁组件

vue封装一个弹幕组件

为了学(mo)习(yu),我竟开发了这样一个插件

程序员的浪漫之——情侣日常小程序

JavaScript双向链表实现LRU缓存算法

JavaScript双向链表实现LFU缓存算法

JavaScript实现前缀树

vue简单实现词云图组件

vue + echarts实现中国地图省份下钻联动

纯CSS实现悬浮提示并封装成vue组件

使用学过的算法做个游戏很酷的好吗

说在后面

🎉这里是JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。

这篇关于你还在重复编写表单代码吗?封装一个组件不香吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/303519

相关文章

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave