wip: fix reactivity boundary between components

This commit is contained in:
Evan You 2019-05-28 14:43:23 +08:00
parent b69ea00f5c
commit 7a92ee04a0

View File

@ -320,7 +320,13 @@ export function createRenderer(options: RendererOptions) {
if (n1 == null) {
mountComponent(n2, container, anchor)
} else {
updateComponent(n1.component, n2, container, anchor)
const instance = (n2.component = n1.component)
if (shouldUpdateComponent(n1, n2)) {
instance.next = n2
instance.forceUpdate()
} else {
n2.el = n1.el
}
}
}
@ -331,12 +337,13 @@ export function createRenderer(options: RendererOptions) {
) {
const instance = (vnode.component = {
vnode: null,
next: null,
subTree: null,
updateHandle: null,
forceUpdate: null,
render: vnode.type
} as any)
instance.updateHandle = effect(
instance.forceUpdate = effect(
() => {
if (!instance.vnode) {
// initial mount
@ -345,7 +352,8 @@ export function createRenderer(options: RendererOptions) {
patch(null, subTree, container, anchor)
vnode.el = subTree.el
} else {
updateComponent(instance, vnode)
// this is triggered by processComponent with `next` already set
updateComponent(instance)
}
},
{
@ -356,14 +364,15 @@ export function createRenderer(options: RendererOptions) {
function updateComponent(
instance: any,
next: VNode,
container?: HostNode,
anchor?: HostNode
) {
const prev = instance.vnode
instance.vnode = next
next.component = instance
if (shouldUpdateComponent(prev, next)) {
const { next: vnode } = instance
if (vnode != null) {
vnode.component = instance
instance.vnode = vnode
instance.next = null
}
const prevTree = instance.subTree
const nextTree = (instance.subTree = renderComponentRoot(instance))
patch(
@ -372,7 +381,8 @@ export function createRenderer(options: RendererOptions) {
container || hostParentNode(prevTree.el),
anchor || getNextHostNode(prevTree)
)
next.el = nextTree.el
if (vnode != null) {
vnode.el = nextTree.el
}
}