Skip to content

Commit

Permalink
refactor(reactivity): simplify the wrapping logic for returned values…
Browse files Browse the repository at this point in the history
… in array instrumentations (#11434)
  • Loading branch information
jh-leong authored Jul 29, 2024
1 parent 94fb2b8 commit e28c581
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 9 deletions.
17 changes: 9 additions & 8 deletions packages/reactivity/src/arrayInstrumentations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,16 +54,14 @@ export const arrayInstrumentations: Record<string | symbol, Function> = <any>{
fn: (item: unknown, index: number, array: unknown[]) => unknown,
thisArg?: unknown,
) {
const result = apply(this, 'filter', fn, thisArg)
return isProxy(this) && !isShallow(this) ? result.map(toReactive) : result
return apply(this, 'filter', fn, thisArg, v => v.map(toReactive))
},

find(
fn: (item: unknown, index: number, array: unknown[]) => boolean,
thisArg?: unknown,
) {
const result = apply(this, 'find', fn, thisArg)
return isProxy(this) && !isShallow(this) ? toReactive(result) : result
return apply(this, 'find', fn, thisArg, toReactive)
},

findIndex(
Expand All @@ -77,8 +75,7 @@ export const arrayInstrumentations: Record<string | symbol, Function> = <any>{
fn: (item: unknown, index: number, array: unknown[]) => boolean,
thisArg?: unknown,
) {
const result = apply(this, 'findLast', fn, thisArg)
return isProxy(this) && !isShallow(this) ? toReactive(result) : result
return apply(this, 'findLast', fn, thisArg, toReactive)
},

findLastIndex(
Expand Down Expand Up @@ -237,11 +234,14 @@ function apply(
method: ArrayMethods,
fn: (item: unknown, index: number, array: unknown[]) => unknown,
thisArg?: unknown,
wrappedRetFn?: (result: any) => unknown,
) {
const arr = shallowReadArray(self)
let needsWrap = false
let wrappedFn = fn
if (arr !== self) {
if (!isShallow(self)) {
needsWrap = !isShallow(self)
if (needsWrap) {
wrappedFn = function (this: unknown, item, index) {
return fn.call(this, toReactive(item), index, self)
}
Expand All @@ -252,7 +252,8 @@ function apply(
}
}
// @ts-expect-error our code is limited to es2016 but user code is not
return arr[method](wrappedFn, thisArg)
const result = arr[method](wrappedFn, thisArg)
return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result
}

// instrument reduce and reduceRight to take ARRAY_ITERATE dependency
Expand Down
2 changes: 1 addition & 1 deletion packages/runtime-core/src/helpers/renderList.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,9 @@ export function renderList(
let ret: VNodeChild[]
const cached = (cache && cache[index!]) as VNode[] | undefined
const sourceIsArray = isArray(source)
const sourceIsReactiveArray = sourceIsArray && isReactive(source)

if (sourceIsArray || isString(source)) {
const sourceIsReactiveArray = sourceIsArray && isReactive(source)
if (sourceIsReactiveArray) {
source = shallowReadArray(source)
}
Expand Down

0 comments on commit e28c581

Please sign in to comment.