Просмотр исходного кода

perf(v-model): tweak setSelected

Evan You 8 лет назад
Родитель
Сommit
41d774d112
1 измененных файлов с 37 добавлено и 35 удалено
  1. 37 35
      src/platforms/web/runtime/directives/model.js

+ 37 - 35
src/platforms/web/runtime/directives/model.js

@@ -60,45 +60,47 @@ export default {
 }
 
 function setSelected (el, binding, vm) {
-  const cb = () => {
-    const value = binding.value
-    const isMultiple = el.multiple
-    if (isMultiple && !Array.isArray(value)) {
-      process.env.NODE_ENV !== 'production' && warn(
-        `<select multiple v-model="${binding.expression}"> ` +
-        `expects an Array value for its binding, but got ${
-          Object.prototype.toString.call(value).slice(8, -1)
-        }`,
-        vm
-      )
-      return
-    }
-    let selected, option
-    for (let i = 0, l = el.options.length; i < l; i++) {
-      option = el.options[i]
-      if (isMultiple) {
-        selected = looseIndexOf(value, getValue(option)) > -1
-        if (option.selected !== selected) {
-          option.selected = selected
-        }
-      } else {
-        if (looseEqual(getValue(option), value)) {
-          if (el.selectedIndex !== i) {
-            el.selectedIndex = i
-          }
-          return
+  actuallySetSelected(el, binding, vm)
+  /* istanbul ignore if */
+  if (isIE || isEdge) {
+    setTimeout(() => {
+      actuallySetSelected(el, binding, vm)
+    }, 0)
+  }
+}
+
+function actuallySetSelected (el, binding, vm) {
+  const value = binding.value
+  const isMultiple = el.multiple
+  if (isMultiple && !Array.isArray(value)) {
+    process.env.NODE_ENV !== 'production' && warn(
+      `<select multiple v-model="${binding.expression}"> ` +
+      `expects an Array value for its binding, but got ${
+        Object.prototype.toString.call(value).slice(8, -1)
+      }`,
+      vm
+    )
+    return
+  }
+  let selected, option
+  for (let i = 0, l = el.options.length; i < l; i++) {
+    option = el.options[i]
+    if (isMultiple) {
+      selected = looseIndexOf(value, getValue(option)) > -1
+      if (option.selected !== selected) {
+        option.selected = selected
+      }
+    } else {
+      if (looseEqual(getValue(option), value)) {
+        if (el.selectedIndex !== i) {
+          el.selectedIndex = i
         }
+        return
       }
     }
-    if (!isMultiple) {
-      el.selectedIndex = -1
-    }
   }
-
-  cb()
-  /* istanbul ignore if */
-  if (isIE || isEdge) {
-    setTimeout(cb, 0)
+  if (!isMultiple) {
+    el.selectedIndex = -1
   }
 }