Skip to content

Commit 92db60b

Browse files
committed
chore(compat): implement component access from vnode for vue3
Replace __vue__ with platform dependent access
1 parent f873121 commit 92db60b

File tree

5 files changed

+16
-8
lines changed

5 files changed

+16
-8
lines changed

src/components/link/link.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { isBoolean, isEvent, isFunction, isUndefined } from '../../utils/inspect
1414
import { omit, sortKeys } from '../../utils/object'
1515
import { makeProp, makePropsConfigurable, pluckProps } from '../../utils/props'
1616
import { computeHref, computeRel, computeTag, isRouterLink } from '../../utils/router'
17+
import { getInstanceFromVNode } from '../../utils/get-instance-from-vnode'
1718
import { attrsMixin } from '../../mixins/attrs'
1819
import { listenOnRootMixin } from '../../mixins/listen-on-root'
1920
import { listenersMixin } from '../../mixins/listeners'
@@ -162,8 +163,8 @@ export const BLink = /*#__PURE__*/ Vue.extend({
162163
// Router links do not emit instance `click` events, so we
163164
// add in an `$emit('click', event)` on its Vue instance
164165
/* istanbul ignore next: difficult to test, but we know it works */
165-
if (isRouterLink && event.currentTarget.__vue__) {
166-
event.currentTarget.__vue__.$emit(EVENT_NAME_CLICK, event)
166+
if (isRouterLink && getInstanceFromVNode(event.currentTarget)) {
167+
getInstanceFromVNode(event.currentTarget).$emit(EVENT_NAME_CLICK, event)
167168
}
168169
// Call the suppliedHandler(s), if any provided
169170
concat(suppliedHandler)

src/components/modal/modal.spec.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createWrapper, mount } from '@vue/test-utils'
22
import { waitNT, waitRAF } from '../../../tests/utils'
3+
import { getInstanceFromVNode } from '../../utils/get-instance-from-vnode'
34
import { BModal } from './modal'
45
import { BvModalEvent } from './helpers/bv-modal-event.class'
56

@@ -175,8 +176,8 @@ describe('modal', () => {
175176
expect(outer).toBeDefined()
176177
expect(outer).not.toBe(null)
177178

178-
expect(outer.__vue__).toBeDefined() // Target
179-
expect(outer.__vue__.$options.name).toBe('BVTransporterTarget')
179+
expect(getInstanceFromVNode(outer)).toBeDefined() // Target
180+
expect(getInstanceFromVNode(outer).$options.name).toBe('BVTransporterTarget')
180181
expect(outer.parentElement).toBeDefined()
181182
expect(outer.parentElement).toBe(document.body)
182183

src/components/tooltip/helpers/bv-tooltip.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
} from '../../../constants/events'
2525
import { useParentMixin } from '../../../mixins/use-parent'
2626
import { arrayIncludes, concat, from as arrayFrom } from '../../../utils/array'
27+
import { getInstanceFromVNode } from '../../../utils/get-instance-from-vnode'
2728
import {
2829
attemptFocus,
2930
closest,
@@ -795,8 +796,8 @@ export const BVTooltip = /*#__PURE__*/ Vue.extend({
795796
// Dropdown shown and hidden events will need to emit
796797
// Note: Dropdown auto-ID happens in a `$nextTick()` after mount
797798
// So the ID lookup would need to be done in a `$nextTick()`
798-
if (target.__vue__) {
799-
target.__vue__[on ? '$on' : '$off'](EVENT_NAME_SHOWN, this.forceHide)
799+
if (getInstanceFromVNode(target)) {
800+
getInstanceFromVNode(target)[on ? '$on' : '$off'](EVENT_NAME_SHOWN, this.forceHide)
800801
}
801802
},
802803
// --- Event handlers ---

src/components/transporter/transporter.spec.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { mount } from '@vue/test-utils'
22
import { waitNT } from '../../../tests/utils'
3+
import { getInstanceFromVNode } from '../../utils/get-instance-from-vnode'
34
import { BVTransporter } from './transporter'
45

56
describe('utils/transporter component', () => {
@@ -43,8 +44,8 @@ describe('utils/transporter component', () => {
4344
const target = document.getElementById('foobar')
4445
expect(target).toBeDefined()
4546
expect(target).not.toBe(null)
46-
expect(target.__vue__).toBeDefined() // Target
47-
expect(target.__vue__.$options.name).toBe('BVTransporterTarget')
47+
expect(getInstanceFromVNode(target)).toBeDefined() // Target
48+
expect(getInstanceFromVNode(target).$options.name).toBe('BVTransporterTarget')
4849
expect(target.tagName).toEqual('DIV')
4950
expect(target.parentElement).toBeDefined()
5051
expect(target.parentElement).toBe(document.body)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { isVue3 } from '../vue'
2+
3+
export const getInstanceFromVNode = vnode =>
4+
isVue3 ? vnode.__vueParentComponent.ctx : vnode.__vue__

0 commit comments

Comments
 (0)