Skip to content

Commit

Permalink
Prevent setState call if Popover is unmounted
Browse files Browse the repository at this point in the history
  • Loading branch information
cpylua committed May 26, 2017
1 parent c52048a commit b2e36a6
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 17 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ lib/
node_modules/
node_modules.tar
*.log
npm-debug.log*
coverage
packages/*/coverage
.vscode/
Expand Down
29 changes: 13 additions & 16 deletions packages/zent/__tests__/popover.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,6 @@ describe('Popover', () => {
expect(
document.querySelectorAll('.zent-popover-content div')[1].textContent
).toBe('line two');
simulateWithTimers(wrapper.find('button'), 'click');
expect(wrapper.find('Portal').length).toBe(1);
// NOTE: 只能直接调用close method,无法mock。
wrapper.getNode().close();
expect(wrapper.find('Portal').length).toBe(0);

// HACK: branch window.resize (throttle)
wrapper.find('PopoverContent').getNode().onWindowResize(
Expand All @@ -80,17 +75,19 @@ describe('Popover', () => {
deltaY: 0
}
);
// HACK: throttle
setTimeout(() => {
wrapper.find('PopoverContent').getNode().onWindowResize(
{},
{
deltaX: 10,
deltaY: 10
}
);
}, 160);
jest.runAllTimers();
wrapper.find('PopoverContent').getNode().onWindowResize(
{},
{
deltaX: 10,
deltaY: 10
}
);

simulateWithTimers(wrapper.find('button'), 'click');
expect(wrapper.find('Portal').length).toBe(1);

wrapper.getNode().close();
expect(wrapper.find('Portal').length).toBe(0);
wrapper.unmount();

wrapper = mount(
Expand Down
12 changes: 11 additions & 1 deletion packages/zent/src/popover/Popover.js
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ export default class Popover extends Component {
visible: false
};
}

this.isUnmounted = false;
}

isVisibilityControlled(props) {
Expand Down Expand Up @@ -205,7 +207,7 @@ export default class Popover extends Component {
}

handleBeforeHook(onBefore, beforeHook.length, () => {
this.setState({ visible });
this.safeSetState({ visible });
this.pendingOnBeforeHook = false;
});
}
Expand Down Expand Up @@ -286,6 +288,12 @@ export default class Popover extends Component {
return { trigger, content };
}

safeSetState(updater, callback) {
if (!this.isUnmounted) {
return this.setState(updater, callback);
}
}

componentDidMount() {
const { _zentPopover: popover } = this.context || {};
if (popover && popover.registerDescendant) {
Expand All @@ -310,6 +318,8 @@ export default class Popover extends Component {
if (popover && popover.unregisterDescendant) {
popover.unregisterDescendant(this);
}

this.isUnmounted = true;
}

render() {
Expand Down

0 comments on commit b2e36a6

Please sign in to comment.