Skip to content

Commit dd4f0fb

Browse files
Jarvis636431mengda.6364
andauthored
fix(runtime): correct alias after removing event listener (#19459)
Co-authored-by: mengda.6364 <mengda.6364@jd.com>
1 parent 25bd514 commit dd4f0fb

2 files changed

Lines changed: 70 additions & 2 deletions

File tree

packages/taro-runtime/src/dom/element.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ export class TaroElement extends TaroNode {
386386

387387
if (sideEffect !== false && !this.isAnyEventBinded() && SPECIAL_NODES.indexOf(name) > -1) {
388388
const componentsAlias = getComponentsAlias()
389-
const value = isHasExtractProp(this) ? `static-${name}` : `pure-${name}`
389+
const value = name === VIEW && !isHasExtractProp(this) ? PURE_VIEW : `static-${name}`
390390
const valueAlias = componentsAlias[value]._num
391391
this.enqueueUpdate({
392392
path: `${this._path}.${Shortcuts.NodeName}`,

packages/taro-runtime/tests/event.spec.ts

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import { Shortcuts } from '@tarojs/shared'
12
import { afterAll, describe, expect, test, vi } from 'vitest'
23

3-
import { EVENT_CALLBACK_RESULT } from '../src/constants'
4+
import { EVENT_CALLBACK_RESULT, PURE_VIEW } from '../src/constants'
45
import { eventHandler } from '../src/dom/event'
56
import * as runtime from '../src/index'
7+
import { getComponentsAlias } from '../src/utils'
68

79
describe('event', () => {
810
const document = runtime.document
@@ -121,6 +123,72 @@ describe('event', () => {
121123
}).not.toThrow()
122124
})
123125

126+
test.each([
127+
['text', 'static-text'],
128+
['image', 'static-image']
129+
])('移除 %s 的最后一个事件监听后切换为 %s', (nodeName, aliasName) => {
130+
const element = document.createElement(nodeName)
131+
const handler = vi.fn()
132+
const enqueueUpdate = vi.spyOn(element, 'enqueueUpdate')
133+
134+
element.addEventListener('tap', handler)
135+
enqueueUpdate.mockClear()
136+
137+
expect(() => element.removeEventListener('tap', handler)).not.toThrow()
138+
expect(enqueueUpdate).toHaveBeenCalledOnce()
139+
expect(enqueueUpdate).toHaveBeenCalledWith({
140+
path: `${element._path}.${Shortcuts.NodeName}`,
141+
value: getComponentsAlias()[aliasName]._num
142+
})
143+
})
144+
145+
test('移除无提取属性 view 的最后一个事件监听后切换为 pure-view', () => {
146+
const view = document.createElement('view')
147+
const handler = vi.fn()
148+
const enqueueUpdate = vi.spyOn(view, 'enqueueUpdate')
149+
150+
view.addEventListener('tap', handler)
151+
enqueueUpdate.mockClear()
152+
view.removeEventListener('tap', handler)
153+
154+
expect(enqueueUpdate).toHaveBeenCalledOnce()
155+
expect(enqueueUpdate).toHaveBeenCalledWith({
156+
path: `${view._path}.${Shortcuts.NodeName}`,
157+
value: getComponentsAlias()[PURE_VIEW]._num
158+
})
159+
})
160+
161+
test('移除有提取属性 view 的最后一个事件监听后切换为 static-view', () => {
162+
const view = document.createElement('view')
163+
const handler = vi.fn()
164+
const enqueueUpdate = vi.spyOn(view, 'enqueueUpdate')
165+
166+
view.setAttribute('hover-class', 'hover')
167+
view.addEventListener('tap', handler)
168+
enqueueUpdate.mockClear()
169+
view.removeEventListener('tap', handler)
170+
171+
expect(enqueueUpdate).toHaveBeenCalledOnce()
172+
expect(enqueueUpdate).toHaveBeenCalledWith({
173+
path: `${view._path}.${Shortcuts.NodeName}`,
174+
value: getComponentsAlias()['static-view']._num
175+
})
176+
})
177+
178+
test('移除其中一个事件监听时不会切换节点模板', () => {
179+
const text = document.createElement('text')
180+
const handler = vi.fn()
181+
const anotherHandler = vi.fn()
182+
const enqueueUpdate = vi.spyOn(text, 'enqueueUpdate')
183+
184+
text.addEventListener('tap', handler)
185+
text.addEventListener('tap', anotherHandler)
186+
enqueueUpdate.mockClear()
187+
text.removeEventListener('tap', handler)
188+
189+
expect(enqueueUpdate).not.toHaveBeenCalled()
190+
})
191+
124192
test('可以阻止冒泡', () => {
125193
const container = document.createElement('container')
126194
const div = document.createElement('div')

0 commit comments

Comments
 (0)