fix(Popup): should not call before-close when show prop becomes false (#9291)

This commit is contained in:
neverland 2021-08-19 19:24:32 +08:00 committed by GitHub
parent c934710906
commit 91aaddca3d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 19 deletions

View File

@ -1,4 +1,4 @@
import { ref, PropType, reactive, defineComponent } from 'vue'; import { PropType, reactive, defineComponent } from 'vue';
// Utils // Utils
import { import {
@ -68,16 +68,10 @@ export default defineComponent({
cancel: false, cancel: false,
}); });
const popupRef = ref();
const updateShow = (value: boolean) => emit('update:show', value); const updateShow = (value: boolean) => emit('update:show', value);
const close = (action: DialogAction) => { const close = (action: DialogAction) => {
if (popupRef.value) { updateShow(false);
popupRef.value.triggerClose();
} else {
updateShow(false);
}
if (props.callback) { if (props.callback) {
props.callback(action); props.callback(action);
@ -228,7 +222,6 @@ export default defineComponent({
const { width, title, theme, message, className } = props; const { width, title, theme, message, className } = props;
return ( return (
<Popup <Popup
ref={popupRef}
role="dialog" role="dialog"
class={[bem([theme]), className]} class={[bem([theme]), className]}
style={{ width: addUnit(width) }} style={{ width: addUnit(width) }}

View File

@ -215,7 +215,6 @@ test('before close prop', async () => {
expect(wrapper.emitted('close')).toBeFalsy(); expect(wrapper.emitted('close')).toBeFalsy();
await wrapper.setProps({ show: false }); await wrapper.setProps({ show: false });
expect(wrapper.emitted('update:show')![0]).toBeTruthy();
expect(wrapper.emitted('close')![0]).toBeTruthy(); expect(wrapper.emitted('close')![0]).toBeTruthy();
}); });

View File

@ -115,17 +115,15 @@ export default defineComponent({
} }
}; };
const triggerClose = () => {
opened = false;
emit('close');
emit('update:show', false);
};
const close = () => { const close = () => {
if (opened) { if (opened) {
callInterceptor({ callInterceptor({
interceptor: props.beforeClose, interceptor: props.beforeClose,
done: triggerClose, done() {
opened = false;
emit('close');
emit('update:show', false);
},
}); });
} }
}; };
@ -224,12 +222,13 @@ export default defineComponent({
if (value) { if (value) {
open(); open();
} else { } else {
close(); opened = false;
emit('close');
} }
} }
); );
useExpose({ popupRef, triggerClose }); useExpose({ popupRef });
useLockScroll(popupRef, () => props.show && props.lockScroll); useLockScroll(popupRef, () => props.show && props.lockScroll);

View File

@ -230,3 +230,16 @@ test('should allow to prevent close with before-close prop', async () => {
await wrapper.find('.van-overlay').trigger('click'); await wrapper.find('.van-overlay').trigger('click');
expect(wrapper.emitted('update:show')[0]).toEqual([false]); expect(wrapper.emitted('update:show')[0]).toEqual([false]);
}); });
test('should not call before-close when show prop becomes false', async () => {
const beforeClose = jest.fn();
const wrapper = mount(Popup, {
props: {
show: true,
beforeClose,
},
});
await wrapper.setProps({ show: false });
expect(beforeClose).toHaveBeenCalledTimes(0);
});