经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » 微信小程序 » 查看文章
微信小程序动态生成表单来啦!你再也不需要手写表单了!
来源:cnblogs  作者:DCodes  时间:2023/11/20 8:57:07  对本文有异议

dc-vant-form

由于我们在小程序上涉及到数据采集业务,需要经常使用表单,微信小程序的表单使用起来非常麻烦,数据和表单是分离的,每个输入框都需要做数据处理才能实现响应式数据,所以我开发了dc-vant-form,针对原生微信小程序+vant组件构建的自定义表单,开发者可以通过表单配置项来快速生成表单。

1、??解决微信小程序表单双向绑定问题

2、??解决微信小程序下拉弹框值与表单绑定问题

3、?配置项自动生成表单

4、??表单详情通过配置项控制详情回显

5、??操作表单单项数据修改

6、??提供9种输入组件覆盖表单的大部分业务场景

说明

1、在使用前需要保证项目中安装了vant

2、在使用表单之前,你需要准备表单渲染的数据,以及当前用作回显的详情数据。

3、该表单提供了9种输入组件,分别为:文本、小数、整数、级联选择器、文本域、数字间隔输入器、标准时间选择器、年月日时间选择器、年月时间选择器。

4、初始化时配置参数必传,表单可传可不传,若只传配置参数,我们会根据配置参数自动生成表单。

5、表单提供编辑回显、单条数据传入回显。

6、通过getInit函数初始化表单,通过submit函数获取表单结果。


开始

  1. npm i dc-vant-form

自定义表单示例:

初始化

在初始化前,需要先定义初始化配置,配置项如下:

key 说明
label 表单label
module 表单绑定的数据key
type 表单组件类型,值对应:1文本、2小数、3整数、4级联选择器、5文本域、6时间选择器、7数字间隔输入器
isRequired 是否星号校验,值对应:true、false
options 表单下拉菜单项,值对应数组对象:[{label: '红色',value: 'red'}]
dateType 时间选择器类型,默认标准时间选择器,值对应:datetime标准时间、date年月日、year-month年月

注意点

类型 说明
type: 4 必须配置options项,你可以给它默认值空数组[]
type: 6 必须配置dateType项,你可以选择三种对应值:datetime、date、year-month
type: 7 必须配置 beginModule、endModule,分别对应左侧、右侧输入框;type为7不需要配置module项

下面是示例:

  1. "usingComponents": {
  2. "dc-vant-form": "/miniprogram_npm/dc-vant-form/dc-vant-form/index"
  3. }

页面:

  1. <dc-vant-form id="dc-vant-form" />

配置项:

  1. config: [
  2. {
  3. label: '详细地址',
  4. module: 'address',
  5. type: 1,
  6. isRequired: true
  7. },
  8. {
  9. label: '商品类型',
  10. module: 'goodsType',
  11. type: 4,
  12. isRequired: true,
  13. options: [
  14. {
  15. id: 1,
  16. label: '电子产品',
  17. value: 101
  18. },
  19. {
  20. id: 2,
  21. label: '儿童玩具',
  22. value: 102
  23. },
  24. {
  25. id: 3,
  26. label: '服装饰品',
  27. value: 103
  28. }
  29. ]
  30. },
  31. {
  32. label: '商品颜色',
  33. module: 'goodsColor',
  34. type: 4,
  35. isRequired: true,
  36. options: [
  37. {
  38. id: 1,
  39. label: '红色',
  40. value: 'red'
  41. },
  42. {
  43. id: 2,
  44. label: '青色',
  45. value: 'cyan'
  46. },
  47. {
  48. id: 3,
  49. label: '绿色',
  50. value: 'green'
  51. }
  52. ]
  53. },
  54. {
  55. label: '包装体积',
  56. module: 'packingVolume',
  57. type: 2,
  58. isRequired: false
  59. },
  60. {
  61. label: '商品重量',
  62. module: 'goodsWeight',
  63. type: 2,
  64. isRequired: true
  65. },
  66. {
  67. label: '商品结构',
  68. module: 'goodsStructure',
  69. type: 4,
  70. isRequired: true,
  71. options: [
  72. {
  73. id: 1,
  74. label: '成品',
  75. value: 2230
  76. },
  77. {
  78. id: 2,
  79. label: '组装',
  80. value: 2231
  81. }
  82. ]
  83. },
  84. {
  85. label: '商品数量',
  86. module: 'goodsNumber',
  87. type: 3,
  88. isRequired: false
  89. },
  90. {
  91. label: '可购范围',
  92. beginModule: 'beginLimit',
  93. endModule: 'endLimit',
  94. type: 7,
  95. isRequired: false
  96. },
  97. {
  98. label: '联系人',
  99. module: 'contact',
  100. type: 1,
  101. isRequired: false
  102. },
  103. {
  104. label: '创建时间',
  105. module: 'createDate',
  106. type: 6,
  107. dateType: 'date',
  108. isRequired: true
  109. },
  110. {
  111. label: '标准时间',
  112. module: 'createDate2',
  113. type: 6,
  114. dateType: 'datetime',
  115. isRequired: true
  116. },
  117. {
  118. label: '选区年月',
  119. module: 'createDate3',
  120. type: 6,
  121. dateType: 'year-month',
  122. isRequired: true
  123. },
  124. {
  125. label: '备注',
  126. module: 'remark',
  127. type: 5,
  128. isRequired: false
  129. }
  130. ]

我们将上面的配置项传入init函数初始化表单

  1. // 数据初始化
  2. init() {
  3. let dom = this.selectComponent("#dc-vant-form");
  4. dom.getInit(this.data.config)
  5. },
  6. onLoad(options) {
  7. this.init();
  8. },

image-20231118110736510


获取表单数据

我们通过submit函数获取表单数据

  1. // 提交
  2. sure() {
  3. let dom = this.selectComponent("#dc-vant-form");
  4. console.log(dom.submit());
  5. }

image-20231118112342663

image-20231118112407795


表单回显

在初始化时,可以传入表单详情,我们会根据配置项回显表单数据。

  1. // 表单详情数据
  2. form: {
  3. address: '浙江省杭州市',
  4. goodsType: 101,
  5. goodsColor: 'red',
  6. packingVolume: 10,
  7. goodsWeight: 5,
  8. goodsStructure: 2230,
  9. goodsNumber: 100,
  10. beginLimit: 1,
  11. endLimit: 10,
  12. contact: 'DCodes',
  13. createDate: '2023-01-01',
  14. createDate2: '2023-01-01 20:00:00',
  15. createDate3: '2023-01',
  16. remark: '这是一个动态的文本域'
  17. }
  1. init() {
  2. let { config,form } = this.data;
  3. let dom = this.selectComponent("#dc-vant-form");
  4. dom.getInit(config, form)
  5. },
  6. onLoad(options) {
  7. this.init();
  8. },

image-20231118112138758


单项数据修改

我们提供onAccept函数,用于接收指定表单项的修改

onAccept接收三个参数,依次为:value、key、place

参数 说明
value 更改的值
key 表单中对应的key
place 如果是数字间隔修改器,需要传入place,分为两个固定参数:left、right,表示需要修改间隔输入框的左侧和右侧

bandicam 2023-11-16 16-14-16-944 00_00_00-00_00_30~1

  1. // 修改某项
  2. update() {
  3. let dom = this.selectComponent("#dc-vant-form");
  4. // 普通类型
  5. // dom.onAccept('浙江省杭州市', 'address')
  6. // 级联选择器-value为options中的key
  7. // dom.onAccept(103, 'goodsType')
  8. // 数字间隔输入器
  9. // dom.onAccept(1, 'beginLimit', 'left')
  10. // dom.onAccept(3, 'endLimit', 'right')
  11. }

如果觉得该组件不错,欢迎点赞??、收藏??、转发?哦~

阅读其它:

微信小程序用户隐私API(??点击直达)

前端换肤,聊一聊主题切换那些事(??点击直达)

Shapes布局-文字环绕动画(??点击直达)

css绘制一个Pinia小菠萝(??点击直达)

深入理解Promise(??点击直达)

原文链接:https://www.cnblogs.com/wang-fan-w/p/17840577.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号