From e498a7f1df2018583462c939c1f46141022b257e Mon Sep 17 00:00:00 2001 From: Eiinu Date: Thu, 20 Jul 2023 17:29:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(swipe):=20=E6=96=B0=E5=A2=9E=20SwipeGroup?= =?UTF-8?q?=20(#2439)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/basic/pages/button/index.vue | 19 ++- .../src/feedback/pages/swipe/index.vue | 69 +++++----- src/config.json | 10 ++ .../__VUE/swipe/__tests__/swipe.spec.tsx | 108 ++++++++++++++- src/packages/__VUE/swipe/demo.vue | 85 ++++++------ src/packages/__VUE/swipe/doc.en-US.md | 115 +++++++++------- src/packages/__VUE/swipe/doc.md | 123 +++++++++++------- src/packages/__VUE/swipe/doc.taro.md | 117 ++++++++++------- src/packages/__VUE/swipe/index.scss | 1 + src/packages/__VUE/swipe/index.taro.vue | 79 +++++++---- src/packages/__VUE/swipe/index.vue | 76 +++++++---- src/packages/__VUE/swipegroup/index.scss | 0 src/packages/__VUE/swipegroup/index.taro.vue | 31 +++++ src/packages/__VUE/swipegroup/index.vue | 31 +++++ src/packages/utils/unit.ts | 7 + 15 files changed, 593 insertions(+), 278 deletions(-) create mode 100644 src/packages/__VUE/swipegroup/index.scss create mode 100644 src/packages/__VUE/swipegroup/index.taro.vue create mode 100644 src/packages/__VUE/swipegroup/index.vue diff --git a/packages/nutui-taro-demo/src/basic/pages/button/index.vue b/packages/nutui-taro-demo/src/basic/pages/button/index.vue index 717d01d258..44ec05a7aa 100644 --- a/packages/nutui-taro-demo/src/basic/pages/button/index.vue +++ b/packages/nutui-taro-demo/src/basic/pages/button/index.vue @@ -103,18 +103,25 @@ export default { diff --git a/packages/nutui-taro-demo/src/feedback/pages/swipe/index.vue b/packages/nutui-taro-demo/src/feedback/pages/swipe/index.vue index 91649e0d33..31e742a9d4 100644 --- a/packages/nutui-taro-demo/src/feedback/pages/swipe/index.vue +++ b/packages/nutui-taro-demo/src/feedback/pages/swipe/index.vue @@ -26,13 +26,9 @@ 收藏 -

异步控制

- - - - +

异步控制

+ + @@ -52,38 +48,45 @@ 收藏 +

使用 SwipeGroup 控制 Swipe 之间互斥

+ + + + + + + + + +
+ + + + +
+
- - - diff --git a/src/config.json b/src/config.json index be404b6214..66787dbd91 100644 --- a/src/config.json +++ b/src/config.json @@ -663,6 +663,16 @@ "show": true, "author": "richard1015" }, + { + "name": "SwipeGroup", + "taro": true, + "cName": "滑动手势", + "type": "component", + "show": false, + "exportEmpty": true, + "desc": "Swipe 的集合,用于控制互斥", + "author": "eiinu" + }, { "version": "3.0.0", "name": "ActionSheet", diff --git a/src/packages/__VUE/swipe/__tests__/swipe.spec.tsx b/src/packages/__VUE/swipe/__tests__/swipe.spec.tsx index 088c4377d3..c3124dbe0a 100644 --- a/src/packages/__VUE/swipe/__tests__/swipe.spec.tsx +++ b/src/packages/__VUE/swipe/__tests__/swipe.spec.tsx @@ -1,16 +1,18 @@ import { DOMWrapper, mount } from '@vue/test-utils'; import Swipe from '../index.vue'; +import SwipeGroup from '../../swipegroup/index.vue'; import { nextTick } from 'vue'; import Button from '../../button/index.vue'; import Cell from '../../cell/index.vue'; +import { triggerDrag, mockGetBoundingClientRect } from '@/packages/utils/unit'; -test('base swipe', () => { +test('Swipe: base swipe', () => { const wrapper = mount(Swipe); const swipe: DOMWrapper = wrapper.find('.nut-swipe'); expect(swipe.exists()).toBe(true); }); -test('base swipe props disabled', async () => { +test('Swipe: base swipe props disabled', async () => { const wrapper = mount(() => { return ( @@ -37,7 +39,7 @@ test('base swipe props disabled', async () => { expect(swipe1.text()).toBe('删除'); expect(swipe2.exists()).toBe(true); }); -test('base swipe Slots', async () => { +test('Swipe: base swipe Slots', async () => { const wrapper = mount(() => ( {{ @@ -56,7 +58,7 @@ test('base swipe Slots', async () => { expect(swipe.text()).toBe('选择'); expect(swipe2.exists()).toBe(true); }); -test('base swipe content', async () => { +test('Swipe: base swipe content', async () => { const wrapper = mount(() => ( @@ -69,3 +71,101 @@ test('base swipe content', async () => { expect(swipe2.text()).toBe('左滑右滑都可以哦'); expect(swipe3.exists()).toBe(true); }); + +test('Swipe: ref open & close', async () => { + const wrapper = mount(() => ( + + {{ + right: () => '右侧按钮' + }} + + )); + mockGetBoundingClientRect({ width: 99 }); + const swipe = wrapper.getComponent(Swipe); + expect(swipe.element.outerHTML).toContain('translate3d(0'); + swipe.vm.open('left'); + await nextTick(); + expect(swipe.element.outerHTML).toContain('translate3d(-99'); + swipe.vm.close(); + await nextTick(); + expect(swipe.element.outerHTML).toContain('translate3d(0'); +}); + +test('Swipe: ref open & click close', async () => { + const wrapper = mount(() => ( + + {{ + right: () => '右侧按钮' + }} + + )); + mockGetBoundingClientRect({ width: 99 }); + const swipe = wrapper.getComponent(Swipe); + swipe.vm.open('left'); + await nextTick(); + expect(swipe.element.outerHTML).toContain('translate3d(-99'); + wrapper.find('.nut-swipe__content').trigger('click'); + await nextTick(); + expect(swipe.element.outerHTML).toContain('translate3d(0'); +}); + +test('Swipe: touch event right', async () => { + const wrapper = mount(() => ( + + {{ + right: () => '右侧按钮' + }} + + )); + mockGetBoundingClientRect({ width: 99 }); + const swipe = wrapper.getComponent(Swipe); + triggerDrag(wrapper, -10, 0); + await nextTick(); + expect(swipe.element.outerHTML).toContain('translate3d(0'); + triggerDrag(wrapper, -90, 0); + await nextTick(); + expect(swipe.element.outerHTML).toContain('translate3d(-99'); + swipe.vm.close(); + await nextTick(); + expect(swipe.element.outerHTML).toContain('translate3d(0'); +}); + +test('Swipe: touch event left', async () => { + const wrapper = mount(() => ( + + {{ + left: () => '左侧按钮' + }} + + )); + mockGetBoundingClientRect({ width: 99 }); + const swipe = wrapper.getComponent(Swipe); + triggerDrag(wrapper, +10, 0); + await nextTick(); + expect(swipe.element.outerHTML).toContain('translate3d(0'); + triggerDrag(wrapper, +90, 0); + await nextTick(); + expect(swipe.element.outerHTML).toContain('translate3d(99'); + swipe.vm.close(); + await nextTick(); + expect(swipe.element.outerHTML).toContain('translate3d(0'); +}); + +test('Swipe: SwipeGroup lock', async () => { + const wrapper = mount(() => ( + + {{ right: () => '右侧' }} + {{ right: () => '右侧' }} + {{ right: () => '右侧' }} + + )); + mockGetBoundingClientRect({ width: 99 }); + const swipes = wrapper.findAllComponents(Swipe); + triggerDrag(swipes[0], -90, 0); + await nextTick(); + expect(swipes[0].element.outerHTML).toContain('translate3d(-99'); + triggerDrag(swipes[1], -90, 0); + await nextTick(); + expect(swipes[0].element.outerHTML).toContain('translate3d(0'); + expect(swipes[1].element.outerHTML).toContain('translate3d(-99'); +}); diff --git a/src/packages/__VUE/swipe/demo.vue b/src/packages/__VUE/swipe/demo.vue index 5341cffb32..58f00a776d 100644 --- a/src/packages/__VUE/swipe/demo.vue +++ b/src/packages/__VUE/swipe/demo.vue @@ -25,18 +25,12 @@ {{ translate('collect') }}
-

{{ translate('async') }}

- - - - +

+ {{ translate('async') }} + +

+ + @@ -56,11 +50,34 @@ {{ translate('collect') }} +

使用 SwipeGroup 控制 Swipe 之间互斥

+ + + + + + + + + +
+ + + + +
+
- - - diff --git a/src/packages/__VUE/swipe/doc.en-US.md b/src/packages/__VUE/swipe/doc.en-US.md index 0be326d848..dbbfbd4a5a 100644 --- a/src/packages/__VUE/swipe/doc.en-US.md +++ b/src/packages/__VUE/swipe/doc.en-US.md @@ -6,7 +6,7 @@ Used for cell components that can slide left and right to display operation butt ## Install -```javascript +```js import { createApp } from 'vue'; import { Swipe } from '@nutui/nutui'; @@ -20,7 +20,7 @@ app.use(Swipe); :::demo -```html +```vue