diff --git a/source.js b/source.js index 0631a95..a24a3a0 100644 --- a/source.js +++ b/source.js @@ -4,25 +4,32 @@ export default function makeUniflowComponent (Component, stores) { return class UniflowComponent extends React.Component { constructor () { super() - this.forceUpdate = this.forceUpdate.bind(this) + var storeProps = {} + Object.keys(stores).forEach(key => storeProps[key] = stores[key].state) + this.state = { storeProps } + this.updateStorePropsState = this.updateStorePropsState.bind(this) + } + + updateStorePropsState () { + var storeProps = {} + Object.keys(stores).forEach(key => storeProps[key] = stores[key].state) + this.setState({ storeProps }) } componentDidMount () { Object.keys(stores).forEach(key => { - stores[key].addListener('change', this.forceUpdate) + stores[key].addListener('change', this.updateStorePropsState) }) } componentWillUnmount () { Object.keys(stores).forEach(key => { - stores[key].removeListener('change', this.forceUpdate) + stores[key].removeListener('change', this.updateStorePropsState) }) } render () { - var storeProps = {} - Object.keys(stores).forEach(key => storeProps[key] = stores[key].state) - return + return } } } diff --git a/test.js b/test.js index 1892610..eb941e1 100644 --- a/test.js +++ b/test.js @@ -3,6 +3,7 @@ import should from 'should' import sinon from 'sinon' import React from 'react' +import ReactDOM from 'react-dom' import EventEmitter from 'eventemitter3' import jsdom from 'mocha-jsdom' import make from './source' @@ -15,7 +16,7 @@ function makeMockStore () { return store } -class TestComponent { +class TestComponent extends React.Component { render () { return
} @@ -41,21 +42,21 @@ describe('makeUniflowComponent()', () => { it('subscribes to all props after mounting', () => { let Component = make(TestComponent, {a: storeA, b: storeB}) - React.render(, domNode) + ReactDOM.render(, domNode) sinon.assert.called(storeA.addListener) sinon.assert.called(storeB.addListener) }) it('throws when rendered with non-store props', () => { let Component = make(TestComponent, {a: 'foo'}) - let fn = () => React.render(, domNode) + let fn = () => ReactDOM.render(, domNode) fn.should.throw() }) it('unsubscribes to all props when unmounting', () => { let Component = make(TestComponent, {a: storeA, b: storeB}) - React.render(, domNode) - React.render(
, domNode) + ReactDOM.render(, domNode) + ReactDOM.render(
, domNode) sinon.assert.called(storeA.removeListener) sinon.assert.called(storeB.removeListener) }) @@ -73,13 +74,13 @@ describe('makeUniflowComponent()', () => { b: React.PropTypes.object } let Component = make(Child, {a: storeA, b: storeB}) - React.render(, domNode) + ReactDOM.render(, domNode) }) it('re-renders when any store prop emits change event', () => { let Component = make(TestComponent, {a: storeA}) let render = sinon.spy(Component.prototype, 'render') - React.render(, domNode) + ReactDOM.render(, domNode) sinon.assert.calledOnce(render) storeA.emit('change') sinon.assert.calledTwice(render)