From 965734328cf60fda1aa3b3f3a72d651cb9450ae4 Mon Sep 17 00:00:00 2001 From: landluck Date: Wed, 11 Jan 2023 17:39:13 +0800 Subject: [PATCH] feat(dropdown-menu): support use-before-toggle support (#5190) --- packages/dropdown-item/index.ts | 44 ++++++++++++++----- packages/dropdown-menu/README.md | 38 ++++++++++++++++ packages/dropdown-menu/demo/index.ts | 13 ++++++ packages/dropdown-menu/demo/index.wxml | 6 +++ .../test/__snapshots__/demo.spec.ts.snap | 40 +++++++++++++++++ 5 files changed, 131 insertions(+), 10 deletions(-) diff --git a/packages/dropdown-item/index.ts b/packages/dropdown-item/index.ts index 2137b69c..7a5f5b81 100644 --- a/packages/dropdown-item/index.ts +++ b/packages/dropdown-item/index.ts @@ -30,6 +30,10 @@ VantComponent({ observer: 'rerender', }, popupStyle: String, + useBeforeToggle: { + type: Boolean, + value: false, + }, }, data: { @@ -109,19 +113,39 @@ VantComponent({ return; } - this.setData({ - transition: !options.immediate, - showPopup: show, - }); + this.onBeforeToggle(show).then((status) => { + if (!status) { + return; + } - if (show) { - this.parent?.getChildWrapperStyle().then((wrapperStyle: string) => { - this.setData({ wrapperStyle, showWrapper: true }); - this.rerender(); + this.setData({ + transition: !options.immediate, + showPopup: show, }); - } else { - this.rerender(); + + if (show) { + this.parent?.getChildWrapperStyle().then((wrapperStyle: string) => { + this.setData({ wrapperStyle, showWrapper: true }); + this.rerender(); + }); + } else { + this.rerender(); + } + }); + }, + onBeforeToggle(status: boolean): Promise { + const { useBeforeToggle } = this.data; + + if (!useBeforeToggle) { + return Promise.resolve(true); } + + return new Promise((resolve) => { + this.$emit('before-toggle', { + status, + callback: (value: boolean) => resolve(value), + }); + }); }, }, }); diff --git a/packages/dropdown-menu/README.md b/packages/dropdown-menu/README.md index 5be11065..401dc7d8 100644 --- a/packages/dropdown-menu/README.md +++ b/packages/dropdown-menu/README.md @@ -135,6 +135,42 @@ Page({ ``` +### 异步打开/关闭 + +通过 `before-toggle` 事件可以在下拉菜单打开或者关闭前执行特定的逻辑,实现状态变更前校验、异步打开/关闭的目的 + +```html + + + +``` + +```js +Page({ + data: { + value1: 0, + option1: [ + { text: '全部商品', value: 0 }, + { text: '新款商品', value: 1 }, + { text: '活动商品', value: 2 }, + ], + }, + onBeforeChange({ detail: { status, callback }}) { + wx.showModal({ + title: '异步打开/关闭', + content: `确定要${status ? '打开' : '关闭'}下拉菜单吗?`, + success: (res) => { + if (res.confirm) { + callback(true) + } else if (res.cancel) { + callback(false) + } + }, + }) + } +}); +``` + ## API ### DropdownMenu Props @@ -159,6 +195,7 @@ Page({ | disabled | 是否禁用菜单 | _boolean_ | `false` | | title-class | 标题额外类名,建议使用自定义样式 item-title-class 代替 | _string_ | - | | popup-style | 自定义弹出层样式 | _string_ | - | +| use-before-toggle `v1.10.12` | 是否开启下拉菜单打开或者关闭前校验 | _boolean_ | `false` | ### DropdownItem Events @@ -169,6 +206,7 @@ Page({ | close | 关闭菜单栏时触发 | - | | opened | 打开菜单栏且动画结束后触发 | - | | closed | 关闭菜单栏且动画结束后触发 | - | +| before-toggle `v1.10.12` | 下拉菜单打开或者关闭前触发,需要将`use-before-toggle`属性设置为`true` | `event.detail.status`: `true` 打开下拉菜单,`false` 关闭下拉菜单
`event.detail.callback`: 回调函数,调用`callback(false)`终止下拉菜单状态变更 | ### DropdownItem 方法 diff --git a/packages/dropdown-menu/demo/index.ts b/packages/dropdown-menu/demo/index.ts index 87bf1782..a7523459 100644 --- a/packages/dropdown-menu/demo/index.ts +++ b/packages/dropdown-menu/demo/index.ts @@ -33,5 +33,18 @@ VantComponent({ onSwitch2Change({ detail }) { this.setData({ switch2: detail }); }, + onBeforeChange({ detail: { status, callback } }) { + wx.showModal({ + title: '异步打开/关闭', + content: `确定要${status ? '打开' : '关闭'}下拉菜单吗?`, + success: (res) => { + if (res.confirm) { + callback(true); + } else if (res.cancel) { + callback(false); + } + }, + }); + }, }, }); diff --git a/packages/dropdown-menu/demo/index.wxml b/packages/dropdown-menu/demo/index.wxml index a60cae2b..b2f0eee3 100644 --- a/packages/dropdown-menu/demo/index.wxml +++ b/packages/dropdown-menu/demo/index.wxml @@ -59,3 +59,9 @@ + + + + + + diff --git a/packages/dropdown-menu/test/__snapshots__/demo.spec.ts.snap b/packages/dropdown-menu/test/__snapshots__/demo.spec.ts.snap index 116138a2..45c71f4e 100644 --- a/packages/dropdown-menu/test/__snapshots__/demo.spec.ts.snap +++ b/packages/dropdown-menu/test/__snapshots__/demo.spec.ts.snap @@ -289,5 +289,45 @@ exports[`should render demo and match snapshot 1`] = ` + + + + 异步打开/关闭 + + + + + + + + 全部商品 + + + + + + + + + `;