Vue3动态表单实现

实现方法:通过<component />标签动实现动态表单渲染

component标签:

在vue中 component 标签用于动态组件标签的渲染。它允许在同一个挂载点上条件渲染不同的组件,通过is属性可以渲染指定的属性

在上面的例子中,通过调用函数applyCom实现在页面上渲染Com2组件

动态表单渲染(Vue3 + ElementPlus)

* 文件列表

* widgets/index.js

在index.js中导入所有的表单元素组件

复制代码
export { default as WidgetInput } from "./input.vue";

export { default as WidgetTextarea } from "./textarea.vue";

export { default as WidgetSelect } from "./select.vue";

export { default as WidgetRadio } from "./radio.vue";

export { default as WidgetUpdate } from "./upload.vue";

* widgets/input.vue

复制代码
<template>
  <div>
    <el-input v-model="model" style="width: 240px" v-bind="$attrs"  />
  </div>
</template>

<script setup>
import { ref } from "vue";

const props = defineProps({
    modelValue:{
        type:Number
    }
})

const emits = defineEmits(['update:modelValue']);

const model = useVModel(props,'modelValue',emits);
</script>
  1. 通过v-model确保数据的单向流

  2. $attrs: 当想要将所有未声明的属性都是用在组件上可以使用,那么这里就会将component组件上的绑定的v-bind的数据全部应用到input这个组件之上。

* form.vue

复制代码
<template>
  <ElForm ref="formRef" labelPosition="top" @submit.prevent>
    <ElFormItem v-for="(item, index) in arr" :key="index">
      <component
        :is="getWidgetByName(item.name)"
        v-model="item.value"
        v-bind="item.apply"
      />
    </ElFormItem>
  </ElForm>
</template>
<script setup>
import * as widgets from "./widgets";

let arr = [
  {
    name: "WidgetInput",
    value: 1,
    apply: {
      placeholder: "请输入数字",
    },
  },
  {
    name: "WidgetInput",
    value: 2,
    apply: {
      placeholder: "请输入数字",
    },
  },

  {
    name: "WidgetSelect",
    value: 3,
    apply: {
      placeholder: "请输入数字",
    },
  },
];
const getWidgetByName = (name) => {
  return widgets[name];
};
</script>
相关推荐
会跑的葫芦怪27 分钟前
若依Vue 项目多子路径配置
前端·javascript·vue.js
xiaoqi9221 小时前
React Native鸿蒙跨平台如何进行狗狗领养中心,实现基于唯一标识的事件透传方式是移动端列表开发的通用规范
javascript·react native·react.js·ecmascript·harmonyos
jin1233222 小时前
React Native鸿蒙跨平台剧本杀组队消息与快捷入口组件,包含消息列表展示、快捷入口管理、快捷操作触发和消息详情预览四大核心功能
javascript·react native·react.js·ecmascript·harmonyos
烬头88213 小时前
React Native鸿蒙跨平台实现二维码联系人APP(QRCodeContactApp)
javascript·react native·react.js·ecmascript·harmonyos
pas1363 小时前
40-mini-vue 实现三种联合类型
前端·javascript·vue.js
摇滚侠3 小时前
2 小时快速入门 ES6 基础视频教程
前端·ecmascript·es6
2601_949833394 小时前
flutter_for_openharmony口腔护理app实战+预约管理实现
android·javascript·flutter
珑墨4 小时前
【Turbo】使用介绍
前端
军军君015 小时前
Three.js基础功能学习十三:太阳系实例上
前端·javascript·vue.js·学习·3d·前端框架·three
xiaoqi9225 小时前
React Native鸿蒙跨平台如何实现分类页面组件通过searchQuery状态变量管理搜索输入,实现了分类的实时过滤功能
javascript·react native·react.js·ecmascript·harmonyos