当前位置: 首页 > news >正文

江苏做帖子网站电子商务网站建设薛万欣

江苏做帖子网站,电子商务网站建设薛万欣,怎么用服务器ip做网站,wordpress问题解决在使用Vue3的时候,有的时候,经常需要写很多的表单,使用UI组件库的时候,经常需要一大堆的Form和Form-Item;写的多,拷贝的也多,看到网上大佬的优雅代码,醍醐灌顶,改造了如下代码 UI库: arco-design/web-vue ^2.56.3 vue: ^3.5.12, 父组件 <template><div class"co…

在使用Vue3的时候,有的时候,经常需要写很多的表单,使用UI组件库的时候,经常需要一大堆的Form和Form-Item;写的多,拷贝的也多,看到网上大佬的优雅代码,醍醐灌顶,改造了如下代码

UI库: @arco-design/web-vue ^2.56.3

vue: ^3.5.12,

  1. 父组件
<template><div class="container"><!-- 第一种用法,单文件.vue的用法,所有的属性通过props传递过去 --><!-- <FormBuilder ref="formRef" v-model="formData" :fields="fields" :label-col-props="{ span: 2 }":wrapper-col-props="{ span: 20 }" :rules="rules"></FormBuilder> --><!-- 第二种用法,hooks的方式,通过渲染函数进行渲染,h --><FormBuilder2></FormBuilder2><a-button @click="handleSubmit">提交</a-button></div>
</template><script setup lang="ts">
import FormBuilder from '@/components/FormBuilder.vue';
import { Message } from '@arco-design/web-vue';
import useFormBuilder from '@/hooks/useFormBuilder';const formRef = useTemplateRef<InstanceType<typeof FormBuilder>>('formRef')const formData = reactive({name: '张',age: 18,gender: '1',
})const fields = computed(() => ([{componentType: 'input',formItemProps: {label: '姓名',field: 'name',required: true,},componentProps: {placeholder: '请输入姓名',}},{componentType: 'number',isHidden: formData.name === "张三", // ",formItemProps: {label: '年龄',field: 'age',},componentProps: {placeholder: '请输入年龄',}},{componentType: 'select',formItemProps: {label: '性别',field: 'gender',},componentProps: {placeholder: '请选择性别',options: [{ label: '男', value: '1' },{ label: '女', value: '2' }]}}
]))const rules = {name: [{ required: true, message: '请输入姓名' }],age: [{ required: true, message: '请输入年龄' }],gender: [{ required: true, message: '请选择性别' }],
}const handleSubmit = async () => {// const valid = await formRef.value?.validate()const valid = await getFormBuilderRef().value?.validate()if (valid) return Message.error('提交失败')console.log(formData);Message.success('提交成功')
}
const { FormBuilder: FormBuilder2, getRef: getFormBuilderRef } = useFormBuilder({modelValue: formData,fields: fields.value,rules,wrapperColProps: {span: 20},labelColProps: {span: 2}
})
</script><style lang="scss" scoped></style>
  1. FormBuilder.vue 子组件
<template><a-form ref="formRef" :model="formData" v-bind="$attrs"><a-row><a-col :span="getSpan(item)" v-for="item in filterFields" :key="item.formItemProps.field"><a-form-item v-bind="item.formItemProps"><slot :name="item.formItemProps.field"><component v-model="formData[item.formItemProps.field]" :is="getComponent(item)"v-bind="item.componentProps"></component></slot></a-form-item></a-col></a-row></a-form>
</template><script setup lang="ts" name="FormBuilder">
import { Input, InputNumber, Select } from '@arco-design/web-vue'
import type { ValidatedError } from '@arco-design/web-vue/es/form/interface'
const props = defineProps({fields: {type: Array as PropType<Record<string, any>[]>,default: () => []}
})const formRef = useTemplateRef('formRef')
const formData = defineModel<Record<string, any>>({ required: true })const componentMap = {input: Input,number: InputNumber,select: Select,
}const getComponent = (item: Record<string, any>) => {return componentMap[item.componentType as keyof typeof componentMap]
}// 1. isHidden 为函数每次更新表单时都会执行
// 2. 对fields使用 computed 缓存
// const filterFields = computed(() => {
//     return props.fields.filter((item) => {
//         return !(typeof item.isHidden === 'function' ? item.isHidden() : item.isHidden)
//     })
// })const filterFields = computed(() => {return props.fields.filter((item) => !item.isHidden)
})const getSpan = (item: Record<string, any>) => {return item.span || 12
}type ValidateFieldFnReturn = Promise<undefined | Record<string, ValidatedError>>
defineExpose({validate: () => formRef.value?.validate() as ValidateFieldFnReturn,validateField: ((field: string | string[]) => formRef.value?.validateField(field) as ValidateFieldFnReturn)
})
</script><style lang="scss" scoped></style>
  1. useFormBuilder.ts hooks文件
import FormBuilder from "@/components/FormBuilder.vue";
import type { SetupContext } from "vue";
type FormBuilderProps = InstanceType<typeof FormBuilder>["$props"];export default function useFormBuilder(props: Record<string, any>) {const formRef = ref<InstanceType<typeof FormBuilder>>();const Component = (_: Record<string, any>, { slots }: SetupContext) => {return h(FormBuilder, { ...(props as FormBuilderProps), ref: formRef }, slots);};return {FormBuilder: Component,getRef: () => formRef,};
}
  1. 最终的演示效果
    在这里插入图片描述
http://www.dtcms.com/a/456278.html

相关文章:

  • 网站内页不收录WordPress wp-cache
  • 建设部网站官工程质量手册章丘营销型网站设计公司
  • 泰国公共建设网站大学生创新创业大赛英文
  • 网站建设公司合伙人淮南移动网站建设
  • 沈阳制作公司网站门户网站通俗理解
  • 局域网网站制作wordpress 小插件
  • 网站后台忘了陕西西安网络公司
  • 四川住房和城乡建设局网站外贸网站平台都有哪些平台
  • 龙华做网站 熊掌号网站上的站点地图链接是这么做的
  • 网站按条件显示广告图片广州中山手工外发加工网
  • 怎么给自己公司做网站网站分析与优化
  • 烟台网站制作工具wordpress 重复内容
  • 莱西网站建设产品图案设计网站
  • 英语网站 php源码工程建设标准网站
  • 做网站旅游销售死链对网站的影响
  • 黑龙江做网站公司编写网站用什么语言
  • 如何上传到自己的网站网套加工机器设备
  • 赣州网站开发我做的网站怎样推广的
  • 个人网站备案填写wordpress图片属性添加
  • 免费建站微信18款禁用网站app直播
  • 东莞市企业网站制作平台苏州网站开发建设公司
  • 外贸网站 wordpress西安建网站
  • 网站如何清除百度收录开网店详细步骤流程
  • 中国网站服务器哪个好北京免费建网站
  • 柳州专业网站推广公司厦门建设局举报投诉
  • 洛阳网站建设设计公司哪家好店铺外卖网站怎么做
  • 浙江新地标建设集团网站电商网站开发可行分析
  • 建材做网站好吗网站建设南沙
  • 用ps个人网站怎么做小米开发者模式怎么关闭
  • 网站建设 服饰鞋帽个人网站开发总结文档