feat(runtime-core): detect and warn against components made reactive

close #962
This commit is contained in:
Evan You 2020-04-14 18:07:47 -04:00
parent 3e7bb7d110
commit 2e06f5bbe8

View File

@ -17,7 +17,7 @@ import {
ClassComponent
} from './component'
import { RawSlots } from './componentSlots'
import { isReactive, Ref } from '@vue/reactivity'
import { isReactive, Ref, toRaw } from '@vue/reactivity'
import { AppContext } from './apiCreateApp'
import {
SuspenseImpl,
@ -236,7 +236,7 @@ const createVNodeWithArgsTransform = (
export const InternalObjectSymbol = Symbol()
export const createVNode = (__DEV__
export const createVNode = (false
? createVNodeWithArgsTransform
: _createVNode) as typeof _createVNode
@ -292,6 +292,22 @@ function _createVNode(
? ShapeFlags.FUNCTIONAL_COMPONENT
: 0
if (
__DEV__ &&
shapeFlag & ShapeFlags.STATEFUL_COMPONENT &&
isReactive(type)
) {
type = toRaw(type)
warn(
`Vue received a Component which was made a reactive object. This can ` +
`lead to unnecessary performance overhead, and should be avoided by ` +
`marking the component with \`markNonReactive\` or using \`shallowRef\` ` +
`instead of \`ref\`.`,
`\nComponent that was made reactive: `,
type
)
}
const vnode: VNode = {
_isVNode: true,
type,