console
Vue.createApp({
setup() {
return {
model: {
text1: '',
num: 2
},
fields: [{
component: 'a-form',
props: { model: '$:model', labelCol: { span: 4 } },
children: [{
component: 'a-input',
value: 'model.text1',
formProps: {
label: 'input1',
name: 'text1',
rules: [{ required: true, trigger: 'blur' }]
}
}, {
component: 'a-input-number',
numberValue: 'model.num',
formProps: {
label: 'num',
name: 'num',
rules: [{
type: 'number', required: true, trigger: 'blur'
}, {
type: 'number', min: 5, trigger: 'blur'
}]
}
}]
}, {
component: 'p',
text: '$:JSON.stringify(model)'
}]
}
},
methods: {
onSetup({ prerender }) {
prerender(() => (field, next) => {
if (field.numberValue == undefined) {
next(field)
return
}
if (typeof field.numberValue !== 'string' || field.numberValue.length <= 0) {
next(field)
return
}
const valueDefine = {
$type: 'computed',
$result: field.numberValue,
}
const updateDefine = {
$type: 'method',
$context: field.numberValue,
$result: 'arguments[0]',
}
field.props = field.props || {}
field.props.value = valueDefine
field.props.onChange = updateDefine
next(field)
})
prerender(({ proxy, context }) => (field, next) => {
if (!field.formProps) {
next(field)
return
}
const formProps = field.formProps
delete field.formProps
next(proxy.inject(
{
component: 'a-form-item',
props: formProps,
children: [field]
},
context
))
}, 2)
}
}
})
.use(antd)
.use(JRenderFull)
.mount('#app')
<html>
<head>
<title>Json to render</title>
<script src="https://cdn.jsdelivr.net/npm/vue@next/dist/vue.global.prod.js">
</script>
<script src="https://cdn.jsdelivr.net/npm/ant-design-vue@next/dist/antd.min.js">
</script>
<script src="https://cdn.jsdelivr.net/npm/@json2render/vue-full">
</script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/ant-design-vue@next/dist/antd.min.css">
</head>
<body>
<div id="app">
<v-jrender v-model="model" :fields="fields" @setup="onSetup"></v-jrender>
</div>
</body>
</html>