Evan You пре 7 година
родитељ
комит
6441eac4c6

Разлика између датотеке није приказан због своје велике величине
+ 2051 - 2048
dist/vue.common.dev.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
dist/vue.common.prod.js


Разлика између датотеке није приказан због своје велике величине
+ 2059 - 2054
dist/vue.esm.browser.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
dist/vue.esm.browser.min.js


Разлика између датотеке није приказан због своје велике величине
+ 2060 - 2057
dist/vue.esm.js


Разлика између датотеке није приказан због своје велике величине
+ 2051 - 2048
dist/vue.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
dist/vue.min.js


Разлика између датотеке није приказан због своје велике величине
+ 2048 - 2045
dist/vue.runtime.common.dev.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
dist/vue.runtime.common.prod.js


Разлика између датотеке није приказан због своје велике величине
+ 2066 - 2063
dist/vue.runtime.esm.js


Разлика између датотеке није приказан због своје велике величине
+ 2048 - 2045
dist/vue.runtime.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
dist/vue.runtime.min.js


Разлика између датотеке није приказан због своје велике величине
+ 773 - 741
packages/vue-server-renderer/basic.js


Разлика између датотеке није приказан због своје велике величине
+ 773 - 741
packages/vue-server-renderer/build.dev.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
packages/vue-server-renderer/build.prod.js


+ 1 - 1
packages/vue-server-renderer/package.json

@@ -1,6 +1,6 @@
 {
   "name": "vue-server-renderer",
-  "version": "2.6.2",
+  "version": "2.6.3",
   "description": "server renderer for Vue 2.0",
   "main": "index.js",
   "types": "types/index.d.ts",

+ 44 - 8
packages/vue-template-compiler/browser.js

@@ -745,6 +745,7 @@
   var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
   var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
   var isPhantomJS = UA && /phantomjs/.test(UA);
+  var isFF = UA && UA.match(/firefox\/(\d+)/);
 
   // Firefox has a "watch" function on Object.prototype...
   var nativeWatch = ({}).watch;
@@ -2747,6 +2748,8 @@
 
   var decodeHTMLCached = cached(he.decode);
 
+  var emptySlotScopeToken = "_empty_";
+
   // configurable state
   var warn$1;
   var delimiters;
@@ -3359,7 +3362,7 @@
           var dynamic = ref.dynamic;
           el.slotTarget = name;
           el.slotTargetDynamic = dynamic;
-          el.slotScope = slotBinding.value || "_"; // force it into a scoped slot for perf
+          el.slotScope = slotBinding.value || emptySlotScopeToken; // force it into a scoped slot for perf
         }
       } else {
         // v-slot on component, denotes default slot
@@ -3394,8 +3397,13 @@
           var slotContainer = slots[name$1] = createASTElement('template', [], el);
           slotContainer.slotTarget = name$1;
           slotContainer.slotTargetDynamic = dynamic$1;
-          slotContainer.children = el.children.filter(function (c) { return !(c).slotScope; });
-          slotContainer.slotScope = slotBinding$1.value || "_";
+          slotContainer.children = el.children.filter(function (c) {
+            if (!c.slotScope) {
+              c.parent = slotContainer;
+              return true
+            }
+          });
+          slotContainer.slotScope = slotBinding$1.value || emptySlotScopeToken;
           // remove children as they are returned from scopedSlots now
           el.children = [];
           // mark el non-plain so data gets generated
@@ -4490,7 +4498,7 @@
     }
     // scoped slots
     if (el.scopedSlots) {
-      data += (genScopedSlots(el.scopedSlots, state)) + ",";
+      data += (genScopedSlots(el, el.scopedSlots, state)) + ",";
     }
     // component v-model
     if (el.model) {
@@ -4561,16 +4569,34 @@
   }
 
   function genScopedSlots (
+    el,
     slots,
     state
   ) {
-    var hasDynamicKeys = Object.keys(slots).some(function (key) {
+    // by default scoped slots are considered "stable", this allows child
+    // components with only scoped slots to skip forced updates from parent.
+    // but in some cases we have to bail-out of this optimization
+    // for example if the slot contains dynamic names, has v-if or v-for on them...
+    var needsForceUpdate = Object.keys(slots).some(function (key) {
       var slot = slots[key];
       return slot.slotTargetDynamic || slot.if || slot.for
     });
+    // OR when it is inside another scoped slot (the reactivity is disconnected)
+    // #9438
+    if (!needsForceUpdate) {
+      var parent = el.parent;
+      while (parent) {
+        if (parent.slotScope && parent.slotScope !== emptySlotScopeToken) {
+          needsForceUpdate = true;
+          break
+        }
+        parent = parent.parent;
+      }
+    }
+
     return ("scopedSlots:_u([" + (Object.keys(slots).map(function (key) {
         return genScopedSlot(slots[key], state)
-      }).join(',')) + "]" + (hasDynamicKeys ? ",true" : "") + ")")
+      }).join(',')) + "]" + (needsForceUpdate ? ",true" : "") + ")")
   }
 
   function genScopedSlot (
@@ -4584,7 +4610,10 @@
     if (el.for && !el.forProcessed) {
       return genFor(el, state, genScopedSlot)
     }
-    var fn = "function(" + (String(el.slotScope)) + "){" +
+    var slotScope = el.slotScope === emptySlotScopeToken
+      ? ""
+      : String(el.slotScope);
+    var fn = "function(" + slotScope + "){" +
       "return " + (el.tag === 'template'
         ? el.if && isLegacySyntax
           ? ("(" + (el.if) + ")?" + (genChildren(el, state) || 'undefined') + ":undefined")
@@ -4677,7 +4706,14 @@
     var slotName = el.slotName || '"default"';
     var children = genChildren(el, state);
     var res = "_t(" + slotName + (children ? ("," + children) : '');
-    var attrs = el.attrs && ("{" + (el.attrs.map(function (a) { return ((camelize(a.name)) + ":" + (a.value)); }).join(',')) + "}");
+    var attrs = el.attrs || el.dynamicAttrs
+      ? genProps((el.attrs || []).concat(el.dynamicAttrs || []).map(function (attr) { return ({
+          // slot props are camelized
+          name: camelize(attr.name),
+          value: attr.value,
+          dynamic: attr.dynamic
+        }); }))
+      : null;
     var bind$$1 = el.attrsMap['v-bind'];
     if ((attrs || bind$$1) && !children) {
       res += ",null";

+ 44 - 8
packages/vue-template-compiler/build.js

@@ -703,6 +703,7 @@ var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android'
 var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
 var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
 var isPhantomJS = UA && /phantomjs/.test(UA);
+var isFF = UA && UA.match(/firefox\/(\d+)/);
 
 // Firefox has a "watch" function on Object.prototype...
 var nativeWatch = ({}).watch;
@@ -2367,6 +2368,8 @@ var invalidAttributeRE = /[\s"'<>\/=]/;
 
 var decodeHTMLCached = cached(he.decode);
 
+var emptySlotScopeToken = "_empty_";
+
 // configurable state
 var warn$1;
 var delimiters;
@@ -2979,7 +2982,7 @@ function processSlotContent (el) {
         var dynamic = ref.dynamic;
         el.slotTarget = name;
         el.slotTargetDynamic = dynamic;
-        el.slotScope = slotBinding.value || "_"; // force it into a scoped slot for perf
+        el.slotScope = slotBinding.value || emptySlotScopeToken; // force it into a scoped slot for perf
       }
     } else {
       // v-slot on component, denotes default slot
@@ -3014,8 +3017,13 @@ function processSlotContent (el) {
         var slotContainer = slots[name$1] = createASTElement('template', [], el);
         slotContainer.slotTarget = name$1;
         slotContainer.slotTargetDynamic = dynamic$1;
-        slotContainer.children = el.children.filter(function (c) { return !(c).slotScope; });
-        slotContainer.slotScope = slotBinding$1.value || "_";
+        slotContainer.children = el.children.filter(function (c) {
+          if (!c.slotScope) {
+            c.parent = slotContainer;
+            return true
+          }
+        });
+        slotContainer.slotScope = slotBinding$1.value || emptySlotScopeToken;
         // remove children as they are returned from scopedSlots now
         el.children = [];
         // mark el non-plain so data gets generated
@@ -4121,7 +4129,7 @@ function genData$2 (el, state) {
   }
   // scoped slots
   if (el.scopedSlots) {
-    data += (genScopedSlots(el.scopedSlots, state)) + ",";
+    data += (genScopedSlots(el, el.scopedSlots, state)) + ",";
   }
   // component v-model
   if (el.model) {
@@ -4194,16 +4202,34 @@ function genInlineTemplate (el, state) {
 }
 
 function genScopedSlots (
+  el,
   slots,
   state
 ) {
-  var hasDynamicKeys = Object.keys(slots).some(function (key) {
+  // by default scoped slots are considered "stable", this allows child
+  // components with only scoped slots to skip forced updates from parent.
+  // but in some cases we have to bail-out of this optimization
+  // for example if the slot contains dynamic names, has v-if or v-for on them...
+  var needsForceUpdate = Object.keys(slots).some(function (key) {
     var slot = slots[key];
     return slot.slotTargetDynamic || slot.if || slot.for
   });
+  // OR when it is inside another scoped slot (the reactivity is disconnected)
+  // #9438
+  if (!needsForceUpdate) {
+    var parent = el.parent;
+    while (parent) {
+      if (parent.slotScope && parent.slotScope !== emptySlotScopeToken) {
+        needsForceUpdate = true;
+        break
+      }
+      parent = parent.parent;
+    }
+  }
+
   return ("scopedSlots:_u([" + (Object.keys(slots).map(function (key) {
       return genScopedSlot(slots[key], state)
-    }).join(',')) + "]" + (hasDynamicKeys ? ",true" : "") + ")")
+    }).join(',')) + "]" + (needsForceUpdate ? ",true" : "") + ")")
 }
 
 function genScopedSlot (
@@ -4217,7 +4243,10 @@ function genScopedSlot (
   if (el.for && !el.forProcessed) {
     return genFor(el, state, genScopedSlot)
   }
-  var fn = "function(" + (String(el.slotScope)) + "){" +
+  var slotScope = el.slotScope === emptySlotScopeToken
+    ? ""
+    : String(el.slotScope);
+  var fn = "function(" + slotScope + "){" +
     "return " + (el.tag === 'template'
       ? el.if && isLegacySyntax
         ? ("(" + (el.if) + ")?" + (genChildren(el, state) || 'undefined') + ":undefined")
@@ -4310,7 +4339,14 @@ function genSlot (el, state) {
   var slotName = el.slotName || '"default"';
   var children = genChildren(el, state);
   var res = "_t(" + slotName + (children ? ("," + children) : '');
-  var attrs = el.attrs && ("{" + (el.attrs.map(function (a) { return ((camelize(a.name)) + ":" + (a.value)); }).join(',')) + "}");
+  var attrs = el.attrs || el.dynamicAttrs
+    ? genProps((el.attrs || []).concat(el.dynamicAttrs || []).map(function (attr) { return ({
+        // slot props are camelized
+        name: camelize(attr.name),
+        value: attr.value,
+        dynamic: attr.dynamic
+      }); }))
+    : null;
   var bind$$1 = el.attrsMap['v-bind'];
   if ((attrs || bind$$1) && !children) {
     res += ",null";

+ 1 - 1
packages/vue-template-compiler/package.json

@@ -1,6 +1,6 @@
 {
   "name": "vue-template-compiler",
-  "version": "2.6.2",
+  "version": "2.6.3",
   "description": "template compiler for Vue 2.0",
   "main": "index.js",
   "unpkg": "browser.js",

Неке датотеке нису приказане због велике количине промена