Vue JSON Schema Form 自定义Widget

Vue JSON Schema Form:一个根据JSON Schema数据生成表单的插件。

项目技术栈是Vue3+ TS + ElementPlus,因此我选择它的合适的版本 @lljj/vue3-form-element

在这里插入图片描述

安装插件

npm install @lljj/vue3-form-element

在main.ts中全局注册

import { createApp } from 'vue'
import VueForm from '@lljj/vue3-form-element'
import App from './App.vue'

const app = createApp(App)
app.component('VueForm', VueForm)
app.mount('#app')

在开发中,发现VJSF的upload组件不符合需求,所以就需要自定义upload组件。

自定义Widget(upload-image)

自定义widget组件实现 v-model 来实现同步值到formData,ui:xxx 配置会以 props 的形式传递给自定义的widget。

<div :class="uploadUrl ? 'image' : ''">
   <div class="image-delete">
       <el-icon v-if="uploadUrl" class="closeIcon" @click="removeImage">
         <Close />
       </el-icon>
   </div>
   <el-image v-if="uploadUrl" :src="uploadUrl" fit="cover" :preview-src-list="[uploadUrl]" />
   <el-upload v-else action="#" accept="image/*" class="upload" :show-file-list="false" :before-upload="beforeUpload">
     <el-icon class="upload-icon">
       <Plus />
     </el-icon>
   </el-upload>
</div>
// 我把认为重要的方法贴出来,供大家参考
const emit = defineEmits(['update:modelValue']);
// -------图片上传之前的回调-------
const beforeUpload: UploadProps['beforeUpload'] = (rawFile) => {
  //要求:上传文件格式png|jpg|gif 4M
  if (rawFile.type.includes('image')) {
    if (rawFile.size / 1024 / 1024 < 4) {
      toUploadFile(rawFile);
    } else {
      ElMessage.error('上传文件大小小于4M')
      return false;
    }
  } else {
    ElMessage.error("上传文件格式务必为图片")
    return false;
  }
  return false; // 手动上传
}
//---------上传图片----------
const toUploadFile = (rawFile: File) => {
  const loadingInstance = ElLoading.service({
    lock: true,
    text: '上传中...',
    spinner: 'el-icon-loading',
    background: 'rgba(0, 0, 0, 0.7)'
  })
  const formData = new FormData();
  formData.append('file', rawFile);
  uploadFile(formData).then(res => {
    ElMessage.success('上传成功')
    uploadUrl.value = res.data.url;
    emit('update:modelValue', uploadUrl.value);
  }).catch(() => {
    ElMessage.error('上传失败')
  }).finally(() => {
    loadingInstance.close()
  })
}
// --------删除图片---------
const removeImage = () => {
  uploadUrl.value = '';
  emit('update:modelValue', uploadUrl.value);
}

当上传图片的url发生改变时,需要更新modelValue的值。这个很重要。

使用

<vue-form v-model="formData" :schema="schemaInfo" ></vue-form>
import uploadImage from '@/components/uploadImage.vue'
const schemaInfo = ref({
	type: object,
	properties:{
		"uploadImage": {
            "type": "string",
            "title": "图片",
            "ui:widget": uploadImage
          },
	}
})

最后,贴上Vue JSON Schema Form的官方文档,有需要可自行去查阅。

JSON Schema 是一种用于描述 JSON 数据结构的格式规范。Vue.js 是一个流行的 JavaScript 框架,用于构建用户界面。这两个技术可以结合起来,使用 JSON Schema 来验证和限制 Vue.js 组件的 props 数据。 在 Vue.js 中,可以使用 `props` 属性来定义组件接受的属性。如果使用 JSON Schema 来描述这些属性,可以确保这些属性的类型和值符合预期,并提供更好的错误信息。 可以使用一些 Vue.js 的插件来集成 JSON Schema 验证。例如,可以使用 `vue-json-schema` 插件,它提供了一个 `<json-schema-form>` 组件,可以根据 JSON Schema 自动生成表单,并进行验证。 下面是一个简单的例子,演示如何在 Vue.js 中使用 JSON Schema: ```vue <template> <div> <json-schema-form :schema="schema" :model="model" @submit="onSubmit" /> </div> </template> <script> import JsonSchemaForm from 'vue-json-schema' export default { components: { JsonSchemaForm }, data() { return { schema: { type: 'object', properties: { name: { type: 'string' }, age: { type: 'integer', minimum: 18 }, email: { type: 'string', format: 'email' } }, required: ['name', 'age', 'email'] }, model: { name: '', age: '', email: '' } } }, methods: { onSubmit(model) { // handle form submission } } } </script> ``` 在这个例子中,我们定义了一个 `schema` 对象来描述组件接受的 `props` 属性。然后,我们使用 `vue-json-schema` 插件提供的 `<json-schema-form>` 组件来根据 `schema` 自动生成表单。当表单提交时,我们可以在 `onSubmit` 方法中处理表单数据。 这只是一个简单的例子,实际上,使用 JSON SchemaVue.js 可以实现更复杂的数据验证和限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值