]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat: oldValue for directives
authorEvan You <yyx990803@gmail.com>
Wed, 26 Sep 2018 00:37:46 +0000 (20:37 -0400)
committerEvan You <yyx990803@gmail.com>
Wed, 26 Sep 2018 00:37:46 +0000 (20:37 -0400)
packages/core/src/optional/directive.ts

index aeab07bb38148bc2055a46d59b8c6e36c45ad496..8867e44601d921e44bbdd00911282c4fda153a80 100644 (file)
@@ -4,6 +4,7 @@ import { MountedComponent } from '../component'
 export interface DirectiveBinding {
   instance: MountedComponent
   value?: any
+  oldValue?: any
   arg?: string
   modifiers?: DirectiveModifiers
 }
@@ -26,6 +27,8 @@ export interface Directive {
 
 export type DirectiveModifiers = Record<string, boolean>
 
+const valueCache = new WeakMap<Directive, WeakMap<any, any>>()
+
 export function applyDirective(
   vnode: VNode,
   directive: Directive,
@@ -35,15 +38,27 @@ export function applyDirective(
   modifiers?: DirectiveModifiers
 ): VNode {
   const data = vnode.data || (vnode.data = {})
+  let valueCacheForDir = valueCache.get(directive) as WeakMap<VNode, any>
+  if (!valueCacheForDir) {
+    valueCacheForDir = new WeakMap<VNode, any>()
+    valueCache.set(directive, valueCacheForDir)
+  }
   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) => {
+      let oldValue
+      if (prevVNode !== void 0) {
+        oldValue = valueCacheForDir.get(prevVNode)
+        valueCacheForDir.delete(prevVNode)
+      }
+      valueCacheForDir.set(vnode, value)
       hook(
         vnode.el,
         {
           instance,
           value,
+          oldValue,
           arg,
           modifiers
         },