refactor: move looseEqual to vModel
This commit is contained in:
parent
004223ade6
commit
8df3e0a41e
@ -1,6 +1,6 @@
|
|||||||
import { Directive, VNode, DirectiveBinding, warn } from '@vue/runtime-core'
|
import { Directive, VNode, DirectiveBinding, warn } from '@vue/runtime-core'
|
||||||
import { addEventListener } from '../modules/events'
|
import { addEventListener } from '../modules/events'
|
||||||
import { looseEqual, isArray } from '@vue/shared'
|
import { isArray, isObject } from '@vue/shared'
|
||||||
|
|
||||||
const getModelAssigner = (vnode: VNode): ((value: any) => void) =>
|
const getModelAssigner = (vnode: VNode): ((value: any) => void) =>
|
||||||
vnode.props!['onUpdate:modelValue']
|
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 {
|
function looseIndexOf(arr: any[], val: any): number {
|
||||||
return arr.findIndex(item => looseEqual(item, val))
|
return arr.findIndex(item => looseEqual(item, val))
|
||||||
}
|
}
|
||||||
|
@ -64,44 +64,3 @@ export const hyphenate = (str: string): string => {
|
|||||||
export const capitalize = (str: string): string => {
|
export const capitalize = (str: string): string => {
|
||||||
return str.charAt(0).toUpperCase() + str.slice(1)
|
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user