1
1
import React , { useContext , Fragment } from 'react'
2
2
import { ISchema , Schema } from '@formily/json-schema'
3
- import { RecursionField } from '.'
3
+ import { RecursionField } from './RecursionField '
4
4
import { render } from '../shared/render'
5
5
import {
6
6
SchemaMarkupContext ,
@@ -78,25 +78,22 @@ export function createSchemaField<Components extends SchemaReactComponents>(
78
78
79
79
SchemaField . displayName = 'SchemaField'
80
80
81
- function MarkupField <
82
- Decorator extends ReactComponentPath < Components > ,
83
- Component extends ReactComponentPath < Components >
84
- > ( props : ISchemaMarkupFieldProps < Components , Component , Decorator > ) {
81
+ function MarkupRender ( props : any ) {
85
82
const parent = useContext ( SchemaMarkupContext )
86
83
if ( ! parent ) return < Fragment />
87
84
const renderChildren = ( ) => {
88
85
return < React . Fragment > { props . children } </ React . Fragment >
89
86
}
90
87
const appendArraySchema = ( schema : ISchema ) => {
91
- if ( parent . items ) {
92
- return parent . addProperty ( name , schema )
88
+ const items = parent . items as Schema
89
+ if ( items && items . name !== props . name ) {
90
+ return parent . addProperty ( props . name , schema )
93
91
} else {
94
- return parent . setItems ( props )
92
+ return parent . setItems ( schema )
95
93
}
96
94
}
97
- const name = props . name || getRandomName ( )
98
95
if ( parent . type === 'object' || parent . type === 'void' ) {
99
- const schema = parent . addProperty ( name , props )
96
+ const schema = parent . addProperty ( props . name , props )
100
97
return (
101
98
< SchemaMarkupContext . Provider value = { schema } >
102
99
{ renderChildren ( ) }
@@ -116,6 +113,13 @@ export function createSchemaField<Components extends SchemaReactComponents>(
116
113
}
117
114
}
118
115
116
+ function MarkupField <
117
+ Decorator extends ReactComponentPath < Components > ,
118
+ Component extends ReactComponentPath < Components >
119
+ > ( props : ISchemaMarkupFieldProps < Components , Component , Decorator > ) {
120
+ return < MarkupRender { ...props } name = { props . name || getRandomName ( ) } />
121
+ }
122
+
119
123
MarkupField . displayName = 'MarkupField'
120
124
121
125
function StringField <
0 commit comments