File tree Expand file tree Collapse file tree 2 files changed +60
-5
lines changed Expand file tree Collapse file tree 2 files changed +60
-5
lines changed Original file line number Diff line number Diff line change @@ -937,4 +937,55 @@ describe('hot module replacement', () => {
937
937
rerender ( id , ( ) => 'bar' )
938
938
expect ( serializeInner ( root ) ) . toBe ( 'bar' )
939
939
} )
940
+
941
+ // https://github.com/vitejs/vite-plugin-vue/issues/599
942
+ // Both Outer and Inner are reloaded when './server.js' changes
943
+ test ( 'reload nested components from single update' , async ( ) => {
944
+ const innerId = 'nested-reload-inner'
945
+ const outerId = 'nested-reload-outer'
946
+
947
+ let Inner = {
948
+ __hmrId : innerId ,
949
+ render ( ) {
950
+ return h ( 'div' , 'foo' )
951
+ } ,
952
+ }
953
+ let Outer = {
954
+ __hmrId : outerId ,
955
+ render ( ) {
956
+ return h ( Inner )
957
+ } ,
958
+ }
959
+
960
+ createRecord ( innerId , Inner )
961
+ createRecord ( outerId , Outer )
962
+
963
+ const App = {
964
+ render : ( ) => h ( Outer ) ,
965
+ }
966
+
967
+ const root = nodeOps . createElement ( 'div' )
968
+ render ( h ( App ) , root )
969
+ expect ( serializeInner ( root ) ) . toBe ( '<div>foo</div>' )
970
+
971
+ Inner = {
972
+ __hmrId : innerId ,
973
+ render ( ) {
974
+ return h ( 'div' , 'bar' )
975
+ } ,
976
+ }
977
+ Outer = {
978
+ __hmrId : outerId ,
979
+ render ( ) {
980
+ return h ( Inner )
981
+ } ,
982
+ }
983
+
984
+ // trigger reload for both Outer and Inner
985
+ reload ( outerId , Outer )
986
+ reload ( innerId , Inner )
987
+ await nextTick ( )
988
+
989
+ expect ( serializeInner ( root ) ) . toBe ( '<div>bar</div>' )
990
+ } )
940
991
} )
Original file line number Diff line number Diff line change @@ -147,11 +147,15 @@ function reload(id: string, newComp: HMRComponent): void {
147
147
// components to be unmounted and re-mounted. Queue the update so that we
148
148
// don't end up forcing the same parent to re-render multiple times.
149
149
queueJob ( ( ) => {
150
- isHmrUpdating = true
151
- instance . parent ! . update ( )
152
- isHmrUpdating = false
153
- // #6930, #11248 avoid infinite recursion
154
- dirtyInstances . delete ( instance )
150
+ // vite-plugin-vue/issues/599
151
+ // don't update if the job is already disposed
152
+ if ( ! ( instance . job . flags ! & SchedulerJobFlags . DISPOSED ) ) {
153
+ isHmrUpdating = true
154
+ instance . parent ! . update ( )
155
+ isHmrUpdating = false
156
+ // #6930, #11248 avoid infinite recursion
157
+ dirtyInstances . delete ( instance )
158
+ }
155
159
} )
156
160
} else if ( instance . appContext . reload ) {
157
161
// root instance mounted via createApp() has a reload method
You can’t perform that action at this time.
0 commit comments