@@ -4121,6 +4121,55 @@ function updateComponentData (
4121
4121
warn ( ( "Failed to update component data (" + componentId + ")." ) ) ;
4122
4122
}
4123
4123
4124
+ function updateVirtualRef ( vm , refsMap , isRemoval ) {
4125
+ if ( ! isObject ( refsMap ) ) { return }
4126
+
4127
+ if ( isRemoval ) {
4128
+ vm . $refs = { } ;
4129
+ } else {
4130
+ var vmRef = vm . $refs || { } ;
4131
+ Object . keys ( refsMap ) . forEach ( function ( key ) {
4132
+ var refs = refsMap [ key ] ;
4133
+ vmRef [ key ] = refs . length === 1 ? refs [ 0 ] : refs ;
4134
+ } ) ;
4135
+ vm . $refs = vmRef ;
4136
+ }
4137
+ }
4138
+
4139
+ function registerListRef ( vm , position , refsMap , isRemoval ) {
4140
+ if ( ! isObject ( refsMap ) ) { return }
4141
+
4142
+ var vmRef = vm . $refs || { } ;
4143
+ if ( isRemoval ) {
4144
+ Object . keys ( refsMap ) . forEach ( function ( key ) {
4145
+ var refs = refsMap [ key ] ;
4146
+
4147
+ if ( vmRef [ key ] ) {
4148
+ if ( refs . length === 1 && Array . isArray ( vmRef [ key ] ) ) {
4149
+ delete vmRef [ key ] [ position ] ;
4150
+ } else {
4151
+ delete vmRef [ key ] ;
4152
+ }
4153
+ }
4154
+ } ) ;
4155
+ } else {
4156
+ Object . keys ( refsMap ) . forEach ( function ( key ) {
4157
+ var refs = refsMap [ key ] ;
4158
+
4159
+ if ( refs . length === 1 ) {
4160
+ if ( ! Array . isArray ( vmRef [ key ] ) ) {
4161
+ vmRef [ key ] = [ ] ;
4162
+ }
4163
+ // $flow-disable-line
4164
+ vmRef [ key ] [ position ] = refs [ 0 ] ;
4165
+ } else {
4166
+ vmRef [ key ] = refs ;
4167
+ }
4168
+ } ) ;
4169
+ vm . $refs = vmRef ;
4170
+ }
4171
+ }
4172
+
4124
4173
/* */
4125
4174
4126
4175
// https://github.com/Hanks10100/weex-native-directive/tree/master/component
@@ -4188,22 +4237,27 @@ function initVirtualComponent (options) {
4188
4237
initProvide ( vm ) ; // resolve provide after data/props
4189
4238
callHook ( vm , 'created' ) ;
4190
4239
4191
- registerComponentHook ( componentId , 'lifecycle' , 'attach' , function ( ) {
4192
- callHook ( vm , 'beforeMount' ) ;
4240
+ registerComponentHook ( componentId , 'lifecycle' , 'attach' ,
4241
+ function ( instance ) {
4242
+ updateVirtualRef ( vm , instance && instance . refs ) ;
4193
4243
4194
- new Watcher (
4195
- vm ,
4196
- function ( ) { return getComponentState ( vm ) ; } ,
4197
- function ( ) { return vm . _update ( vm . _vnode , false ) ; }
4198
- ) ;
4244
+ callHook ( vm , 'beforeMount' ) ;
4199
4245
4200
- vm . _isMounted = true ;
4201
- callHook ( vm , 'mounted' ) ;
4202
- } ) ;
4246
+ new Watcher (
4247
+ vm ,
4248
+ function ( ) { return getComponentState ( vm ) ; } ,
4249
+ function ( ) { return vm . _update ( vm . _vnode , false ) ; }
4250
+ ) ;
4203
4251
4204
- registerComponentHook ( componentId , 'lifecycle' , 'update' , function ( ) {
4205
- vm . _update ( vm . _vnode , false ) ;
4206
- } ) ;
4252
+ vm . _isMounted = true ;
4253
+ callHook ( vm , 'mounted' ) ;
4254
+ } ) ;
4255
+
4256
+ registerComponentHook ( componentId , 'lifecycle' , 'update' ,
4257
+ function ( instance ) {
4258
+ updateVirtualRef ( vm , instance && instance . refs ) ;
4259
+ vm . _update ( vm . _vnode , false ) ;
4260
+ } ) ;
4207
4261
4208
4262
registerComponentHook (
4209
4263
componentId ,
@@ -4219,14 +4273,16 @@ function initVirtualComponent (options) {
4219
4273
}
4220
4274
) ;
4221
4275
4222
- registerComponentHook ( componentId , 'lifecycle' , 'detach' , function ( ) {
4223
- vm . $destroy ( ) ;
4224
- if ( vm . _vmTemplate ) {
4276
+ registerComponentHook ( componentId , 'lifecycle' , 'detach' ,
4277
+ function ( instance ) {
4278
+ updateVirtualRef ( vm , instance && instance . refs , true ) ;
4279
+ vm . $destroy ( ) ;
4280
+ if ( vm . _vmTemplate ) {
4225
4281
// $flow-disable-line
4226
- vm . _vmTemplate . removeVirtualComponent ( vm . _uid ) ;
4227
- delete vm . _vmTemplate ;
4228
- }
4229
- } ) ;
4282
+ vm . _vmTemplate . removeVirtualComponent ( vm . _uid ) ;
4283
+ delete vm . _vmTemplate ;
4284
+ }
4285
+ } ) ;
4230
4286
}
4231
4287
4232
4288
// override Vue.prototype._update
@@ -7214,6 +7270,16 @@ var RecycleList = {
7214
7270
} ) ;
7215
7271
}
7216
7272
7273
+ this . _events [ '_attach_slot' ] = function ( instance ) {
7274
+ registerListRef ( this$1 . $parent || this$1 , instance . position , instance . refs ) ;
7275
+ } ;
7276
+ this . _events [ '_update_slot' ] = function ( instance ) {
7277
+ registerListRef ( this$1 . $parent || this$1 , instance . position , instance . refs ) ;
7278
+ } ;
7279
+ this . _events [ '_detach_slot' ] = function ( instance ) {
7280
+ registerListRef ( this$1 . $parent || this$1 , instance . position , instance . refs , true ) ;
7281
+ } ;
7282
+
7217
7283
return h ( 'weex:recycle-list' , {
7218
7284
on : this . _events
7219
7285
} , this . $slots . default )
@@ -7682,7 +7748,7 @@ var canBeLeftOpenTag = makeMap(
7682
7748
) ;
7683
7749
7684
7750
var isRuntimeComponent = makeMap (
7685
- 'richtext,transition,transition-group' ,
7751
+ 'richtext,transition,transition-group,recycle-list ' ,
7686
7752
true
7687
7753
) ;
7688
7754
0 commit comments