|
|
|
@ -1,30 +1,45 @@
|
|
|
|
|
import {VNode, VNodeData} from '../vnode';
|
|
|
|
|
|
|
|
|
|
function pre(vnode: VNode, newVnode: VNode): void {
|
|
|
|
|
const attachData = (vnode.data as VNodeData).attachData;
|
|
|
|
|
export interface AttachData {
|
|
|
|
|
[key: string]: any
|
|
|
|
|
[i: number]: any
|
|
|
|
|
placeholder?: any
|
|
|
|
|
real?: Node
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface VNodeDataWithAttach extends VNodeData {
|
|
|
|
|
attachData: AttachData
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface VNodeWithAttachData extends VNode {
|
|
|
|
|
data: VNodeDataWithAttach
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function pre(vnode: VNodeWithAttachData, newVnode: VNodeWithAttachData): void {
|
|
|
|
|
const attachData = vnode.data.attachData;
|
|
|
|
|
// Copy created placeholder and real element from old vnode
|
|
|
|
|
(newVnode.data as VNodeData).attachData.placeholder = attachData.placeholder;
|
|
|
|
|
(newVnode.data as VNodeData).attachData.real = attachData.real;
|
|
|
|
|
newVnode.data.attachData.placeholder = attachData.placeholder;
|
|
|
|
|
newVnode.data.attachData.real = attachData.real;
|
|
|
|
|
// Mount real element in vnode so the patch process operates on it
|
|
|
|
|
vnode.elm = (vnode.data as VNodeData).attachData.real;
|
|
|
|
|
vnode.elm = vnode.data.attachData.real;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function post(_: any, vnode: VNode): void {
|
|
|
|
|
function post(_: any, vnode: VNodeWithAttachData): void {
|
|
|
|
|
// Mount dummy placeholder in vnode so potential reorders use it
|
|
|
|
|
vnode.elm = (vnode.data as VNodeData).attachData.placeholder;
|
|
|
|
|
vnode.elm = vnode.data.attachData.placeholder;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function destroy(vnode: VNode): void {
|
|
|
|
|
function destroy(vnode: VNodeWithAttachData): void {
|
|
|
|
|
// Remove placeholder
|
|
|
|
|
if (vnode.elm !== undefined) {
|
|
|
|
|
(vnode.elm.parentNode as HTMLElement).removeChild(vnode.elm);
|
|
|
|
|
}
|
|
|
|
|
// Remove real element from where it was inserted
|
|
|
|
|
vnode.elm = (vnode.data as VNodeData).attachData.real;
|
|
|
|
|
vnode.elm = vnode.data.attachData.real;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function create(_: any, vnode: VNode): void {
|
|
|
|
|
const real = vnode.elm, attachData = (vnode.data as VNodeData).attachData;
|
|
|
|
|
function create(_: any, vnode: VNodeWithAttachData): void {
|
|
|
|
|
const real = vnode.elm, attachData = vnode.data.attachData;
|
|
|
|
|
const placeholder = document.createElement('span');
|
|
|
|
|
// Replace actual element with dummy placeholder
|
|
|
|
|
// Snabbdom will then insert placeholder instead
|
|
|
|
|