芝麻web文件管理V1.00
编辑当前文件:/home/rejoandoctor/public_html/node_modules/vue/src/core/vdom/helpers/normalize-scoped-slots.ts
import { def } from 'core/util/lang' import { normalizeChildren } from 'core/vdom/helpers/normalize-children' import { emptyObject, isArray } from 'shared/util' import { isAsyncPlaceholder } from './is-async-placeholder' import type VNode from '../vnode' import { Component } from 'types/component' import { currentInstance, setCurrentInstance } from 'v3/currentInstance' export function normalizeScopedSlots( ownerVm: Component, scopedSlots: { [key: string]: Function } | undefined, normalSlots: { [key: string]: VNode[] }, prevScopedSlots?: { [key: string]: Function } ): any { let res const hasNormalSlots = Object.keys(normalSlots).length > 0 const isStable = scopedSlots ? !!scopedSlots.$stable : !hasNormalSlots const key = scopedSlots && scopedSlots.$key if (!scopedSlots) { res = {} } else if (scopedSlots._normalized) { // fast path 1: child component re-render only, parent did not change return scopedSlots._normalized } else if ( isStable && prevScopedSlots && prevScopedSlots !== emptyObject && key === prevScopedSlots.$key && !hasNormalSlots && !prevScopedSlots.$hasNormal ) { // fast path 2: stable scoped slots w/ no normal slots to proxy, // only need to normalize once return prevScopedSlots } else { res = {} for (const key in scopedSlots) { if (scopedSlots[key] && key[0] !== '$') { res[key] = normalizeScopedSlot( ownerVm, normalSlots, key, scopedSlots[key] ) } } } // expose normal slots on scopedSlots for (const key in normalSlots) { if (!(key in res)) { res[key] = proxyNormalSlot(normalSlots, key) } } // avoriaz seems to mock a non-extensible $scopedSlots object // and when that is passed down this would cause an error if (scopedSlots && Object.isExtensible(scopedSlots)) { scopedSlots._normalized = res } def(res, '$stable', isStable) def(res, '$key', key) def(res, '$hasNormal', hasNormalSlots) return res } function normalizeScopedSlot(vm, normalSlots, key, fn) { const normalized = function () { const cur = currentInstance setCurrentInstance(vm) let res = arguments.length ? fn.apply(null, arguments) : fn({}) res = res && typeof res === 'object' && !isArray(res) ? [res] // single vnode : normalizeChildren(res) const vnode: VNode | null = res && res[0] setCurrentInstance(cur) return res && (!vnode || (res.length === 1 && vnode.isComment && !isAsyncPlaceholder(vnode))) // #9658, #10391 ? undefined : res } // this is a slot using the new v-slot syntax without scope. although it is // compiled as a scoped slot, render fn users would expect it to be present // on this.$slots because the usage is semantically a normal slot. if (fn.proxy) { Object.defineProperty(normalSlots, key, { get: normalized, enumerable: true, configurable: true }) } return normalized } function proxyNormalSlot(slots, key) { return () => slots[key] }