feat: applyDirective
This commit is contained in:
parent
7b7ae57388
commit
1e447d021b
@ -48,8 +48,8 @@ export interface MountedComponent<D = Data, P = Data> extends Component {
|
|||||||
mounted?(): void
|
mounted?(): void
|
||||||
beforeUpdate?(vnode: VNode): void
|
beforeUpdate?(vnode: VNode): void
|
||||||
updated?(vnode: VNode): void
|
updated?(vnode: VNode): void
|
||||||
beforeDestroy?(): void
|
beforeUnmount?(): void
|
||||||
destroyed?(): void
|
unmounted?(): void
|
||||||
errorCaptured?(): (err: Error, type: ErrorTypes) => boolean | void
|
errorCaptured?(): (err: Error, type: ErrorTypes) => boolean | void
|
||||||
|
|
||||||
_updateHandle: Autorun
|
_updateHandle: Autorun
|
||||||
|
@ -1270,8 +1270,8 @@ export function createRenderer(options: RendererOptions) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function unmountComponentInstance(instance: MountedComponent) {
|
function unmountComponentInstance(instance: MountedComponent) {
|
||||||
if (instance.beforeDestroy) {
|
if (instance.beforeUnmount) {
|
||||||
instance.beforeDestroy.call(instance.$proxy)
|
instance.beforeUnmount.call(instance.$proxy)
|
||||||
}
|
}
|
||||||
if (instance.$vnode) {
|
if (instance.$vnode) {
|
||||||
unmount(instance.$vnode)
|
unmount(instance.$vnode)
|
||||||
@ -1279,8 +1279,8 @@ export function createRenderer(options: RendererOptions) {
|
|||||||
stop(instance._updateHandle)
|
stop(instance._updateHandle)
|
||||||
teardownComponentInstance(instance)
|
teardownComponentInstance(instance)
|
||||||
instance._destroyed = true
|
instance._destroyed = true
|
||||||
if (instance.destroyed) {
|
if (instance.unmounted) {
|
||||||
instance.destroyed.call(instance.$proxy)
|
instance.unmounted.call(instance.$proxy)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
58
packages/core/src/directive.ts
Normal file
58
packages/core/src/directive.ts
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
import { VNode } from './vdom'
|
||||||
|
import { MountedComponent } from './component'
|
||||||
|
|
||||||
|
export interface DirectiveBinding {
|
||||||
|
instance: MountedComponent
|
||||||
|
value?: any
|
||||||
|
arg?: string
|
||||||
|
modifiers?: DirectiveModifiers
|
||||||
|
}
|
||||||
|
|
||||||
|
export type DirectiveHook = (
|
||||||
|
el: any,
|
||||||
|
binding: DirectiveBinding,
|
||||||
|
vnode: VNode,
|
||||||
|
prevVNode: VNode | void
|
||||||
|
) => void
|
||||||
|
|
||||||
|
export interface Directive {
|
||||||
|
beforeMount: DirectiveHook
|
||||||
|
mounted: DirectiveHook
|
||||||
|
beforeUpdate: DirectiveHook
|
||||||
|
updated: DirectiveHook
|
||||||
|
beforeUnmount: DirectiveHook
|
||||||
|
unmounted: DirectiveHook
|
||||||
|
}
|
||||||
|
|
||||||
|
type DirectiveModifiers = Record<string, boolean>
|
||||||
|
|
||||||
|
export function applyDirective(
|
||||||
|
vnode: VNode,
|
||||||
|
directive: Directive,
|
||||||
|
instance: MountedComponent,
|
||||||
|
value?: any,
|
||||||
|
arg?: string,
|
||||||
|
modifiers?: DirectiveModifiers
|
||||||
|
): VNode {
|
||||||
|
const data = vnode.data || (vnode.data = {})
|
||||||
|
for (const key in directive) {
|
||||||
|
const hook = directive[key as keyof Directive]
|
||||||
|
const hookKey = `vnode` + key[0].toUpperCase() + key.slice(1)
|
||||||
|
const vnodeHook = (vnode: VNode, prevVNode?: VNode) => {
|
||||||
|
hook(
|
||||||
|
vnode.el,
|
||||||
|
{
|
||||||
|
instance,
|
||||||
|
value,
|
||||||
|
arg,
|
||||||
|
modifiers
|
||||||
|
},
|
||||||
|
vnode,
|
||||||
|
prevVNode
|
||||||
|
)
|
||||||
|
}
|
||||||
|
const existing = data[hookKey]
|
||||||
|
data[hookKey] = existing ? [].concat(existing, vnodeHook as any) : vnodeHook
|
||||||
|
}
|
||||||
|
return vnode
|
||||||
|
}
|
@ -15,6 +15,7 @@ export { nextTick } from '@vue/scheduler'
|
|||||||
|
|
||||||
// internal api
|
// internal api
|
||||||
export { createComponentInstance } from './componentUtils'
|
export { createComponentInstance } from './componentUtils'
|
||||||
|
export { applyDirective } from './directive'
|
||||||
|
|
||||||
// flags & types
|
// flags & types
|
||||||
export { ComponentClass, FunctionalComponent } from './component'
|
export { ComponentClass, FunctionalComponent } from './component'
|
||||||
|
Loading…
Reference in New Issue
Block a user