• uniapp的动态表单实现


    目录

    1.说明

    2.示例

     3.总结


    1.说明

    ①在 formData 中定义个数组变量用来接受同一个字段的多个结果。

    1. dynamicFormData: {
    2. email: '',
    3. // domains 字段下会有多个结果
    4. domains: []
    5. }

    ②使用 uni-forms-itemrules 属性定义单个表单域的校验规则。

    1. <uni-forms-item :label="item.label+' '+index" required
    2. :rules="[{'required': true,errorMessage: '域名项必填'}]" :key="item.id">
    3. ...
    4. </uni-forms-item>

    name 需要动态指定,动态表单推荐使用 Array 类型,内容从左到右为绑定值的调用链。['domains',index,'value'] 等同于 dynamicFormData.domains[index].value

    1. <uni-forms-item
    2. required
    3. :label="item.label+' '+index"
    4. :name="['domains',index,'value']"
    5. :rules="[{'required': true,errorMessage: '域名项必填'}]"
    6. :key="item.id"
    7. >
    8. ...
    9. </uni-forms-item>

    ④需要绑定值的组件的 v-model 也需要动态指定 dynamicFormData.domains[index].value

    1. <uni-forms-item
    2. required
    3. :label="item.label+' '+index"
    4. :name="['domains',index,'value']"
    5. :rules="[{'required': true,errorMessage: '域名项必填'}]"
    6. :key="item.id"
    7. >
    8. <uni-easyinput v-model="dynamicFormData.domains[index].value" placeholder="请输入域名" />
    9. </uni-forms-item>

    2.示例

    html层:

    1. <div v-for="(item,index) in formData.parts">
    2. <uni-forms-item class="is-direction-top" :label="index == 0?'参与人':''" :required="index == 0"
    3. :rules="[{'required': true,errorMessage: '请输入参与人'}]" :key="item.id" :name="['parts',index,'value']">
    4. <template v-slot:label v-if="index > 0">
    5. <div></div>
    6. </template>
    7. <view class="dmc">
    8. <uni-easyinput v-model="formData.parts[index].value" placeholder="请输入参与人" />
    9. <uni-icons class="dmc-btn" v-if="!index" @click="addParts" size="30" type="plus"
    10. color="#666"></uni-icons>
    11. <uni-icons class="dmc-btn" v-if="index" @click="delParts(index)" size="30" type="minus"
    12. color="#e43d33"></uni-icons>
    13. </view>
    14. </uni-forms-item>
    15. </div>
    16. <div v-for="(item,index) in formData.workTime">
    17. <uni-forms-item class="is-direction-top" :label="index == 0?'工作时间':''" :required="index == 0"
    18. :rules="[{'required': true,errorMessage: '请输入工作时间'}]" :key="item.id"
    19. :name="['workTime',index,'value']">
    20. <template v-slot:label v-if="index > 0">
    21. <div></div>
    22. </template>
    23. <view class="dmc">
    24. <uni-datetime-picker type="datetimerange" v-model="formData.workTime[index].value" hide-second :clear-icon="false"
    25. placeholder="请输入工作时间" />
    26. <uni-icons class="dmc-btn" v-if="!index" @click="addWorkTime" size="30" type="plus"
    27. color="#666"></uni-icons>
    28. <uni-icons class="dmc-btn" v-if="index" @click="delWorkTime(index)" size="30" type="minus"
    29. color="#e43d33"></uni-icons>
    30. </view>
    31. </uni-forms-item>
    32. </div>

    js层:

    1. const resetForm = () => {
    2. return {
    3. bsNo: stationInfo.bsNo,
    4. bsName: stationInfo.deptNm,
    5. fieldNo: '',
    6. fieldNm: '',
    7. cropKey: '',
    8. cropValue: '',
    9. mediNm: '',
    10. mediAcreage: '',
    11. saKey: '',
    12. saValue: '',
    13. mediPerMu: '',
    14. dosageMediKey: '',
    15. dosageMediValue: '',
    16. mediTotalMu: '',
    17. mediContent: '',
    18. mediModeKey: '',
    19. mediModeValue: '',
    20. participants: '',
    21. parts: [{ value: getUser().userName, id: Date.now() }],
    22. workTime: [{ value: [moment.now(), moment.now()], id: Date.now() }],
    23. timeList: [] as any,
    24. tempCount: NaN,
    25. mediType: 6
    26. }
    27. };
    28. // 初始表单数据设置
    29. let formData = ref(resetForm());

     3.总结

    当某个字段为动态时,要用数组来存放多个值;要注意校验规则的写法。

    我使用的是包含id及value的对象结构用来存在动态表单的数据。

  • 相关阅读:
    代码重构的几个步骤
    micropython与电机舵机(给初学者)
    【Rust 易学教程】学前准备:Cargo, 你好
    Linux实用指令-指定运行级别、帮助指令
    支付通道简述
    统计模型----决策树
    前置放大器和功率放大器有什么区别?
    win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境
    RabbitMQ消息积压比较厉害,然后突然丢弃
    循环结构在反汇编中特征
  • 原文地址:https://blog.csdn.net/m0_72167535/article/details/136330614