@vue/compat 3.4.13 → 3.4.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @vue/compat v3.4.13
2
+ * @vue/compat v3.4.15
3
3
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
4
  * @license MIT
5
5
  **/
@@ -200,6 +200,13 @@ const isKnownHtmlAttr = /* @__PURE__ */ makeMap(
200
200
  const isKnownSvgAttr = /* @__PURE__ */ makeMap(
201
201
  `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`
202
202
  );
203
+ function isRenderableAttrValue(value) {
204
+ if (value == null) {
205
+ return false;
206
+ }
207
+ const type = typeof value;
208
+ return type === "string" || type === "number" || type === "boolean";
209
+ }
203
210
 
204
211
  function looseCompareArrays(a, b) {
205
212
  if (a.length !== b.length)
@@ -562,10 +569,7 @@ function triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) {
562
569
  var _a;
563
570
  pauseScheduling();
564
571
  for (const effect2 of dep.keys()) {
565
- if (dep.get(effect2) !== effect2._trackId) {
566
- continue;
567
- }
568
- if (effect2._dirtyLevel < dirtyLevel) {
572
+ if (effect2._dirtyLevel < dirtyLevel && dep.get(effect2) === effect2._trackId) {
569
573
  const lastDirtyLevel = effect2._dirtyLevel;
570
574
  effect2._dirtyLevel = dirtyLevel;
571
575
  if (lastDirtyLevel === 0) {
@@ -576,12 +580,17 @@ function triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) {
576
580
  effect2.trigger();
577
581
  }
578
582
  }
579
- if (effect2.scheduler && effect2._shouldSchedule && (!effect2._runnings || effect2.allowRecurse)) {
583
+ }
584
+ scheduleEffects(dep);
585
+ resetScheduling();
586
+ }
587
+ function scheduleEffects(dep) {
588
+ for (const effect2 of dep.keys()) {
589
+ if (effect2.scheduler && effect2._shouldSchedule && (!effect2._runnings || effect2.allowRecurse) && dep.get(effect2) === effect2._trackId) {
580
590
  effect2._shouldSchedule = false;
581
591
  queueEffectSchedulers.push(effect2.scheduler);
582
592
  }
583
593
  }
584
- resetScheduling();
585
594
  }
586
595
 
587
596
  const createDep = (cleanup, computed) => {
@@ -1264,7 +1273,8 @@ class ComputedRefImpl {
1264
1273
  this["__v_isReadonly"] = false;
1265
1274
  this.effect = new ReactiveEffect(
1266
1275
  () => getter(this._value),
1267
- () => triggerRefValue(this, 1)
1276
+ () => triggerRefValue(this, 1),
1277
+ () => this.dep && scheduleEffects(this.dep)
1268
1278
  );
1269
1279
  this.effect.computed = this;
1270
1280
  this.effect.active = this._cacheable = !isSSR;
@@ -1278,6 +1288,9 @@ class ComputedRefImpl {
1278
1288
  }
1279
1289
  }
1280
1290
  trackRefValue(self);
1291
+ if (self.effect._dirtyLevel >= 1) {
1292
+ triggerRefValue(self, 1);
1293
+ }
1281
1294
  return self._value;
1282
1295
  }
1283
1296
  set value(newValue) {
@@ -1703,7 +1716,7 @@ function handleError(err, instance, type, throwInDev = true) {
1703
1716
  if (instance) {
1704
1717
  let cur = instance.parent;
1705
1718
  const exposedInstance = instance.proxy;
1706
- const errorInfo = !!(process.env.NODE_ENV !== "production") ? ErrorTypeStrings$1[type] : `https://vuejs.org/errors/#runtime-${type}`;
1719
+ const errorInfo = !!(process.env.NODE_ENV !== "production") ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;
1707
1720
  while (cur) {
1708
1721
  const errorCapturedHooks = cur.ec;
1709
1722
  if (errorCapturedHooks) {
@@ -6461,7 +6474,7 @@ function createCompatVue$1(createApp, createSingletonApp) {
6461
6474
  return vm;
6462
6475
  }
6463
6476
  }
6464
- Vue.version = `2.6.14-compat:${"3.4.13"}`;
6477
+ Vue.version = `2.6.14-compat:${"3.4.15"}`;
6465
6478
  Vue.config = singletonApp.config;
6466
6479
  Vue.use = (p, ...options) => {
6467
6480
  if (p && isFunction(p.install)) {
@@ -7533,7 +7546,7 @@ const normalizeSlot = (key, rawSlot, ctx) => {
7533
7546
  return rawSlot;
7534
7547
  }
7535
7548
  const normalized = withCtx((...args) => {
7536
- if (!!(process.env.NODE_ENV !== "production") && currentInstance) {
7549
+ if (!!(process.env.NODE_ENV !== "production") && currentInstance && (!ctx || ctx.root === currentInstance.root)) {
7537
7550
  warn$1(
7538
7551
  `Slot "${key}" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.`
7539
7552
  );
@@ -7671,9 +7684,10 @@ function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {
7671
7684
  } else {
7672
7685
  const _isString = isString(ref);
7673
7686
  const _isRef = isRef(ref);
7687
+ const isVFor = rawRef.f;
7674
7688
  if (_isString || _isRef) {
7675
7689
  const doSet = () => {
7676
- if (rawRef.f) {
7690
+ if (isVFor) {
7677
7691
  const existing = _isString ? hasOwn(setupState, ref) ? setupState[ref] : refs[ref] : ref.value;
7678
7692
  if (isUnmount) {
7679
7693
  isArray(existing) && remove(existing, refValue);
@@ -7706,11 +7720,11 @@ function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {
7706
7720
  warn$1("Invalid template ref type:", ref, `(${typeof ref})`);
7707
7721
  }
7708
7722
  };
7709
- if (value) {
7723
+ if (isUnmount || isVFor) {
7724
+ doSet();
7725
+ } else {
7710
7726
  doSet.id = -1;
7711
7727
  queuePostRenderEffect(doSet, parentSuspense);
7712
- } else {
7713
- doSet();
7714
7728
  }
7715
7729
  } else if (!!(process.env.NODE_ENV !== "production")) {
7716
7730
  warn$1("Invalid template ref type:", ref, `(${typeof ref})`);
@@ -8230,11 +8244,12 @@ function propHasMismatch(el, key, clientValue, vnode) {
8230
8244
  } else {
8231
8245
  if (el.hasAttribute(key)) {
8232
8246
  actual = el.getAttribute(key);
8247
+ } else if (key === "value" && el.tagName === "TEXTAREA") {
8248
+ actual = el.value;
8233
8249
  } else {
8234
- const serverValue = el[key];
8235
- actual = isObject(serverValue) || serverValue == null ? "" : String(serverValue);
8250
+ actual = false;
8236
8251
  }
8237
- expected = isObject(clientValue) || clientValue == null ? "" : String(clientValue);
8252
+ expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;
8238
8253
  }
8239
8254
  if (actual !== expected) {
8240
8255
  mismatchType = `attribute`;
@@ -11360,7 +11375,7 @@ function isMemoSame(cached, memo) {
11360
11375
  return true;
11361
11376
  }
11362
11377
 
11363
- const version = "3.4.13";
11378
+ const version = "3.4.15";
11364
11379
  const warn = !!(process.env.NODE_ENV !== "production") ? warn$1 : NOOP;
11365
11380
  const ErrorTypeStrings = ErrorTypeStrings$1 ;
11366
11381
  const devtools = !!(process.env.NODE_ENV !== "production") || true ? devtools$1 : void 0;
@@ -12734,35 +12749,52 @@ const vModelSelect = {
12734
12749
  el[assignKey](
12735
12750
  el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]
12736
12751
  );
12752
+ el._assigning = true;
12753
+ nextTick(() => {
12754
+ el._assigning = false;
12755
+ });
12737
12756
  });
12738
12757
  el[assignKey] = getModelAssigner(vnode);
12739
12758
  },
12740
12759
  // set value in mounted & updated because <select> relies on its children
12741
12760
  // <option>s.
12742
- mounted(el, { value }) {
12743
- setSelected(el, value);
12761
+ mounted(el, { value, oldValue, modifiers: { number } }) {
12762
+ setSelected(el, value, oldValue, number);
12744
12763
  },
12745
12764
  beforeUpdate(el, _binding, vnode) {
12746
12765
  el[assignKey] = getModelAssigner(vnode);
12747
12766
  },
12748
- updated(el, { value }) {
12749
- setSelected(el, value);
12767
+ updated(el, { value, oldValue, modifiers: { number } }) {
12768
+ if (!el._assigning) {
12769
+ setSelected(el, value, oldValue, number);
12770
+ }
12750
12771
  }
12751
12772
  };
12752
- function setSelected(el, value) {
12773
+ function setSelected(el, value, oldValue, number) {
12753
12774
  const isMultiple = el.multiple;
12754
- if (isMultiple && !isArray(value) && !isSet(value)) {
12775
+ const isArrayValue = isArray(value);
12776
+ if (isMultiple && !isArrayValue && !isSet(value)) {
12755
12777
  !!(process.env.NODE_ENV !== "production") && warn(
12756
12778
  `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.`
12757
12779
  );
12758
12780
  return;
12759
12781
  }
12782
+ if (isArrayValue && looseEqual(value, oldValue)) {
12783
+ return;
12784
+ }
12760
12785
  for (let i = 0, l = el.options.length; i < l; i++) {
12761
12786
  const option = el.options[i];
12762
12787
  const optionValue = getValue(option);
12763
12788
  if (isMultiple) {
12764
- if (isArray(value)) {
12765
- option.selected = looseIndexOf(value, optionValue) > -1;
12789
+ if (isArrayValue) {
12790
+ const optionType = typeof optionValue;
12791
+ if (optionType === "string" || optionType === "number") {
12792
+ option.selected = value.includes(
12793
+ number ? looseToNumber(optionValue) : optionValue
12794
+ );
12795
+ } else {
12796
+ option.selected = looseIndexOf(value, optionValue) > -1;
12797
+ }
12766
12798
  } else {
12767
12799
  option.selected = value.has(optionValue);
12768
12800
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @vue/compat v3.4.13
2
+ * @vue/compat v3.4.15
3
3
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
4
  * @license MIT
5
5
  **/
@@ -203,6 +203,13 @@ var Vue = (function () {
203
203
  const isKnownSvgAttr = /* @__PURE__ */ makeMap(
204
204
  `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`
205
205
  );
206
+ function isRenderableAttrValue(value) {
207
+ if (value == null) {
208
+ return false;
209
+ }
210
+ const type = typeof value;
211
+ return type === "string" || type === "number" || type === "boolean";
212
+ }
206
213
 
207
214
  function looseCompareArrays(a, b) {
208
215
  if (a.length !== b.length)
@@ -565,10 +572,7 @@ var Vue = (function () {
565
572
  var _a;
566
573
  pauseScheduling();
567
574
  for (const effect2 of dep.keys()) {
568
- if (dep.get(effect2) !== effect2._trackId) {
569
- continue;
570
- }
571
- if (effect2._dirtyLevel < dirtyLevel) {
575
+ if (effect2._dirtyLevel < dirtyLevel && dep.get(effect2) === effect2._trackId) {
572
576
  const lastDirtyLevel = effect2._dirtyLevel;
573
577
  effect2._dirtyLevel = dirtyLevel;
574
578
  if (lastDirtyLevel === 0) {
@@ -579,12 +583,17 @@ var Vue = (function () {
579
583
  effect2.trigger();
580
584
  }
581
585
  }
582
- if (effect2.scheduler && effect2._shouldSchedule && (!effect2._runnings || effect2.allowRecurse)) {
586
+ }
587
+ scheduleEffects(dep);
588
+ resetScheduling();
589
+ }
590
+ function scheduleEffects(dep) {
591
+ for (const effect2 of dep.keys()) {
592
+ if (effect2.scheduler && effect2._shouldSchedule && (!effect2._runnings || effect2.allowRecurse) && dep.get(effect2) === effect2._trackId) {
583
593
  effect2._shouldSchedule = false;
584
594
  queueEffectSchedulers.push(effect2.scheduler);
585
595
  }
586
596
  }
587
- resetScheduling();
588
597
  }
589
598
 
590
599
  const createDep = (cleanup, computed) => {
@@ -1267,7 +1276,8 @@ var Vue = (function () {
1267
1276
  this["__v_isReadonly"] = false;
1268
1277
  this.effect = new ReactiveEffect(
1269
1278
  () => getter(this._value),
1270
- () => triggerRefValue(this, 1)
1279
+ () => triggerRefValue(this, 1),
1280
+ () => this.dep && scheduleEffects(this.dep)
1271
1281
  );
1272
1282
  this.effect.computed = this;
1273
1283
  this.effect.active = this._cacheable = !isSSR;
@@ -1281,6 +1291,9 @@ var Vue = (function () {
1281
1291
  }
1282
1292
  }
1283
1293
  trackRefValue(self);
1294
+ if (self.effect._dirtyLevel >= 1) {
1295
+ triggerRefValue(self, 1);
1296
+ }
1284
1297
  return self._value;
1285
1298
  }
1286
1299
  set value(newValue) {
@@ -6420,7 +6433,7 @@ If this is a native custom element, make sure to exclude it from component resol
6420
6433
  return vm;
6421
6434
  }
6422
6435
  }
6423
- Vue.version = `2.6.14-compat:${"3.4.13"}`;
6436
+ Vue.version = `2.6.14-compat:${"3.4.15"}`;
6424
6437
  Vue.config = singletonApp.config;
6425
6438
  Vue.use = (p, ...options) => {
6426
6439
  if (p && isFunction(p.install)) {
@@ -7489,7 +7502,7 @@ If you want to remount the same app, move your app creation logic into a factory
7489
7502
  return rawSlot;
7490
7503
  }
7491
7504
  const normalized = withCtx((...args) => {
7492
- if (currentInstance) {
7505
+ if (currentInstance && (!ctx || ctx.root === currentInstance.root)) {
7493
7506
  warn$1(
7494
7507
  `Slot "${key}" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.`
7495
7508
  );
@@ -7627,9 +7640,10 @@ If you want to remount the same app, move your app creation logic into a factory
7627
7640
  } else {
7628
7641
  const _isString = isString(ref);
7629
7642
  const _isRef = isRef(ref);
7643
+ const isVFor = rawRef.f;
7630
7644
  if (_isString || _isRef) {
7631
7645
  const doSet = () => {
7632
- if (rawRef.f) {
7646
+ if (isVFor) {
7633
7647
  const existing = _isString ? hasOwn(setupState, ref) ? setupState[ref] : refs[ref] : ref.value;
7634
7648
  if (isUnmount) {
7635
7649
  isArray(existing) && remove(existing, refValue);
@@ -7662,11 +7676,11 @@ If you want to remount the same app, move your app creation logic into a factory
7662
7676
  warn$1("Invalid template ref type:", ref, `(${typeof ref})`);
7663
7677
  }
7664
7678
  };
7665
- if (value) {
7679
+ if (isUnmount || isVFor) {
7680
+ doSet();
7681
+ } else {
7666
7682
  doSet.id = -1;
7667
7683
  queuePostRenderEffect(doSet, parentSuspense);
7668
- } else {
7669
- doSet();
7670
7684
  }
7671
7685
  } else {
7672
7686
  warn$1("Invalid template ref type:", ref, `(${typeof ref})`);
@@ -8176,11 +8190,12 @@ Server rendered element contains fewer child nodes than client vdom.`
8176
8190
  } else {
8177
8191
  if (el.hasAttribute(key)) {
8178
8192
  actual = el.getAttribute(key);
8193
+ } else if (key === "value" && el.tagName === "TEXTAREA") {
8194
+ actual = el.value;
8179
8195
  } else {
8180
- const serverValue = el[key];
8181
- actual = isObject(serverValue) || serverValue == null ? "" : String(serverValue);
8196
+ actual = false;
8182
8197
  }
8183
- expected = isObject(clientValue) || clientValue == null ? "" : String(clientValue);
8198
+ expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;
8184
8199
  }
8185
8200
  if (actual !== expected) {
8186
8201
  mismatchType = `attribute`;
@@ -11235,7 +11250,7 @@ Component that was made reactive: `,
11235
11250
  return true;
11236
11251
  }
11237
11252
 
11238
- const version = "3.4.13";
11253
+ const version = "3.4.15";
11239
11254
  const warn = warn$1 ;
11240
11255
  const ErrorTypeStrings = ErrorTypeStrings$1 ;
11241
11256
  const devtools = devtools$1 ;
@@ -12582,35 +12597,52 @@ Component that was made reactive: `,
12582
12597
  el[assignKey](
12583
12598
  el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]
12584
12599
  );
12600
+ el._assigning = true;
12601
+ nextTick(() => {
12602
+ el._assigning = false;
12603
+ });
12585
12604
  });
12586
12605
  el[assignKey] = getModelAssigner(vnode);
12587
12606
  },
12588
12607
  // set value in mounted & updated because <select> relies on its children
12589
12608
  // <option>s.
12590
- mounted(el, { value }) {
12591
- setSelected(el, value);
12609
+ mounted(el, { value, oldValue, modifiers: { number } }) {
12610
+ setSelected(el, value, oldValue, number);
12592
12611
  },
12593
12612
  beforeUpdate(el, _binding, vnode) {
12594
12613
  el[assignKey] = getModelAssigner(vnode);
12595
12614
  },
12596
- updated(el, { value }) {
12597
- setSelected(el, value);
12615
+ updated(el, { value, oldValue, modifiers: { number } }) {
12616
+ if (!el._assigning) {
12617
+ setSelected(el, value, oldValue, number);
12618
+ }
12598
12619
  }
12599
12620
  };
12600
- function setSelected(el, value) {
12621
+ function setSelected(el, value, oldValue, number) {
12601
12622
  const isMultiple = el.multiple;
12602
- if (isMultiple && !isArray(value) && !isSet(value)) {
12623
+ const isArrayValue = isArray(value);
12624
+ if (isMultiple && !isArrayValue && !isSet(value)) {
12603
12625
  warn(
12604
12626
  `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.`
12605
12627
  );
12606
12628
  return;
12607
12629
  }
12630
+ if (isArrayValue && looseEqual(value, oldValue)) {
12631
+ return;
12632
+ }
12608
12633
  for (let i = 0, l = el.options.length; i < l; i++) {
12609
12634
  const option = el.options[i];
12610
12635
  const optionValue = getValue(option);
12611
12636
  if (isMultiple) {
12612
- if (isArray(value)) {
12613
- option.selected = looseIndexOf(value, optionValue) > -1;
12637
+ if (isArrayValue) {
12638
+ const optionType = typeof optionValue;
12639
+ if (optionType === "string" || optionType === "number") {
12640
+ option.selected = value.includes(
12641
+ number ? looseToNumber(optionValue) : optionValue
12642
+ );
12643
+ } else {
12644
+ option.selected = looseIndexOf(value, optionValue) > -1;
12645
+ }
12614
12646
  } else {
12615
12647
  option.selected = value.has(optionValue);
12616
12648
  }