Top Related Projects
:fire::fire::fire: 强大的低代码动态表单组件,通过JSON数据驱动表单渲染,适配移动端,支持可视化设计。提高开发者对表单的开发效率。目前在政务系统、OA系统、ERP系统、电商系统、流程管理等系统中已稳定应用。
:sparkles:Element UI表单设计及代码生成器
A powerful form designer for Vue.
A visual form designer/generator base on Vue.js, make form development simple and efficient.(基于Vue的可视化表单设计器,让表单开发简单而高效。)
前端低代码框架,通过 JSON 配置就能生成各种页面。
Quick Overview
F-render is a dynamic form rendering engine for Vue.js applications. It allows developers to create complex forms using JSON configurations, providing a flexible and efficient way to build form interfaces without writing extensive HTML and JavaScript code.
Pros
- Simplifies form creation with JSON-based configurations
- Highly customizable with support for various form elements and layouts
- Integrates well with Vue.js ecosystem and other UI libraries
- Reduces development time for complex form implementations
Cons
- Learning curve for understanding the JSON configuration structure
- May be overkill for simple form requirements
- Limited documentation in English, which could be a barrier for non-Chinese speakers
- Dependency on Vue.js limits its use in other frameworks or vanilla JavaScript projects
Code Examples
- Basic form configuration:
const formConfig = {
formItems: [
{ type: 'input', field: 'name', label: 'Name' },
{ type: 'select', field: 'gender', label: 'Gender', options: [
{ label: 'Male', value: 'male' },
{ label: 'Female', value: 'female' }
]}
]
};
- Using custom components:
const formConfig = {
formItems: [
{ type: 'custom-date-picker', field: 'birthdate', label: 'Birth Date' }
],
components: {
'custom-date-picker': CustomDatePicker
}
};
- Form validation:
const formConfig = {
formItems: [
{
type: 'input',
field: 'email',
label: 'Email',
rules: [
{ required: true, message: 'Email is required' },
{ type: 'email', message: 'Invalid email format' }
]
}
]
};
Getting Started
- Install f-render:
npm install @dream2023/f-render
- Import and use in a Vue component:
<template>
<f-render :formConfig="formConfig" @submit="handleSubmit" />
</template>
<script>
import FRender from '@dream2023/f-render';
export default {
components: { FRender },
data() {
return {
formConfig: {
formItems: [
{ type: 'input', field: 'username', label: 'Username' },
{ type: 'password', field: 'password', label: 'Password' }
]
}
};
},
methods: {
handleSubmit(formData) {
console.log('Form submitted:', formData);
}
}
};
</script>
Competitor Comparisons
:fire::fire::fire: 强大的低代码动态表单组件,通过JSON数据驱动表单渲染,适配移动端,支持可视化设计。提高开发者对表单的开发效率。目前在政务系统、OA系统、ERP系统、电商系统、流程管理等系统中已稳定应用。
Pros of form-create
- More comprehensive documentation and examples
- Supports multiple UI frameworks (Element UI, iView, Ant Design Vue)
- Larger community and more frequent updates
Cons of form-create
- Steeper learning curve due to more complex API
- Heavier bundle size, which may impact performance for smaller projects
- Less focus on visual form building, primarily code-based configuration
Code Comparison
f-render:
const schema = {
type: 'object',
properties: {
name: { type: 'string', title: 'Name' },
age: { type: 'number', title: 'Age' }
}
};
form-create:
$formCreate([
{ type: 'input', field: 'name', title: 'Name' },
{ type: 'number', field: 'age', title: 'Age' }
]);
Both libraries aim to simplify form creation in Vue applications, but they take different approaches. f-render focuses on JSON schema-based form generation with a visual builder, while form-create offers a more programmatic approach with support for multiple UI frameworks. The choice between them depends on project requirements, preferred development style, and desired level of customization.
:sparkles:Element UI表单设计及代码生成器
Pros of form-generator
- More comprehensive documentation and examples
- Supports a wider range of form components and layouts
- Includes a visual form designer for easier configuration
Cons of form-generator
- Larger bundle size and potentially higher resource usage
- Less frequent updates and maintenance compared to f-render
- Steeper learning curve for advanced customizations
Code Comparison
f-render:
import FRender from 'f-render'
const schema = {
type: 'object',
properties: {
name: { type: 'string', title: 'Name' }
}
}
<FRender schema={schema} />
form-generator:
import FormGenerator from 'form-generator'
const formJson = {
fields: [
{ type: 'input', label: 'Name', model: 'name' }
]
}
<FormGenerator :data="formJson" />
Both projects aim to simplify form creation in Vue applications, but they differ in their approach and feature set. f-render focuses on a more lightweight and flexible solution, while form-generator offers a more comprehensive toolkit with additional visual design capabilities. The choice between the two depends on the specific requirements of your project and the level of customization needed.
A powerful form designer for Vue.
Pros of variant-form
- More comprehensive documentation and examples
- Supports a wider range of form components and layouts
- Includes a visual form designer for easier form creation
Cons of variant-form
- Larger bundle size due to additional features
- Steeper learning curve for beginners
- Less frequent updates and maintenance
Code Comparison
f-render:
import FRender from 'f-render'
const schema = {
type: 'object',
properties: {
name: { type: 'string', title: 'Name' }
}
}
<FRender schema={schema} />
variant-form:
import { VariantForm } from 'vform-builds'
const formConfig = {
formItems: [
{ type: 'input', field: 'name', label: 'Name' }
]
}
<VariantForm :form-config="formConfig" />
Both libraries aim to simplify form creation in Vue applications, but they differ in approach and feature set. f-render focuses on a more lightweight and schema-driven approach, while variant-form offers a more feature-rich experience with visual design capabilities. The choice between them depends on project requirements, complexity, and developer preferences.
A visual form designer/generator base on Vue.js, make form development simple and efficient.(基于Vue的可视化表单设计器,让表单 开发简单而高效。)
Pros of vue-form-making
- More comprehensive documentation and examples
- Includes a visual form designer interface
- Supports more advanced form layouts and styling options
Cons of vue-form-making
- Less frequently updated compared to f-render
- Larger bundle size due to additional features
- Steeper learning curve for beginners
Code Comparison
f-render:
import FRender from 'f-render'
<f-render :schema="schema" v-model="formData" />
vue-form-making:
import FormMaking from 'vue-form-making'
<fm-generate-form :data="jsonData" :remote="remoteFuncs" ref="generateForm">
</fm-generate-form>
Both libraries offer declarative form rendering, but vue-form-making provides a more feature-rich API with additional options for customization and remote data fetching. f-render focuses on simplicity and ease of use, making it potentially more suitable for smaller projects or developers new to form generation libraries.
The choice between these two libraries depends on the specific requirements of your project, such as the complexity of forms needed, the desired level of customization, and the importance of having a visual form designer.
前端低代码框架,通过 JSON 配置就能生成各种页面。
Pros of amis
- More comprehensive and feature-rich, offering a complete low-code development platform
- Larger community and better documentation, being backed by Baidu
- Supports a wider range of UI components and layout options
Cons of amis
- Steeper learning curve due to its extensive feature set
- Potentially overkill for simpler form-building tasks
- Less focused on form rendering specifically, as it's a more general-purpose tool
Code Comparison
f-render:
import FRender from 'f-render';
const schema = {
type: 'object',
properties: {
name: { type: 'string', title: 'Name' }
}
};
<FRender schema={schema} />
amis:
import { render as amisRender } from 'amis';
const schema = {
type: 'page',
body: {
type: 'form',
controls: [
{ type: 'text', name: 'name', label: 'Name' }
]
}
};
amisRender(schema, document.body);
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
f-render | åºäº ElementUI ç表å设计å¨
- 交æµç¾¤
- ä»ç»
- 注æ
- ç¹æ§
- Demo
- æç¨
- 1 åéå¿«éæ¥å ¥
- ç¨æ·æ¨¡å¼
- å®å¶å
- äºæ¬¡å¼å
- f-render é®çéé¦
- Props 说æ
- æ槽
- çæ
- ç¹å«æè°¢èµå©è
- Contributors â¨
ä»ç»
f-render æ¯åºäº vue-ele-form å¼åçå¯è§å表åè®¾è®¡å·¥å ·, éç¨äº åç§æµç¨å¼æåå¨æ表å项ç®ï¼å¤§å¤§èçä½ çå¼åæ¶é´ï¼
注æ
注æï¼æ¤è®¾è®¡å¨ä¸æ¯ç¬ç«åå¨çï¼æ¯ä¾æäº vue-ele-formï¼å¨ä½¿ç¨å请å¡å¿ é 读 vue-ele-form çææ¡£ã
ç¹æ§
- ç»ä»¶æ¹å¼ï¼ä»¥ç»ä»¶æ¹å¼æ¥å ¥ï¼1 åéè½»æ¾æ¥å ¥ï¼
- ä½ç§¯å°ï¼Gzip å缩å
100k
å·¦å³ï¼ - ææ©å±ï¼å¯ä»¥å¨
ä¸æ´æ¹æºç
çæ åµä¸å¢å æ¹å±æ§ãç»ä»¶ï¼
Demo
https://dream2023.gitee.io/f-render/
æç¨
è½ç¶ f-render å¯ä»¥åå°å¨ä¸æ´æ¹æºç çæ åµä¸å®ç°å¤§éçå®å¶åï¼ä½æ¯ä¾ç¶æä¸å°äººå¸æè½å¤æ ¹æ®å ¬å¸çéæ±è¿è¡äºæ¬¡å¼åã
æ以ææ¨åºäºä¸ä¸ªä» 0 å®ç°æ´ä¸ªé¡¹ç®ç æç¨ï¼å¦ææå ´è¶£ f-render çå®ç°è¿ç¨åæèï¼å¯ä»¥ç¹å» ä» 0 å®ç°å¯è§å表åç»ä»¶ è¿è¡å¦ä¹ ã
1 åéå¿«éæ¥å ¥
第 1 æ¥ï¼å®è£
yarn add element-ui # npm install element-ui -S
yarn add vue-ele-form # npm install vue-ele-form -S
yarn add f-render # npm install f-render -S
第 2 æ¥ï¼æ³¨å
// vue-ele-form ç注åå¯åèï¼https://www.yuque.com/chaojie-vjiel/vbwzgu/xl46cd
import EleForm from "vue-ele-form";
import FRender from "f-render";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
Vue.use(ElementUI);
Vue.use(EleForm);
Vue.component("f-render", FRender);
第 3 æ¥ï¼ä½¿ç¨
<template>
<f-render
@save="handleSave"
:loading="loading"
height="calc(100vh - 60px)"
:config="formConfig"
/>
</template>
<script>
export default {
data() {
return {
loading: false,
formConfig: {}
};
},
methods: {
handleSave(res) {
// è¿éæ¯ä¿åå° localStorageï¼ä½ å¯ä»¥ä¿åå°æå¡å¨
localStorage.setItem("form-config", res);
this.$message.success("ä¿åæåå¦~");
}
},
mounted() {
// 模æå¼æ¥å è½½
this.loading = true;
setTimeout(() => {
this.loading = false;
this.formConfig = localStorage.getItem("form-config") || "";
}, 1000);
}
};
</script>
ç¨æ·æ¨¡å¼
æ们æå¨æ表åå为两个é¶æ®µï¼
- é¦å æ¯è®¾è®¡é¶æ®µï¼éè¿ææ½è®¾è®¡è¡¨åï¼
- ç¶åæ¯ç¨æ·é¶æ®µï¼å°è®¾è®¡å¥½ç表å以纯表åçå½¢å¼è®©ç¨æ·å¡«åã
æ们å«å称è¿ä¸¤ä¸ªé¶æ®µç表å为设计模å¼åç¨æ·æ¨¡å¼ã设计模å¼ç表åé ç½®æ们已ç»è®²äºï¼ä¸é¢çç¨æ·æ¨¡å¼ä¸ç表åé ç½®ï¼
åºäº f-render çé ç½®
éè¿å±æ§ pure
, å¯ä»¥ç´æ¥å为表å使ç¨ï¼å
¶æ°æ®æ交æ¹å¼å vue-ele-form
ä¸æ ·ï¼å
·ä½å¯æ¥çææ¡£ã
<template>
<f-render
v-model="formData"
:request-fn="handleSubmit"
@request-success="handleSuccess"
:config="formConfig"
pure
/>
</template>
<script>
export default {
data() {
return {
formData: {},
formConfig: ""
};
},
methods: {
handleSubmit(data) {
// eslint-disable-next-line no-console
console.log(data);
return Promise.resolve();
},
handleSuccess() {
this.$message.success("å建æå");
}
},
mounted() {
// 模æå¼æ¥å è½½
this.loading = true;
setTimeout(() => {
this.loading = false;
this.formConfig = localStorage.getItem("form-config") || "";
}, 1000);
}
};
</script>
åºäº vue-ele-form çé ç½®
å¦æä½ çå¯è§å设计å表å使ç¨ï¼ä¸åä¸ä¸ªç³»ç»ï¼å¯ä»¥ç´æ¥ä½¿ç¨ vue-ele-form
ï¼ä¸å¿
å®è£
f-render
ï¼å
·ä½å¦ä¸ï¼
<template>
<ele-form
v-model="formData"
:request-fn="handleSubmit"
@request-success="handleSuccess"
v-if="formConfig"
v-bind="formConfig"
/>
</template>
<script>
export default {
data() {
return {
formData: {},
formConfig: null
};
},
methods: {
handleSubmit(data) {
// eslint-disable-next-line no-console
console.log(data);
return Promise.resolve();
},
handleSuccess() {
this.$message.success("å建æå");
}
},
mounted() {
// 模æå¼æ¥å è½½
setTimeout(() => {
try {
// è¿éå¿
须对å符串è¿è¡ååºåå
this.formConfig = eval(`(${localStorage.getItem("form-config")})`);
} catch {
this.$message.error("æ°æ®è§£æ失败");
}
}, 1000);
}
};
</script>
å®å¶å
æ°å¢å®æ¹æ©å±ç»ä»¶ï¼ä»¥å¯ææ¬æ©å±ä¸ºä¾ï¼
å®è£ ç»ä»¶
yarn add vue-ele-form-quill-editor
注åç»ä»¶
Vue.component("quill-editor", EleFormQuillEditor);
é ç½®å±æ§
<template>
<!-- çç¥å
¶å®å±æ§ -->
<f-render :comps="comps" />
</template>
<script>
// é»è®¤é
ç½®
import comps from "f-render/src/fixtures/comps";
// å¯ææ¬é
ç½®
import quillEditor from "f-render/src/fixtures/extends/quill-editor";
// å¯ä»¥æ´æ¹æ¾ç¤ºç»ä»¶ä½ç½®ï¼é»è®¤ä¸º 10
// è¿éæ´æ¹ä¸º 2ï¼æ¾ç¤ºæ´é å
quillEditor.sort = 2;
export default {
data() {
return {
// æ¼æ¥ä¸å³å¯
comps: comps.concat(quillEditor)
};
}
};
</script>
æ°å¢èªå®ä¹ç»ä»¶
å建ç»ä»¶å¹¶å ¨å±æ³¨å
éè¦æ ¹æ® vue-ele-form ææ¡£å建èªå®ä¹ç»ä»¶ï¼å¹¶æ³¨åã
书åé ç½®
ä½ å¯ä»¥åèæºç ä¸çé ç½®ï¼ä¸ä¸æ¯èä¾åå±æ§è¯´æï¼
// custom-url.js
export default {
// åå¦è¿ä¸ªç»ä»¶å« urlï¼å¿
å¡«ï¼
type: "custom-url",
// é»è®¤æ ç¾åï¼å¿
å¡«ï¼
label: "URL",
// ç¨äºæåºï¼å¼è¶å°ï¼è¶é å
sort: 1,
// å±æ§é
ç½®
config: {
// å±æ§é
置说æå°åï¼å¯çç¥ï¼
url: "https://www.xxx.com",
// ç»ä»¶å±æ§é
ç½®ï¼ä¸ç¥éå¥æ¯ç»ä»¶å±æ§ï¼å¯ä»¥çä¸ä¸çé¢å³ä¾§ï¼
attrs: {
// config é
ç½® åè FormDesc:
// https://www.yuque.com/chaojie-vjiel/vbwzgu/iw5dzf#KOPkD
config: {
// max 为å±æ§å
max: {
type: "number",
label: "æ大è¾å
¥é¿åº¦"
},
name: {
type: "input",
label: "åç name",
// å¿
å¡«
required: true
}
// ....
},
// é»è®¤å¼ï¼å¦æå¨é
ç½®æ件é设置äºï¼åæ¯ä¸ªç»ä»¶é½ä¼æºå¸¦
data: {
name: "url"
}
},
// 表å项é
ç½®ï¼æ¯ FormDesc ä¸é attrs çå
¶å®é
ç½®ï¼
// å
·ä½å¯çï¼https://www.yuque.com/chaojie-vjiel/vbwzgu/iw5dzf#hl4pm
common: {
config: {
// é»è®¤å¼
default: {
type: "input",
label: "é»è®¤å¼"
}
},
data: {}
}
}
};
å并é ç½®å¹¶ä¼ å ¥
<template>
<!-- çç¥å
¶å®å±æ§ -->
<f-render :comps="comps" />
</template>
<script>
import comps from "f-render/src/fixtures/comps";
import customUrl from "some/path/custom-url";
export default {
data() {
return {
comps: comps.concat(customUrl)
};
}
};
</script>
å®å¶ååç»ä»¶é ç½® & 表åé ç½®
- ç»ä»¶é
ç½®ç®å½ï¼
f-render/src/fixtures/comps.js
- 表åé
ç½®ç®å½ï¼
f-render/src/fixtures/form-props.js
- 表å项éç¨å±æ§é
ç½®ï¼
f-render/src/fixtures/form-item-common.js
- æ©å±ç»ä»¶ç®å½ï¼
f-render/src/fixtures/extends/[æ©å±ç»ä»¶å].js
å¦æä½ æ³ä¿®æ¹ç»ä»¶å±æ§æè
表åçå±æ§ï¼åå°æè
å¢å ç»ä»¶ï¼å¯ä»¥å°ä¸è¿°æ件æ·è´å°èªå·±ç项ç®
ç®å½ï¼åèä¸è¿°é
置说æï¼è¿è¡æ´æ¹ï¼å¹¶ä¼ å
¥å³å¯ï¼
<!-- formProps æ¯è¡¨åå±æ§ -->
<!-- comps æ¯ç»ä»¶å表åå±æ§ -->
<!-- formItemCommon æ¯è¡¨å项éç¨å±æ§é
ç½® -->
<f-render
:form-props="formProps"
:comps="comps"
:form-item-common="formItemCommon"
/>
å
·ä½èè¨ï¼å¦ææ³è®©æ¯ä¸ª input
ç»ä»¶é½æºå¸¦ clearable: true
çå±æ§ï¼æ们å¯ä»¥è¿æ ·æä½ï¼
<template>
<!-- å
¶å®å±æ§çç¥ -->
<!-- å°æ´æ¹åç comps ä¼ éè¿å»å³å¯ -->
<f-render :comps="comps" />
</template>
<script>
import comps from "f-render/src/fixtures/comps";
// æ¥æ¾ input ç»ä»¶ï¼å½ç¶ä½ ä¹å¯ä»¥çæºç ï¼ç´æ¥æ¥çç´¢å¼
const inputIndex = comps.findIndex(item => item.type === "input");
// æ´æ¹ config.attrs.data å¼å³å¯
comps[inputIndex].config.attrs.data = { clearable: true };
export default {
data() {
return {
comps
};
}
};
</script>
å®å¶åå³ä¾§ Tabs
æ们å¯ä»¥éè¿ isShowRight
å±æ§æ¥æ§å¶å³ä¾§é¢æ¿æ¯å¦æ¾ç¤ºï¼éè¿ rightTabs
æ¥å®å¶å
·ä½æ¾ç¤ºçé¢æ¿å称ï¼å
·ä½å¦ä¸ï¼
<template>
<!-- å®å¶åå³ä¾§ tabs -->
<f-render :right-tabs="tabs" />
</template>
<script>
export default {
data() {
return {
tabs: [
{ label: "表å项å±æ§é
ç½®", name: "form-item-common" },
{ label: "ç»ä»¶å±æ§é
ç½®", name: "form-item-attrs" }
// 注éä¸é¢çå
容ï¼å°±å¯ä»¥ä¸æ¾ç¤º
// { label: "表åé
ç½®", name: "form-props" }
]
};
}
};
</script>
æ ·å¼å®å¶å
ç´æ¥è¿è¡æ ·å¼è¦çå³å¯ï¼æ³¨æä¸è¦å scoped
ï¼å¦åè¦çä¸æå
äºæ¬¡å¼å
å¦æä»
éè¿å±æ§
åæ ·å¼
å®å¶åå·²æ æ³æ»¡è¶³çä½ åä½ äº§åç»ççè¦æ±ï¼é£å°±éè¦è¿è¡å®å¶åå¼åï¼æ个人è§å¾ä»£ç æ´ä½è¿æ¯é常ç®åçï¼ä½ å¯ä»¥ clone
代ç æè
ä¸è½½åï¼å»ºè®®ç¨giteeï¼ï¼è¿è¡ç¸åºçæ´æ¹ï¼æ´æ¹åæ两ç§å¤çæ¹å¼:
- ç´æ¥æ¾å°é¡¹ç®ç®å½éï¼å¹¶å°å®è£
dependencies
çä¾èµå¤å¶å°é¡¹ç®ï¼è¿è¡å¼åå³å¯ï¼ - ç´æ¥å¼åï¼ç¶ååå¸å°å ¬å¸ç§æï¼å¦ææ¯å¼æºï¼åå¯ä»¥åå° GitHub æè giteeï¼ç¶åå®è£ èªå·±çå³å¯
å ·ä½çç»èï¼å¼å¤´æçæç¨éä¼æ详ç»çè¿ç¨ï¼å¸æ大家å¯ä»¥æ¯æä¸ä¸ã
f-render é®çéé¦
Props 说æ
props: {
// 表åå
容
config: {
type: [Object, String],
required: true
},
// 设计å¨æ´ä½é«åº¦
height: {
type: [String, Number],
default: "400px"
},
// ä¿åæ ¼å¼
saveFormat: {
type: String,
default: "string",
validator(val) {
return ["object", "string"].includes(val);
}
},
// æ¯å¦çº¯åï¼ç¨äºæ¾ç¤ºè¡¨åï¼
pure: Boolean,
// 表åé
ç½®
formProps: {
type: Object,
default: () => formProps
},
// 表å项é
ç½®
formItemCommon: {
type: Object,
default: () => formItemCommonDefault
},
// ç»ä»¶å表
comps: {
type: Array,
default: () => comps
},
// æä½é
ç½®
operations: {
type: Array,
default: () => ["preview", "data", "code", "batch", "clear", "save"]
},
// æ¯å¦æ¾ç¤ºå³ä¾§
isShowRight: {
type: Boolean,
default: true
},
// å³ä¾§å±æ§é¢æ¿ Tabs
rightTabs: {
type: Array,
default: () => [
{ label: "表å项å±æ§é
ç½®", name: "form-item-common" },
{ label: "ç»ä»¶å±æ§é
ç½®", name: "form-item-attrs" },
{ label: "表åé
ç½®", name: "form-props" }
]
},
// æ¯å¦å¨å è½½
loading: Boolean,
// 表åç¸å
³ï¼pure 为 true æ¶ï¼, å vue-ele-form
// https://www.yuque.com/chaojie-vjiel/vbwzgu/dyw8a7
requestFn: Function,
isLoading: Boolean,
formError: Object,
// ....
},
æ槽
- leftï¼å·¦ä¾§ç»ä»¶å表
- main: ä¸é´åºå
- main-header: 头é¨æä½åº
- main-content: 表å设计åº
- right: å³ä¾§å±æ§é ç½®åº
举ä¾ï¼
<template>
<f-render>
<!-- 左侧æ槽 -->
<template v-slot:left="{frender}">
<div>
<div>left</div>
<div>{{frender.comps}}</div>
</div>
</template>
</f-render>
<template></template
></template>
å
¶ä¸ frender
æ°æ®æ¯ f-render
ç»ä»¶æ°æ®çéåï¼å
·ä½é½æåªäºæ°æ®ï¼å¯ä»¥åèæºç ï¼å
¶å®æ槽åææ¤åæ°ã
çæ
Project | Status | Description |
---|---|---|
vue-ele-form | æ¥åºäº ElementUI çæ°æ®é©±å¨è¡¨å | |
f-render | ä¸ä¸º vue-ele-form å¼åçå¯è§å表åè®¾è®¡å·¥å · | |
vue-ele-form-json-editor | JSON ç¼è¾å¨(vue-ele-form æ©å±) | |
vue-ele-form-upload-file | upload æ件ä¸ä¼ ç»ä»¶(vue-ele-form æ©å±) | |
vue-ele-form-image-uploader | ä¸ä¼ å¾çå¢å¼ºç»ä»¶(vue-ele-form æ©å±) | |
vue-ele-form-tree-select | æ å½¢éæ©æ¡ç»ä»¶(vue-ele-form æ©å±) | |
vue-ele-form-table-editor | è¡¨æ ¼ç¼è¾å¨(vue-ele-form æ©å±) | |
vue-ele-form-dynamic | å¨æ表å(vue-ele-form æ©å±) | |
vue-ele-form-video-uploader | ä¸ä¼ è§é¢å¢å¼ºç»ä»¶(vue-ele-form æ©å±) | |
vue-ele-form-quill-editor | å¯ææ¬ç¼è¾å¨(vue-ele-form æ©å±) | |
vue-ele-form-markdown-editor | markdown ç¼è¾å¨(vue-ele-form æ©å±) | |
vue-ele-form-bmap | ç¾åº¦å°å¾ç»ä»¶(vue-ele-form æ©å±) | |
vue-ele-form-codemirror | 代ç ç¼è¾å¨(vue-ele-form-gallery æ©å±) | |
vue-ele-form-gallery | å¾ç/è§é¢å±ç¤ºç»ä»¶(vue-ele-form æ©å±) | |
vue-ele-form-data-editor | è½»é级æ°æ®ç¼è¾å¨(vue-ele-form æ©å±) |
ç¹å«æè°¢èµå©è
ä¼å®¢æ
|
å£æ·è¿å
|
damonnie
|
xzusoft
|
seeenter
|
é«äº¢
|
å¦ææ¨è§å¾å¯¹æ¨ææ帮å©, å¯ä»¥è¯·ä½è åä¸æ¯åå¡, 让å¼æºèµ°çæ´è¿, ç¹å»è¿å ¥ç äºèµèµä¸ä¸, 并å å ¥ä¸é¢äº¤æµç¾¤, å°é¾æ¥åéç»æ
Contributors â¨
Thanks goes to these wonderful people (emoji key):
å¼ è¶ æ° ð ð» ð¤ |
Wisen ð» |
IWANABETHATGUY ð» |
This project follows the all-contributors specification. Contributions of any kind welcome!
Top Related Projects
:fire::fire::fire: 强大的低代码动态表单组件,通过JSON数据驱动表单渲染,适配移动端,支持可视化设计。提高开发者对表单的开发效率。目前在政务系统、OA系统、ERP系统、电商系统、流程管理等系统中已稳定应用。
:sparkles:Element UI表单设计及代码生成器
A powerful form designer for Vue.
A visual form designer/generator base on Vue.js, make form development simple and efficient.(基于Vue的可视化表单设计器,让表单开发简单而高效。)
前端低代码框架,通过 JSON 配置就能生成各种页面。
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot