diff --git a/src/addons/FluxMixin.js b/src/addons/FluxMixin.js index 9595ef6..0a3cd05 100644 --- a/src/addons/FluxMixin.js +++ b/src/addons/FluxMixin.js @@ -167,8 +167,10 @@ export default function FluxMixin(...args) { let initialStoreState = storeStateGetter(store); let listener = () => { - let state = storeStateGetter(store); - this.setState(state); + if (this.isMounted()) { + let state = storeStateGetter(store); + this.setState(state); + } }; store.addListener('change', listener); diff --git a/src/addons/__tests__/FluxMixin-test.js b/src/addons/__tests__/FluxMixin-test.js index d05c0fe..5cf9c45 100644 --- a/src/addons/__tests__/FluxMixin-test.js +++ b/src/addons/__tests__/FluxMixin-test.js @@ -126,6 +126,33 @@ describe('FluxMixin', () => { ); }); + it('ignores change event after unmounted', () => { + let flux = new Flux(); + flux.getActions('test').getSomething('foo'); + + let getterMap = { + test: store => ({ something: store.state.something }) + }; + let Component = React.createClass({ + mixins: [FluxMixin(getterMap)], + + render() { + return null; + } + }); + + let container = document.createElement('div'); + let component = React.render(, container); + let listener = flux.getStore('test').listeners('change')[0]; + + React.unmountComponentAtNode(container); + + flux.getActions('test').getSomething('bar'); + listener(); + + expect(component.state.something).to.equal('foo'); + }); + it('uses #connectToStores() to get initial state', () => { let flux = new Flux();