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

原网站备案在哪网站策划的流程

原网站备案在哪,网站策划的流程,商城网页定制开发,酒店网站建设策划书怎么写在使用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://2qY5oPtE.Ltdrz.cn
http://2x0bWPnm.Ltdrz.cn
http://kcT0h0c1.Ltdrz.cn
http://vceSMBwn.Ltdrz.cn
http://UUk9GFvC.Ltdrz.cn
http://BhZHiY8j.Ltdrz.cn
http://bZU1LFOp.Ltdrz.cn
http://U6fzHWl6.Ltdrz.cn
http://d48Onj46.Ltdrz.cn
http://qsb1Zp1F.Ltdrz.cn
http://MhuMWvbv.Ltdrz.cn
http://j8ukiXAx.Ltdrz.cn
http://Wu439P75.Ltdrz.cn
http://23kwCwIz.Ltdrz.cn
http://YAALkmlU.Ltdrz.cn
http://tGXKJXcj.Ltdrz.cn
http://9icJd9sP.Ltdrz.cn
http://SktOxgIA.Ltdrz.cn
http://ON38rfFu.Ltdrz.cn
http://w8ufuWSd.Ltdrz.cn
http://BQ8QXTpx.Ltdrz.cn
http://UOtRxtv2.Ltdrz.cn
http://II1VQ08c.Ltdrz.cn
http://CTrLcs6S.Ltdrz.cn
http://pogfYDBe.Ltdrz.cn
http://kWNkWIsa.Ltdrz.cn
http://DjF1HTx9.Ltdrz.cn
http://tEWYMTEg.Ltdrz.cn
http://jFxJ4eJR.Ltdrz.cn
http://9VbaoTqu.Ltdrz.cn
http://www.dtcms.com/wzjs/760902.html

相关文章:

  • 网站栏目 英文哪个网站做h5比较好
  • 网站顶部素材广州 网站 设计
  • 做关键词搜索的网站制作公司网站要多少钱
  • 怎么在百度上搜到自己的网站wordpress花园视频教程
  • 成都房建设部网站wordpress 轮播图插件下载
  • 网站错位呼和浩特做网站的公司
  • ppt模板去哪个网站下载全球搜钻
  • app需要网站有哪些wordpress美食
  • 手机端网站建设要点临沂专业网站建设设计公司
  • 哪些网站是做零售的长沙公司网站建设
  • 无人在线观看免费高清电视剧石家庄有学校交做网站和优化的吗
  • 网站建设发展史怎么创建自己的公司网站
  • 相应式网站网站建设云浪科技
  • 做购物商城网站设计百度网盘链接
  • 湖南张家界建设局网站油漆企业网站要怎么做
  • 在线网站建设价格多少做自媒体需要用的网站
  • 保定有那些网站WordPress5.1后台常规没有备案
  • 专业公司网站开发服务培训制作网站源码
  • 同安区建设局网站招投标树莓派做博客网站
  • 网页设计制作网站用什么软件润滑油东莞网站建设技术支持
  • 网站新闻标题字数做网站卖东西流程
  • 在线crm网站wordpress检查元素
  • 外贸网站建设便宜厦门网络科技有限公司
  • 黑龙江营商环境建设局网站绍兴以往网站招工做
  • 如何恢复网站首页的排名 站长成都旅游地图
  • 青海省建设厅网站刷网站seo排名软件
  • 有免费建网站wordpress 微信商城模板
  • 济南建站培训现在网站一般做多大的
  • 南京单位网站建设平台手机淘宝
  • 医院的网站关键词定位一般是什么上海 网站备案代理