Skip to content

Commit 156b1d6

Browse files
jacobmllr95Hiws
andauthored
fix(v-b-toggle): handle component updates on click listeners (#5690)
Co-authored-by: Hiws <rni@nova-c.dk>
1 parent d54b240 commit 156b1d6

File tree

3 files changed

+35
-8
lines changed

3 files changed

+35
-8
lines changed

src/components/navbar/navbar-toggle.spec.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { mount } from '@vue/test-utils'
2-
import { waitNT } from '../../../tests/utils'
2+
import { waitNT, waitRAF } from '../../../tests/utils'
33
import { BNavbarToggle } from './navbar-toggle'
44

55
describe('navbar-toggle', () => {
@@ -106,6 +106,10 @@ describe('navbar-toggle', () => {
106106
target: 'target-7'
107107
}
108108
})
109+
110+
await waitRAF()
111+
await waitNT(wrapper.vm)
112+
109113
let rootClicked = false
110114
const onRootClick = () => {
111115
rootClicked = true

src/directives/toggle/toggle.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ import {
99
isTag,
1010
removeAttr,
1111
removeClass,
12+
requestAF,
1213
setAttr
1314
} from '../../utils/dom'
1415
import { isBrowser } from '../../utils/env'
15-
import { eventOn, eventOff } from '../../utils/events'
16+
import { EVENT_OPTIONS_PASSIVE, eventOn, eventOff } from '../../utils/events'
1617
import { isString } from '../../utils/inspect'
1718
import { keys } from '../../utils/object'
1819

@@ -95,8 +96,8 @@ const getTargets = ({ modifiers, arg, value }, el) => {
9596
const removeClickListener = el => {
9697
const handler = el[BV_TOGGLE_CLICK_HANDLER]
9798
if (handler) {
98-
eventOff(el, 'click', handler)
99-
eventOff(el, 'keydown', handler)
99+
eventOff(el, 'click', handler, EVENT_OPTIONS_PASSIVE)
100+
eventOff(el, 'keydown', handler, EVENT_OPTIONS_PASSIVE)
100101
}
101102
el[BV_TOGGLE_CLICK_HANDLER] = null
102103
}
@@ -116,9 +117,9 @@ const addClickListener = (el, vnode) => {
116117
}
117118
}
118119
el[BV_TOGGLE_CLICK_HANDLER] = handler
119-
eventOn(el, 'click', handler)
120+
eventOn(el, 'click', handler, EVENT_OPTIONS_PASSIVE)
120121
if (isNonStandardTag(el)) {
121-
eventOn(el, 'keydown', handler)
122+
eventOn(el, 'keydown', handler, EVENT_OPTIONS_PASSIVE)
122123
}
123124
}
124125
}
@@ -203,7 +204,11 @@ const handleUpdate = (el, binding, vnode) => {
203204
}
204205

205206
// Add/Update our click listener(s)
206-
addClickListener(el, vnode)
207+
// Wrap in a `requestAF()` to allow any previous
208+
// click handling to occur first
209+
requestAF(() => {
210+
addClickListener(el, vnode)
211+
})
207212

208213
// If targets array has changed, update
209214
if (!looseEqual(targets, el[BV_TOGGLE_TARGETS])) {

src/directives/toggle/toggle.spec.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { mount } from '@vue/test-utils'
2-
import { waitNT } from '../../../tests/utils'
2+
import { waitNT, waitRAF } from '../../../tests/utils'
33
import { VBToggle } from './toggle'
44

55
// Emitted control event for collapse (emitted to collapse)
@@ -29,6 +29,9 @@ describe('v-b-toggle directive', () => {
2929

3030
const wrapper = mount(App)
3131

32+
await waitRAF()
33+
await waitNT(wrapper.vm)
34+
3235
expect(wrapper.vm).toBeDefined()
3336
expect(wrapper.element.tagName).toBe('BUTTON')
3437
expect(spy).not.toHaveBeenCalled()
@@ -72,6 +75,9 @@ describe('v-b-toggle directive', () => {
7275

7376
const wrapper = mount(App)
7477

78+
await waitRAF()
79+
await waitNT(wrapper.vm)
80+
7581
expect(wrapper.vm).toBeDefined()
7682
expect(wrapper.element.tagName).toBe('BUTTON')
7783
expect(spy).not.toHaveBeenCalled()
@@ -113,6 +119,9 @@ describe('v-b-toggle directive', () => {
113119

114120
const wrapper = mount(App)
115121

122+
await waitRAF()
123+
await waitNT(wrapper.vm)
124+
116125
expect(wrapper.vm).toBeDefined()
117126
expect(wrapper.element.tagName).toBe('BUTTON')
118127
expect(spy).not.toHaveBeenCalled()
@@ -154,6 +163,9 @@ describe('v-b-toggle directive', () => {
154163

155164
const wrapper = mount(App)
156165

166+
await waitRAF()
167+
await waitNT(wrapper.vm)
168+
157169
expect(wrapper.vm).toBeDefined()
158170
expect(wrapper.element.tagName).toBe('A')
159171
expect(spy).not.toHaveBeenCalled()
@@ -207,6 +219,9 @@ describe('v-b-toggle directive', () => {
207219
}
208220
})
209221

222+
await waitRAF()
223+
await waitNT(wrapper.vm)
224+
210225
expect(wrapper.vm).toBeDefined()
211226
expect(wrapper.element.tagName).toBe('BUTTON')
212227
expect(spy).not.toHaveBeenCalled()
@@ -279,6 +294,9 @@ describe('v-b-toggle directive', () => {
279294

280295
const wrapper = mount(App)
281296

297+
await waitRAF()
298+
await waitNT(wrapper.vm)
299+
282300
expect(wrapper.vm).toBeDefined()
283301
expect(wrapper.element.tagName).toBe('SPAN')
284302
expect(spy).not.toHaveBeenCalled()

0 commit comments

Comments
 (0)