function setSelected (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 } }
// 实际的选项 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) { // 检查形态拿到index 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 //选不到了 } }