@@ -71,13 +71,13 @@ describe('hot module replacement', () => {
71
71
expect ( serializeInner ( root ) ) . toBe ( `<div>11</div>` )
72
72
73
73
// // Update text while preserving state
74
- // rerender(
75
- // parentId,
76
- // compileToFunction(
77
- // `<div @click="count++">{{ count }}!<Child>{{ count }}</Child></div>`
78
- // )
79
- // )
80
- // expect(serializeInner(root)).toBe(`<div>1!1</div>`)
74
+ rerender (
75
+ parentId ,
76
+ compileToFunction (
77
+ `<div @click="count++">{{ count }}!<Child>{{ count }}</Child></div>`
78
+ )
79
+ )
80
+ expect ( serializeInner ( root ) ) . toBe ( `<div>1!1</div>` )
81
81
82
82
// Should force child update on slot content change
83
83
rerender (
@@ -147,4 +147,75 @@ describe('hot module replacement', () => {
147
147
expect ( unmountSpy ) . toHaveBeenCalledTimes ( 1 )
148
148
expect ( mountSpy ) . toHaveBeenCalledTimes ( 1 )
149
149
} )
150
+
151
+ // #1156 - static nodes should retain DOM element reference across updates
152
+ // when HMR is active
153
+ test ( 'static el reference' , async ( ) => {
154
+ const root = nodeOps . createElement ( 'div' )
155
+ const id = 'test-static-el'
156
+
157
+ const template = `<div>
158
+ <div>{{ count }}</div>
159
+ <button @click="count++">++</button>
160
+ </div>`
161
+
162
+ const Comp : ComponentOptions = {
163
+ __hmrId : id ,
164
+ data ( ) {
165
+ return { count : 0 }
166
+ } ,
167
+ render : compileToFunction ( template )
168
+ }
169
+ createRecord ( id , Comp )
170
+
171
+ render ( h ( Comp ) , root )
172
+ expect ( serializeInner ( root ) ) . toBe (
173
+ `<div><div>0</div><button>++</button></div>`
174
+ )
175
+
176
+ // 1. click to trigger update
177
+ triggerEvent ( ( root as any ) . children [ 0 ] . children [ 1 ] , 'click' )
178
+ await nextTick ( )
179
+ expect ( serializeInner ( root ) ) . toBe (
180
+ `<div><div>1</div><button>++</button></div>`
181
+ )
182
+
183
+ // 2. trigger HMR
184
+ rerender (
185
+ id ,
186
+ compileToFunction ( template . replace ( `<button` , `<button class="foo"` ) )
187
+ )
188
+ expect ( serializeInner ( root ) ) . toBe (
189
+ `<div><div>1</div><button class="foo">++</button></div>`
190
+ )
191
+ } )
192
+
193
+ // #1157 - component should force full props update when HMR is active
194
+ test ( 'force update child component w/ static props' , ( ) => {
195
+ const root = nodeOps . createElement ( 'div' )
196
+ const parentId = 'test2-parent'
197
+ const childId = 'test2-child'
198
+
199
+ const Child : ComponentOptions = {
200
+ __hmrId : childId ,
201
+ props : {
202
+ msg : String
203
+ } ,
204
+ render : compileToFunction ( `<div>{{ msg }}</div>` )
205
+ }
206
+ createRecord ( childId , Child )
207
+
208
+ const Parent : ComponentOptions = {
209
+ __hmrId : parentId ,
210
+ components : { Child } ,
211
+ render : compileToFunction ( `<Child msg="foo" />` )
212
+ }
213
+ createRecord ( parentId , Parent )
214
+
215
+ render ( h ( Parent ) , root )
216
+ expect ( serializeInner ( root ) ) . toBe ( `<div>foo</div>` )
217
+
218
+ rerender ( parentId , compileToFunction ( `<Child msg="bar" />` ) )
219
+ expect ( serializeInner ( root ) ) . toBe ( `<div>bar</div>` )
220
+ } )
150
221
} )
0 commit comments