mirror of
https://gitee.com/vant-contrib/vant-weapp.git
synced 2025-05-20 21:49:14 +08:00
feat(dropdown-menu): support use-before-toggle support (#5190)
This commit is contained in:
parent
d14ac6027a
commit
965734328c
@ -30,6 +30,10 @@ VantComponent({
|
|||||||
observer: 'rerender',
|
observer: 'rerender',
|
||||||
},
|
},
|
||||||
popupStyle: String,
|
popupStyle: String,
|
||||||
|
useBeforeToggle: {
|
||||||
|
type: Boolean,
|
||||||
|
value: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
data: {
|
data: {
|
||||||
@ -109,19 +113,39 @@ VantComponent({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setData({
|
this.onBeforeToggle(show).then((status) => {
|
||||||
transition: !options.immediate,
|
if (!status) {
|
||||||
showPopup: show,
|
return;
|
||||||
});
|
}
|
||||||
|
|
||||||
if (show) {
|
this.setData({
|
||||||
this.parent?.getChildWrapperStyle().then((wrapperStyle: string) => {
|
transition: !options.immediate,
|
||||||
this.setData({ wrapperStyle, showWrapper: true });
|
showPopup: show,
|
||||||
this.rerender();
|
|
||||||
});
|
});
|
||||||
} 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<boolean> {
|
||||||
|
const { useBeforeToggle } = this.data;
|
||||||
|
|
||||||
|
if (!useBeforeToggle) {
|
||||||
|
return Promise.resolve(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
this.$emit('before-toggle', {
|
||||||
|
status,
|
||||||
|
callback: (value: boolean) => resolve(value),
|
||||||
|
});
|
||||||
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -135,6 +135,42 @@ Page({
|
|||||||
</van-dropdown-menu>
|
</van-dropdown-menu>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 异步打开/关闭
|
||||||
|
|
||||||
|
通过 `before-toggle` 事件可以在下拉菜单打开或者关闭前执行特定的逻辑,实现状态变更前校验、异步打开/关闭的目的
|
||||||
|
|
||||||
|
```html
|
||||||
|
<van-dropdown-menu>
|
||||||
|
<van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" use-before-toggle bind:before-toggle="onBeforeChange" />
|
||||||
|
</van-dropdown-menu>
|
||||||
|
```
|
||||||
|
|
||||||
|
```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
|
## API
|
||||||
|
|
||||||
### DropdownMenu Props
|
### DropdownMenu Props
|
||||||
@ -159,6 +195,7 @@ Page({
|
|||||||
| disabled | 是否禁用菜单 | _boolean_ | `false` |
|
| disabled | 是否禁用菜单 | _boolean_ | `false` |
|
||||||
| title-class | 标题额外类名,建议使用自定义样式 item-title-class 代替 | _string_ | - |
|
| title-class | 标题额外类名,建议使用自定义样式 item-title-class 代替 | _string_ | - |
|
||||||
| popup-style | 自定义弹出层样式 | _string_ | - |
|
| popup-style | 自定义弹出层样式 | _string_ | - |
|
||||||
|
| use-before-toggle `v1.10.12` | 是否开启下拉菜单打开或者关闭前校验 | _boolean_ | `false` |
|
||||||
|
|
||||||
### DropdownItem Events
|
### DropdownItem Events
|
||||||
|
|
||||||
@ -169,6 +206,7 @@ Page({
|
|||||||
| close | 关闭菜单栏时触发 | - |
|
| close | 关闭菜单栏时触发 | - |
|
||||||
| opened | 打开菜单栏且动画结束后触发 | - |
|
| opened | 打开菜单栏且动画结束后触发 | - |
|
||||||
| closed | 关闭菜单栏且动画结束后触发 | - |
|
| closed | 关闭菜单栏且动画结束后触发 | - |
|
||||||
|
| before-toggle `v1.10.12` | 下拉菜单打开或者关闭前触发,需要将`use-before-toggle`属性设置为`true` | `event.detail.status`: `true` 打开下拉菜单,`false` 关闭下拉菜单 <br>`event.detail.callback`: 回调函数,调用`callback(false)`终止下拉菜单状态变更 |
|
||||||
|
|
||||||
### DropdownItem 方法
|
### DropdownItem 方法
|
||||||
|
|
||||||
|
@ -33,5 +33,18 @@ VantComponent({
|
|||||||
onSwitch2Change({ detail }) {
|
onSwitch2Change({ detail }) {
|
||||||
this.setData({ switch2: 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);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -59,3 +59,9 @@
|
|||||||
</van-dropdown-menu>
|
</van-dropdown-menu>
|
||||||
</demo-block>
|
</demo-block>
|
||||||
|
|
||||||
|
<demo-block custom-class="white" title="异步打开/关闭">
|
||||||
|
<van-dropdown-menu>
|
||||||
|
<van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" use-before-toggle bind:before-toggle="onBeforeChange" />
|
||||||
|
</van-dropdown-menu>
|
||||||
|
</demo-block>
|
||||||
|
|
||||||
|
@ -289,5 +289,45 @@ exports[`should render demo and match snapshot 1`] = `
|
|||||||
</van-dropdown-menu>
|
</van-dropdown-menu>
|
||||||
</wx-view>
|
</wx-view>
|
||||||
</demo-block>
|
</demo-block>
|
||||||
|
<demo-block
|
||||||
|
customClass="white"
|
||||||
|
>
|
||||||
|
<wx-view
|
||||||
|
class="custom-class demo-block van-clearfix "
|
||||||
|
>
|
||||||
|
<wx-view
|
||||||
|
class="demo-block__title"
|
||||||
|
>
|
||||||
|
异步打开/关闭
|
||||||
|
</wx-view>
|
||||||
|
<van-dropdown-menu>
|
||||||
|
<wx-view
|
||||||
|
class="van-dropdown-menu van-dropdown-menu--top-bottom custom-class"
|
||||||
|
>
|
||||||
|
<wx-view
|
||||||
|
class="van-dropdown-menu__item"
|
||||||
|
data-index="{{0}}"
|
||||||
|
bind:tap="onTitleTap"
|
||||||
|
>
|
||||||
|
<wx-view
|
||||||
|
class=" van-dropdown-menu__title title-class"
|
||||||
|
style=""
|
||||||
|
>
|
||||||
|
<wx-view
|
||||||
|
class="van-ellipsis"
|
||||||
|
>
|
||||||
|
|
||||||
|
全部商品
|
||||||
|
|
||||||
|
</wx-view>
|
||||||
|
</wx-view>
|
||||||
|
</wx-view>
|
||||||
|
<van-dropdown-item
|
||||||
|
bind:before-toggle="onBeforeChange"
|
||||||
|
/>
|
||||||
|
</wx-view>
|
||||||
|
</van-dropdown-menu>
|
||||||
|
</wx-view>
|
||||||
|
</demo-block>
|
||||||
</main>
|
</main>
|
||||||
`;
|
`;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user