diff --git a/packages/mixins/popup/index.js b/packages/mixins/popup/index.js
index afce5a964..525f0d40c 100644
--- a/packages/mixins/popup/index.js
+++ b/packages/mixins/popup/index.js
@@ -48,8 +48,10 @@ export default {
 
   watch: {
     value(val) {
+      const type = val ? 'open' : 'close';
       this.inited = this.inited || this.value;
-      this[val ? 'open' : 'close']();
+      this[type]();
+      this.$emit(type);
     },
 
     getContainer() {
diff --git a/packages/popup/en-US.md b/packages/popup/en-US.md
index af1ab874f..631303bc1 100644
--- a/packages/popup/en-US.md
+++ b/packages/popup/en-US.md
@@ -54,4 +54,6 @@ Use `position` prop to set popup display position
 
 | Event | Description | Arguments |
 |------|------|------|
+| open | Triggered when open Popup | - |
+| close | Triggered when close Popup | - |
 | click-overlay | Triggered when click overlay | - |
diff --git a/packages/popup/test/index.spec.js b/packages/popup/test/index.spec.js
index 793b8a991..be18b3b6f 100644
--- a/packages/popup/test/index.spec.js
+++ b/packages/popup/test/index.spec.js
@@ -141,3 +141,11 @@ test('close on click modal', () => {
   modal.click();
   expect(wrapper.vm.value).toBeFalsy();
 });
+
+test('oepn & close event', () => {
+  wrapper = mount(Popup);
+  wrapper.vm.value = true;
+  expect(wrapper.emitted('open')).toBeTruthy();
+  wrapper.vm.value = false;
+  expect(wrapper.emitted('close')).toBeTruthy();
+});
diff --git a/packages/popup/zh-CN.md b/packages/popup/zh-CN.md
index 96be4b379..7942ed273 100644
--- a/packages/popup/zh-CN.md
+++ b/packages/popup/zh-CN.md
@@ -54,4 +54,6 @@ export default {
 
 | 事件名 | 说明 | 参数 |
 |------|------|------|
+| open | 打开弹出层时触发 | - |
+| close | 关闭弹出层时触发 | - |
 | click-overlay | 点击蒙层时触发 | - |