1
1
import { inject , provide , Ref , ref , shallowRef , watch , isVue2 } from 'vue-demi'
2
2
import { GeneralField , isVoidField } from '@formily/core'
3
- import { FormPath } from '@formily/shared'
3
+ import { each , FormPath } from '@formily/shared'
4
4
import { observer } from '@formily/reactive-vue'
5
5
import { toJS , reaction } from '@formily/reactive'
6
6
import { SchemaOptionsSymbol , FieldSymbol , h , Fragment } from '../shared'
@@ -160,10 +160,28 @@ export default observer({
160
160
FormPath . getIn ( options ?. components , field . decoratorType as string ) ??
161
161
field . decoratorType
162
162
const componentAttrs = toJS ( field . decorator [ 1 ] ) || { }
163
+
164
+ const events : Record < string , any > = { }
165
+ each ( componentAttrs , ( value , eventKey ) => {
166
+ const onEvent = eventKey . startsWith ( 'on' )
167
+ const atEvent = eventKey . startsWith ( '@' )
168
+ if ( ! onEvent && ! atEvent ) return
169
+ if ( onEvent ) {
170
+ const eventName = `${ eventKey [ 2 ] . toLowerCase ( ) } ${ eventKey . slice ( 3 ) } `
171
+ // '@xxx' has higher priority
172
+ events [ eventName ] = events [ eventName ] || value
173
+ } else if ( atEvent ) {
174
+ const eventName = eventKey . slice ( 1 )
175
+ events [ eventName ] = value
176
+ delete componentAttrs [ eventKey ]
177
+ }
178
+ } )
179
+
163
180
const componentData = {
164
181
attrs : componentAttrs ,
165
182
style : componentAttrs ?. style ,
166
183
class : componentAttrs ?. class ,
184
+ on : events ,
167
185
}
168
186
delete componentData . attrs . style
169
187
delete componentData . attrs . class
@@ -186,20 +204,20 @@ export default observer({
186
204
const originFocus = originData [ '@focus' ] || originData [ 'onFocus' ]
187
205
const originBlur = originData [ '@blur' ] || originData [ 'onBlur' ]
188
206
189
- // '@xxx' has higher priority
190
- Object . keys ( originData )
191
- . filter ( ( key ) => key . startsWith ( 'on' ) )
192
- . forEach ( ( eventKey ) => {
207
+ each ( originData , ( value , eventKey ) => {
208
+ const onEvent = eventKey . startsWith ( 'on' )
209
+ const atEvent = eventKey . startsWith ( '@' )
210
+ if ( ! onEvent && ! atEvent ) return
211
+ if ( onEvent ) {
193
212
const eventName = `${ eventKey [ 2 ] . toLowerCase ( ) } ${ eventKey . slice ( 3 ) } `
194
- events [ eventName ] = originData [ eventKey ]
195
- } )
196
-
197
- Object . keys ( originData )
198
- . filter ( ( key ) => key . startsWith ( '@' ) )
199
- . forEach ( ( eventKey ) => {
200
- events [ eventKey . slice ( 1 ) ] = originData [ eventKey ]
213
+ // '@xxx' has higher priority
214
+ events [ eventName ] = events [ eventName ] || value
215
+ } else if ( atEvent ) {
216
+ const eventName = eventKey . slice ( 1 )
217
+ events [ eventName ] = value
201
218
delete originData [ eventKey ]
202
- } )
219
+ }
220
+ } )
203
221
204
222
events . change = ( ...args : any [ ] ) => {
205
223
if ( ! isVoidField ( field ) ) field . onInput ( ...args )
0 commit comments