From 8df3e0a41e4aaa573cfd2eff3bff4683f718d8a0 Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 14 Oct 2019 17:40:56 -0400 Subject: [PATCH] refactor: move looseEqual to vModel --- packages/runtime-dom/src/directives/vModel.ts | 39 +++++++++++++++++- packages/shared/src/index.ts | 41 ------------------- 2 files changed, 38 insertions(+), 42 deletions(-) diff --git a/packages/runtime-dom/src/directives/vModel.ts b/packages/runtime-dom/src/directives/vModel.ts index 96acadf2..1df9a05e 100644 --- a/packages/runtime-dom/src/directives/vModel.ts +++ b/packages/runtime-dom/src/directives/vModel.ts @@ -1,6 +1,6 @@ import { Directive, VNode, DirectiveBinding, warn } from '@vue/runtime-core' import { addEventListener } from '../modules/events' -import { looseEqual, isArray } from '@vue/shared' +import { isArray, isObject } from '@vue/shared' const getModelAssigner = (vnode: VNode): ((value: any) => void) => vnode.props!['onUpdate:modelValue'] @@ -168,6 +168,43 @@ function setSelected(el: HTMLSelectElement, value: any) { } } +function looseEqual(a: any, b: any): boolean { + if (a === b) return true + const isObjectA = isObject(a) + const isObjectB = isObject(b) + if (isObjectA && isObjectB) { + try { + const isArrayA = isArray(a) + const isArrayB = isArray(b) + if (isArrayA && isArrayB) { + return ( + a.length === b.length && + a.every((e: any, i: any) => looseEqual(e, b[i])) + ) + } else if (a instanceof Date && b instanceof Date) { + return a.getTime() === b.getTime() + } else if (!isArrayA && !isArrayB) { + const keysA = Object.keys(a) + const keysB = Object.keys(b) + return ( + keysA.length === keysB.length && + keysA.every(key => looseEqual(a[key], b[key])) + ) + } else { + /* istanbul ignore next */ + return false + } + } catch (e) { + /* istanbul ignore next */ + return false + } + } else if (!isObjectA && !isObjectB) { + return String(a) === String(b) + } else { + return false + } +} + function looseIndexOf(arr: any[], val: any): number { return arr.findIndex(item => looseEqual(item, val)) } diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index f4ce62a4..2b8a1023 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -64,44 +64,3 @@ export const hyphenate = (str: string): string => { export const capitalize = (str: string): string => { return str.charAt(0).toUpperCase() + str.slice(1) } - -/** - * Check if two values are loosely equal - that is, - * if they are plain objects, do they have the same shape? - */ -export function looseEqual(a: any, b: any): boolean { - if (a === b) return true - const isObjectA = isObject(a) - const isObjectB = isObject(b) - if (isObjectA && isObjectB) { - try { - const isArrayA = isArray(a) - const isArrayB = isArray(b) - if (isArrayA && isArrayB) { - return ( - a.length === b.length && - a.every((e: any, i: any) => looseEqual(e, b[i])) - ) - } else if (a instanceof Date && b instanceof Date) { - return a.getTime() === b.getTime() - } else if (!isArrayA && !isArrayB) { - const keysA = Object.keys(a) - const keysB = Object.keys(b) - return ( - keysA.length === keysB.length && - keysA.every(key => looseEqual(a[key], b[key])) - ) - } else { - /* istanbul ignore next */ - return false - } - } catch (e) { - /* istanbul ignore next */ - return false - } - } else if (!isObjectA && !isObjectB) { - return String(a) === String(b) - } else { - return false - } -}