|
| 1 | +import { Shortcuts } from '@tarojs/shared' |
1 | 2 | import { afterAll, describe, expect, test, vi } from 'vitest' |
2 | 3 |
|
3 | | -import { EVENT_CALLBACK_RESULT } from '../src/constants' |
| 4 | +import { EVENT_CALLBACK_RESULT, PURE_VIEW } from '../src/constants' |
4 | 5 | import { eventHandler } from '../src/dom/event' |
5 | 6 | import * as runtime from '../src/index' |
| 7 | +import { getComponentsAlias } from '../src/utils' |
6 | 8 |
|
7 | 9 | describe('event', () => { |
8 | 10 | const document = runtime.document |
@@ -121,6 +123,72 @@ describe('event', () => { |
121 | 123 | }).not.toThrow() |
122 | 124 | }) |
123 | 125 |
|
| 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 | + |
124 | 192 | test('可以阻止冒泡', () => { |
125 | 193 | const container = document.createElement('container') |
126 | 194 | const div = document.createElement('div') |
|
0 commit comments