1
- // override component directive's resolveComponent function.
2
- // When component is resolved:
3
- // - remove self from previous component's list
4
- // - add self to current component's list
1
+ /**
2
+ * override component directive's resolveComponent function.
3
+ * When component is resolved:
4
+ * - remove self from previous component's list
5
+ * - add self to current component's list
6
+ */
5
7
6
8
var shimmed = false
7
- module . exports = function ( Vue ) {
9
+ exports . install = function ( Vue ) {
8
10
if ( shimmed ) return
9
11
shimmed = true
10
12
console . log ( '[HMR] Vue component hot reload shim applied.' )
11
- var map = window . map = Vue . config . _hotComponents = Object . create ( null )
13
+ var map = Vue . config . _hotComponents = Object . create ( null )
12
14
var componentDir = Vue . internalDirectives . component
15
+
16
+ var set = componentDir . setComponent
17
+ componentDir . setComponent = function ( id , cb ) {
18
+ var prevComponent = this . Component
19
+ var prevId = prevComponent && prevComponent . options . hotID
20
+ if ( prevId ) {
21
+ map [ prevId ] . instances . $remove ( this )
22
+ }
23
+ set . call ( this , id , cb )
24
+ }
25
+
13
26
var resolve = componentDir . resolveComponent
14
27
componentDir . resolveComponent = function ( id , cb ) {
15
28
var view = this
16
- var prevComponent = view . Component
17
- var prevId = prevComponent && prevComponent . options . hotID
18
29
resolve . call ( this , id , function ( ) {
19
30
var Component = view . Component
20
31
var newId = Component . options . hotID
21
- if ( prevId ) {
22
- map [ prevId ] . instances . $remove ( view )
23
- }
24
32
if ( newId ) {
25
33
if ( ! map [ newId ] ) {
26
34
map [ newId ] = {
@@ -33,4 +41,38 @@ module.exports = function (Vue) {
33
41
cb ( )
34
42
} )
35
43
}
44
+
45
+ var unbind = componentDir . unbind
46
+ componentDir . unbind = function ( ) {
47
+ var id = this . Component && this . Component . options . hotID
48
+ if ( id ) {
49
+ map [ id ] . instances . $remove ( this )
50
+ }
51
+ unbind . call ( this )
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Update a component directive instance
57
+ *
58
+ * @param {Directive } view
59
+ */
60
+
61
+ exports . update = function ( view ) {
62
+ if ( ! view . _bound ) {
63
+ return
64
+ }
65
+ // disable transitions
66
+ view . vm . _isCompiled = false
67
+ // save state
68
+ var state = view . childVM . $data
69
+ // remount, make sure to disable keep-alive
70
+ var keepAlive = view . keepAlive
71
+ view . keepAlive = false
72
+ view . mountComponent ( )
73
+ view . keepAlive = keepAlive
74
+ // restore state
75
+ view . childVM . $data = state
76
+ // re-eanble transitions
77
+ view . vm . _isCompiled = true
36
78
}
0 commit comments