SOURCE

console 命令行工具 X clear

                    
>
console
Vue.createApp({
    setup() {
        return {
            datasource: {
                raw: {
                    type: 'rawdata',
                    data: {
                        options: [{
                            key: 0, label: 'select 1'
                        }, {
                            key: 1, label: 'select 2'
                        }]
                    }
                }
            },
            listeners: [
                {
                    watch: '$:model.selected',
                    actions: [{ handler: '@model.checks:[`select ${model.selected+1}`]' }],
                },
            ],
            model: { checks: [] },
            fields: [{
                component: 'el-form',
                rowProps: {
                    gutter: 20
                },
                props: {
                    labelWidth: '120px'
                },
                children: [{
                    component: 'el-input',
                    model: 'model.text',
                    colProps: { span: 24 },
                    formProps: { label: 'text1' }
                }, {
                    component: 'el-select',
                    model: 'model.selected',
                    colProps: { span: 12 },
                    formProps: { label: 'selected' },
                    children: '$:raw.options.map(item=>({component:"el-option", props:{label:item.label, value:item.key}}))'
                }, {
                    component: 'el-checkbox-group',
                    model: 'model.checks',
                    colProps: { span: 12 },
                    checkItems: '$:raw.options',
                    formProps: {
                        label: 'checks'
                    }
                }, {
                    component: 'el-slider',
                    model: 'model.num',
                    colProps: { span: 24 },
                    formProps: { label: 'change width' },
                    props: { min: 6, max: 24 }
                }, {
                    component: 'el-input',
                    model: 'model.text',
                    colProps: { span: '$:model.num' },
                    formProps: { label: 'width' },
                }]
            }, {
                component: 'p',
                text: '$:JSON.stringify(model)'
            }]
        }
    },
    methods: {
        onSetup({ prerender, datasource }) {
            // 在组件外部套一个 el-form-item
            prerender(({ proxy, context }) => (field, next) => {
                if (!field.formProps) {
                    next(field)
                    return
                }

                const formProps = field.formProps

                delete field.formProps

                next(proxy.inject(
                    {
                        component: 'el-form-item',
                        props: formProps,
                        children: [field]
                    },
                    context
                ))
            }, 2)

            // 在组件内部套一个 el-row
            prerender(() => (field, next) => {
                if (!field.rowProps) {
                    next(field)
                    return
                }

                const rowProps = field.rowProps

                delete field.rowProps

                field.children = [{
                    component: 'el-row',
                    props: rowProps,
                    children: field.children
                }]

                next(field)
            })

            // 在组件外部套一个 el-col
            prerender(({ proxy, context }) => (field, next) => {
                if (!field.colProps) {
                    next(field)
                    return
                }

                const colProps = field.colProps

                delete field.colProps

                next(proxy.inject(
                    {
                        component: 'el-col',
                        props: colProps,
                        children: [field]
                    },
                    context
                ))
            }, 1)

            // checkbox group items
            prerender(() => (field, next) => {
                if (!field.checkItems) {
                    next(field)
                    return
                }

                field.children = field.checkItems.map(item => ({
                    component: 'el-checkbox',
                    props: { label: item.label }
                }))

                delete field.checkItems

                next(field)
            })

            datasource('rawdata', (props) => {
                return props.data
            })
        }
    }
})
    .use(ElementPlus)
    .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/element-plus/lib/index.full.js">
	</script>
	<script src="https://cdn.jsdelivr.net/npm/@json2render/vue-full">
	</script>
	<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-plus/lib/theme-chalk/index.css">
</head>

<body>
	<div id="app">
		<v-jrender v-model="model" :fields="fields" :datasource="datasource" :listeners="listeners" @setup="onSetup"></v-jrender>
	</div>
</body>

</html>