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+ */
57
68var shimmed = false
7- module . exports = function ( Vue ) {
9+ exports . install = function ( Vue ) {
810 if ( shimmed ) return
911 shimmed = true
1012 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 )
1214 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+
1326 var resolve = componentDir . resolveComponent
1427 componentDir . resolveComponent = function ( id , cb ) {
1528 var view = this
16- var prevComponent = view . Component
17- var prevId = prevComponent && prevComponent . options . hotID
1829 resolve . call ( this , id , function ( ) {
1930 var Component = view . Component
2031 var newId = Component . options . hotID
21- if ( prevId ) {
22- map [ prevId ] . instances . $remove ( view )
23- }
2432 if ( newId ) {
2533 if ( ! map [ newId ] ) {
2634 map [ newId ] = {
@@ -33,4 +41,38 @@ module.exports = function (Vue) {
3341 cb ( )
3442 } )
3543 }
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
3678}
0 commit comments