Skip to content

Commit

Permalink
Revert "refactor(directives): remove binding.instance"
Browse files Browse the repository at this point in the history
This reverts commit 52cc7e8.
  • Loading branch information
yyx990803 committed Mar 16, 2020
1 parent 19228a4 commit 2370166
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 2 deletions.
16 changes: 16 additions & 0 deletions packages/runtime-core/__tests__/directives.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
DirectiveBinding,
nextTick
} from '@vue/runtime-test'
import { currentInstance, ComponentInternalInstance } from '../src/component'

describe('directives', () => {
it('should work', async () => {
Expand All @@ -17,6 +18,7 @@ describe('directives', () => {
function assertBindings(binding: DirectiveBinding) {
expect(binding.value).toBe(count.value)
expect(binding.arg).toBe('foo')
expect(binding.instance).toBe(_instance && _instance.proxy)
expect(binding.modifiers && binding.modifiers.ok).toBe(true)
}

Expand Down Expand Up @@ -105,9 +107,13 @@ describe('directives', () => {
unmounted
}

let _instance: ComponentInternalInstance | null = null
let _vnode: VNode | null = null
let _prevVnode: VNode | null = null
const Comp = {
setup() {
_instance = currentInstance
},
render() {
_prevVnode = _vnode
_vnode = withDirectives(h('div', count.value), [
Expand Down Expand Up @@ -147,6 +153,7 @@ describe('directives', () => {
function assertBindings(binding: DirectiveBinding) {
expect(binding.value).toBe(count.value)
expect(binding.arg).toBe('foo')
expect(binding.instance).toBe(_instance && _instance.proxy)
expect(binding.modifiers && binding.modifiers.ok).toBe(true)
}

Expand All @@ -160,9 +167,13 @@ describe('directives', () => {
expect(prevVNode).toBe(_prevVnode)
}) as DirectiveHook)

let _instance: ComponentInternalInstance | null = null
let _vnode: VNode | null = null
let _prevVnode: VNode | null = null
const Comp = {
setup() {
_instance = currentInstance
},
render() {
_prevVnode = _vnode
_vnode = withDirectives(h('div', count.value), [
Expand Down Expand Up @@ -196,6 +207,7 @@ describe('directives', () => {
function assertBindings(binding: DirectiveBinding) {
expect(binding.value).toBe(count.value)
expect(binding.arg).toBe('foo')
expect(binding.instance).toBe(_instance && _instance.proxy)
expect(binding.modifiers && binding.modifiers.ok).toBe(true)
}

Expand Down Expand Up @@ -284,6 +296,7 @@ describe('directives', () => {
unmounted
}

let _instance: ComponentInternalInstance | null = null
let _vnode: VNode | null = null
let _prevVnode: VNode | null = null

Expand All @@ -294,6 +307,9 @@ describe('directives', () => {
}

const Comp = {
setup() {
_instance = currentInstance
},
render() {
return withDirectives(h(Child, { count: count.value }), [
[
Expand Down
13 changes: 11 additions & 2 deletions packages/runtime-core/src/directives.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,12 @@ import { VNode } from './vnode'
import { isFunction, EMPTY_OBJ, makeMap, EMPTY_ARR } from '@vue/shared'
import { warn } from './warning'
import { ComponentInternalInstance } from './component'
import { currentRenderingInstance } from './componentRenderUtils'
import { callWithAsyncErrorHandling, ErrorCodes } from './errorHandling'
import { ComponentPublicInstance } from './componentProxy'

export interface DirectiveBinding {
instance: ComponentPublicInstance | null
value: any
oldValue: any
arg?: string
Expand Down Expand Up @@ -105,9 +108,14 @@ export function withDirectives<T extends VNode>(
vnode: T,
directives: DirectiveArguments
): T {
const internalInstance = currentRenderingInstance
if (internalInstance === null) {
__DEV__ && warn(`withDirectives can only be used inside render functions.`)
return vnode
}
const instance = internalInstance.proxy
const props = vnode.props || (vnode.props = {})
const bindings: DirectiveBinding[] =
vnode.dirs || (vnode.dirs = new Array(directives.length))
const bindings = vnode.dirs || (vnode.dirs = new Array(directives.length))
const injected: Record<string, true> = {}
for (let i = 0; i < directives.length; i++) {
let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i]
Expand All @@ -119,6 +127,7 @@ export function withDirectives<T extends VNode>(
}
bindings[i] = {
dir,
instance,
value,
oldValue: void 0,
arg,
Expand Down

2 comments on commit 2370166

@CyberAP
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

May I ask what was the reasoning behind the decision to bring back instance to directives?

@yyx990803
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just one less breaking change. It was removed previously due to the complexity it would introduce to locate the correct instance inside slots, but that was solved by ecd7ce6.

Please sign in to comment.