关于uniapp的高级表单组件mosowe-form

 更新时间:2023年04月23日 10:32:26   作者:Mosowe  
这篇文章主要介绍了关于uniapp的高级表单组件mosowe-form,由于一些表单标签改来改去比较繁琐,重复性很多,且样式布局啥的几乎万变不离其中,为了偷懒,开发了mosowe-form及mosowe-table两款高级组件,需要的朋友可以参考下

演示地址

下载地址

引言

常年做web系统端,对web系统端的功能布局等有很深刻的了解,经常cv一些表单标签改来改去比较繁琐,重复性很多,且样式布局啥的几乎万变不离其中,为了偷懒,开发了mosowe-form及mosowe-table两款高级组件,其思路借鉴了antdesign的高级组件。

这里面依赖的组件基本是uniapp官方的和自己二次封装的:

依赖组件

uni-form
uni-data-picker
uni-datetime-picker
uni-file-picker
uni-easyinput
uni-datetime-picker
uni-data-select
uni-data-picker
uni-data-checkbox
uni-combox
uni-popup
uni-row
uni-col
mosowe-editor

在线演示

props

属性类型默认说明
options{formConfig, list:optionItem[]}-表单配置项
hideButtonbooleanfalse隐藏自带按钮
readOnlybooleanfalse只读
resetInterceptbooleanfalse重置表单前拦截
filterEmptybooleanfalse提交时过滤空值
groupColobject-表单分组布局,这里是统一配置,参考uni-col
itemColobject表单项布局,这里是统一配置,参考uni-col
btnAlignstringleft底部提交按钮位置 可选:left、right、center
submitTextstring提交提交按钮文案
resetTextstring重置重置按钮文案

formConfig

uni-form配置数据

optionItem

属性类型默认说明
subTitlestring-表单分组标题,非必选
colobject-表单分组布局,参考uni-col
itemsobject-下一级为formItem的name(标记itemName),配置为nameConfig

nameConfig

属性类型默认说明
typestring-表单类型,typeString
defaultValueany-默认值
colobject-该项布局,参考uni-col
hidebooleanfalse隐藏该表单,不渲染在html中
visiblebooleantrue显示该表单,display显隐
typePropsobject即表单项类型type的props配置
formItemPropsobjectuni-forms-item的props配置,配置项内的name不会成为uni-forms-item的name,会被itemName覆盖
unionNamestring关联表单类型,editer及upload无效,多个unionName用&分割,注意前后没有空格,即当本itemName值改变时,相关表单的值清空或者赋值,赋值方式:[关联itemName]=defaultValue,defaultValue多个的话使用[]包裹(目前组件中没有多选功能),若defaultValue值为number类型,则在值前添加一个~,例:sex=~1
transformfunction提交时转化,一般来说都是吐给后端的存在数据库里的数据,参数为当前值

typeString

说明
input表单输入框,文本域,注意:uni-easyinput文档中少写了一个prop:primaryColor 设置主题色(默认#2979ff)
select下拉选择,注意:uni-data-select文档中少写了一个prop:disabled 禁用
combox组合框
editor富文本编辑器,内部文件上传功能依赖云存储,需安装wangeditor
radio单选+多选
switch开关选择器
date日期选择器
slider滑动选择器
pickerpicker选择器
cascade级联选择器,仅限本地数据
upload文件上传,会自动上传至当前云服务空间,若未使用unicloud云服务空间,则不使用该组件,非自动上传,点击提交时上传

emits

emits说明
submit表单提交
reset表单重置
change表单项改变,返回表单项name及值

slots

slot说明
[itemName]DefaultformItem的default插槽
[itemName]DefaultBeforeformItem的default插槽内前置插槽
[itemName]DefaultAfterformItem的default插槽内后置插槽
[itemName]LabelformItem的label插槽
[itemName]LabelBeforeformItem的label插槽内前置插槽
[itemName]LabelAfterformItem的label插槽内后置插槽
button提交重置按钮区插槽,作用域参数为:submit,reset
lineAfter最后一个表单项后面的插槽,将会与表单项内联展示,不独立占一行,作用域参数为:submit,reset

示例代码

<template>
  <view class="index-page">
    <mosowe-form
      :options="formOptions"
      ref="mosoweFormRef"
      :groupCol="{
        span: 12
      }"
      @submit="submit"
      @reset="reset"
      @change="change"
    ></mosowe-form>
  </view>
</template>

<script setup lang="ts">
import { ref } from 'vue';


const mosoweFormRef = ref<any>(null)

const submit = (data:any) => {
  console.log('submit',data)
}

const reset = (data:any) => {
  console.log('reset',data)
}
const formOptions = ref({
  formConfig:{
    'label-width': '100px',
    'label-align': 'right'
  },
  list:[
    {
      subTitle: '表单分组一',
      col:{
        span: 24
      },
      items:{
        name:{
          type:'input',
          defaultValue: '测试',
          col:{
            span: 12
          },
          unionName: 'address=哈哈哈&sex=~1',
          typeProps:{
            placeholder:'请输入'
          },
          formItemProps:{
            label:'测试',
            required:true,
            rules:[
              {
                required:true,
                errorMessage: '请填写姓名'
              }
            ]
          }
        },
        address:{
          type:'input',
          col:{
            span: 12
          },
          defaultValue: null,
          typeProps:{
            primaryColor:'#999999',
            autoHeight:true,
            type:'textarea',
            placeholder:"写这里",
            placeholderStyle:"color:#ff0000",
          },
          formItemProps:{
            label:'文本域',
          }
        },
        editor:{
          type:'editor',
          defaultValue: '<p>11112222<strong>22</strong></p>',
          typeProps:{
          },
          formItemProps:{
            label:'编辑器',
          }
        }
      }
    },
    {
      subTitle: '表单分组二',
      items:{
        sex:{
          type:'select',
          defaultValue: '',
          unionName: 'address-哈哈哈,你是谁',
          typeProps:{
            placeholder:'请选择',
            localdata:[
              {
                value:0,
                text:'男'
              },
              {
                value:1,
                text:'女'
              },
              {
                value:2,
                text:'未知',
              },
            ]
          },
          formItemProps:{
            label:'性别',
          }
        },
        city:{
          type: 'combox',
          defaultValue: '',
          unionName: 'address=combox',
          typeProps:{
            candidates:[
              '北京',
              '重庆',
              '上海',
              '南京',
              '天津'
            ]
          },
          formItemProps:{
            label:'城市',
          }
        },
        chooseR:{
          type: 'radio',
          defaultValue: '',
          typeProps:{
            localdata:[
              {"value": 0,"text": "篮球"  },
              {"value": 1,"text": "足球"},
              {"value": 2,"text": "游泳"},
            ]
          },
          formItemProps:{
            label:'单选',
          }
        },
        switchData:{
          type:'switch',
          defaultValue: true,
          formItemProps:{
            label:'开关',
          }
        },
        sliderData:{
          type:'slider',
          defaultValue: 20,
          typeProps:{
            'show-value':true
          },
          formItemProps:{
            label:'滑块',
          }
        },
        date:{
          type:'date',
          defaultValue: '',
          typeProps:{},
          formItemProps:{
            label:'日期',
          }
        },
        daterange:{
          type:'date',
          defaultValue: '',
          typeProps:{
            type:'daterange'
          },
          formItemProps:{
            label:'日期范围',
          }
        },
        datetime:{
          type:'date',
          defaultValue: '',
          typeProps:{
            type:'datetime'
          },
          formItemProps:{
            label:'日期时间',
          }
        },
        datetimerange:{
          type:'date',
          defaultValue: '',
          typeProps:{
            type:'datetimerange'
          },
          formItemProps:{
            label:'日期时间范围',
          }
        },
        time:{
          type:'picker',
          defaultValue: '12:00',
          typeProps:{
            mode: 'time',
            start:'00:00',
            end:'13:59'
          },
          formItemProps:{
            label:'时间',
          }
        },
        pickerdate:{
          type:'picker',
          defaultValue: '2023-03',
          typeProps:{
            mode: 'date',
            fields:'month'
          },
          formItemProps:{
            label:'月份',
          }
        },
        cascade:{
          type:'cascade',
          defaultValue: [],
          typeProps:{
            localdata:[{
              text: "一年级",
              value: "1-0",
              children: [{
                text: "1.1班",
                value: "1-1"
              },
              {
                text: "1.2班",
                value: "1-2"
              }]
            },
            {
              text: "二年级",
              value: "2-0",
              children: [{
                text: "2.1班",
                value: "2-1"
              },
              {
                text: "2.2班",
                value: "2-2"
              }]
            },
            {
              text: "三年级",
              value: "3-0",
              disable: true
            }]
          },
          formItemProps:{
            label:'级联',
          }
        },
        file:{
          type:"upload",
          defaultValue:{
            extname: "png",
            name: "1111111.png",
            url: "https:..." // 改成实际地址
          },
          typeProps:{
            'return-type':'object'
          },
          formItemProps:{
            label: '文件上传'
          }
        },
        fileArr:{
          type:"upload",
          defaultValue:[{
            extname: "png",
            name: "1111111.png",
            url: "https:..." // 改成实际地址
          }],
          typeProps:{},
          formItemProps:{
            label: '文件上传'
          }
        },
        fileArrNo:{
          type:"upload",
          defaultValue:'',
          typeProps:{},
          formItemProps:{
            label: '文件上传'
          }
        },
      }
    }
  ]
})

const change = (name:string,value:any) =>{
  console.log('change',name,value)
  if (name === 'chooseR') {
    formOptions.value.list[1].items.city.typeProps.candidates = [
              '北京',
              '重庆',
              value
            ]
  }
}
</script>

<style lang="scss" scoped></style>

到此这篇关于关于uniapp的高级表单组件mosowe-form的文章就介绍到这了,更多相关uniapp的mosowe-form表单组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解vue2如何实现点击预览本地文件

    详解vue2如何实现点击预览本地文件

    这篇文章主要为大家详细介绍了vue2如何实现点击预览本地的word、excle、pdf文件,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • Vue 如何追踪数据变化

    Vue 如何追踪数据变化

    这篇文章主要介绍了Vue 如何追踪数据变化,帮助大家更好的理解和学习使用vue框架,感兴趣的朋友可以了解下
    2021-04-04
  • Vue如何导出页面为word格式

    Vue如何导出页面为word格式

    这篇文章主要介绍了Vue如何导出页面为word格式问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue3使用v-if指令进行条件渲染的实例代码

    Vue3使用v-if指令进行条件渲染的实例代码

    条件渲染是根据条件的真假来有条件地渲染元素,在Vue.js 3.x中,常见的条件渲染包括使用v-if指令和v-show指令,本文讲解使用v-if指令进行条件渲染,需要的朋友可以参考下
    2024-03-03
  • vue3集成echarts数据刷新后图表不刷新的解决方法

    vue3集成echarts数据刷新后图表不刷新的解决方法

    vue3 集成 echarts 最大的坑就是出现了,reactive 的数据 刷新了,但图表缺不会刷新,所以本文就给大家详细的介绍一下vue3集成echarts数据刷新后图表不刷新的解决方法,需要的朋友可以参考下
    2023-08-08
  • vue.js实现简单购物车功能

    vue.js实现简单购物车功能

    这篇文章主要为大家详细介绍了vue.js实现简单购物车功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • vue3中使用vuedraggable实现拖拽el-tree数据分组功能

    vue3中使用vuedraggable实现拖拽el-tree数据分组功能

    这篇文章主要介绍了vue3中使用vuedraggable实现拖拽el-tree数据分组功能,可以实现单个拖拽、双击添加、按住ctrl键实现多个添加,或者按住shift键实现范围添加,添加到框中的数据,还能拖拽排序,需要的朋友可以参考下
    2024-02-02
  • 解决vue3中from表单嵌套el-table时填充el-input,v-model不唯一问题

    解决vue3中from表单嵌套el-table时填充el-input,v-model不唯一问题

    这篇文章主要给大家介绍一下如何解决vue3中from表单嵌套el-table时填充el-input,v-model不唯一问题,文中有相关的解决方法,通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • vue 使用rules对表单字段进行校验的步骤

    vue 使用rules对表单字段进行校验的步骤

    这篇文章主要介绍了vue 使用rules对表单字段进行校验的步骤,帮助大家更好的理解和使用vue,感兴趣的朋友可以了解下
    2020-12-12
  • vite+vue3搭建的工程实现批量导入store的module

    vite+vue3搭建的工程实现批量导入store的module

    这篇文章主要介绍了vite+vue3搭建的工程实现批量导入store的module方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03

最新评论