|
|
@@ -2,12 +2,14 @@ import {
|
|
|
EffectScope,
|
|
|
type ShallowRef,
|
|
|
isReactive,
|
|
|
+ isReadonly,
|
|
|
isShallow,
|
|
|
pauseTracking,
|
|
|
resetTracking,
|
|
|
shallowReadArray,
|
|
|
shallowRef,
|
|
|
toReactive,
|
|
|
+ toReadonly,
|
|
|
} from '@vue/reactivity'
|
|
|
import { getSequence, isArray, isObject, isString } from '@vue/shared'
|
|
|
import { createComment, createTextNode } from './dom/node'
|
|
|
@@ -59,6 +61,7 @@ type Source = any[] | Record<any, any> | number | Set<any> | Map<any, any>
|
|
|
type ResolvedSource = {
|
|
|
values: any[]
|
|
|
needsWrap: boolean
|
|
|
+ isReadonlySource: boolean
|
|
|
keys?: string[]
|
|
|
}
|
|
|
|
|
|
@@ -393,11 +396,13 @@ export function createForSlots(
|
|
|
function normalizeSource(source: any): ResolvedSource {
|
|
|
let values = source
|
|
|
let needsWrap = false
|
|
|
+ let isReadonlySource = false
|
|
|
let keys
|
|
|
if (isArray(source)) {
|
|
|
if (isReactive(source)) {
|
|
|
needsWrap = !isShallow(source)
|
|
|
values = shallowReadArray(source)
|
|
|
+ isReadonlySource = isReadonly(source)
|
|
|
}
|
|
|
} else if (isString(source)) {
|
|
|
values = source.split('')
|
|
|
@@ -418,14 +423,23 @@ function normalizeSource(source: any): ResolvedSource {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- return { values, needsWrap, keys }
|
|
|
+ return {
|
|
|
+ values,
|
|
|
+ needsWrap,
|
|
|
+ isReadonlySource,
|
|
|
+ keys,
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
function getItem(
|
|
|
- { keys, values, needsWrap }: ResolvedSource,
|
|
|
+ { keys, values, needsWrap, isReadonlySource }: ResolvedSource,
|
|
|
idx: number,
|
|
|
): [item: any, key: any, index?: number] {
|
|
|
- const value = needsWrap ? toReactive(values[idx]) : values[idx]
|
|
|
+ const value = needsWrap
|
|
|
+ ? isReadonlySource
|
|
|
+ ? toReadonly(toReactive(values[idx]))
|
|
|
+ : toReactive(values[idx])
|
|
|
+ : values[idx]
|
|
|
if (keys) {
|
|
|
return [value, keys[idx], idx]
|
|
|
} else {
|