Skip to content

Commit

Permalink
Adds react15CompatibilityMode setting (#540)
Browse files Browse the repository at this point in the history
* Adds react15CompatibilityMode setting as temporary fix for #525

* Remove Provider API for react15CompatibilityMode.

* Fix tests against react15CompatibilityMode.

* adds defaultReact15CompatibilityMode setting and setDefaultReact15CompatibilityMode function.
  • Loading branch information
jimbolla authored and timdorr committed Nov 28, 2016
1 parent 582b17f commit f41df99
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 7 deletions.
32 changes: 28 additions & 4 deletions src/components/connectAdvanced.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { Component, PropTypes, createElement } from 'react'
import Subscription from '../utils/Subscription'
import storeShape from '../utils/storeShape'


let defaultReact15CompatibilityMode = true
let hotReloadingVersion = 0
export default function connectAdvanced(
/*
Expand All @@ -18,7 +20,7 @@ export default function connectAdvanced(
Access to dispatch is provided to the factory so selectorFactories can bind actionCreators
outside of their selector as an optimization. Options passed to connectAdvanced are passed to
the selectorFactory, along with displayName and WrappedComponent, as the second argument.
the selectorFactory, along with displayName and WrappedComponent, as the second argument.
Note that selectorFactory is responsible for all caching/memoization of inbound and outbound
props. Do not use connectAdvanced directly without memoizing results between calls to your
Expand All @@ -35,6 +37,9 @@ export default function connectAdvanced(
// probably overridden by wrapper functions such as connect()
methodName = 'connectAdvanced',

// temporary compatibility setting for React 15. See Connect constructor for details
react15CompatibilityMode = undefined,

// if defined, the name of the property passed to the wrapped element indicating the number of
// calls to render. useful for watching in react devtools for unnecessary re-renders.
renderCountProp = undefined,
Expand All @@ -57,11 +62,12 @@ export default function connectAdvanced(

const contextTypes = {
[storeKey]: storeShape,
[subscriptionKey]: PropTypes.instanceOf(Subscription)
[subscriptionKey]: PropTypes.instanceOf(Subscription),
react15CompatibilityMode: PropTypes.bool,
}
const childContextTypes = {
[subscriptionKey]: PropTypes.instanceOf(Subscription)
}
}

return function wrapWithConnect(WrappedComponent) {
invariant(
Expand Down Expand Up @@ -97,7 +103,19 @@ export default function connectAdvanced(
this.state = {}
this.renderCount = 0
this.store = this.props[storeKey] || this.context[storeKey]
this.parentSub = this.props[subscriptionKey] || this.context[subscriptionKey]

// react15CompatibilityMode controls whether the subscription system is used. This is for
// https://github.com/reactjs/react-redux/issues/525 and should be removed completely when
// react-redux's dependency on react is bumped to mimimum v16, which is expected to include
// PR https://github.com/facebook/react/pull/8204 which fixes the issue.
const compatMode = [
react15CompatibilityMode,
props.react15CompatibilityMode,
context.react15CompatibilityMode,
defaultReact15CompatibilityMode
].find(cm => cm !== undefined && cm !== null)
this.parentSub = compatMode ? null : props[subscriptionKey] || context[subscriptionKey]

this.setWrappedInstance = this.setWrappedInstance.bind(this)

invariant(this.store,
Expand Down Expand Up @@ -257,3 +275,9 @@ export default function connectAdvanced(
return hoistStatics(Connect, WrappedComponent)
}
}

connectAdvanced.setDefaultReact15CompatibilityMode =
function setDefaultReact15CompatibilityMode(compat) {
defaultReact15CompatibilityMode = compat
}

4 changes: 3 additions & 1 deletion src/connect/connect.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,6 @@ export function createConnect({
}
}

export default createConnect()
const connect = createConnect()
connect.setDefaultReact15CompatibilityMode = connectAdvanced.setDefaultReact15CompatibilityMode
export default connect
2 changes: 1 addition & 1 deletion test/components/Provider.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ describe('React', () => {
// The state from parent props should always be consistent with the current state
expect(state).toEqual(parentProps.parentState)
return {}
})
}, null, null, { react15CompatibilityMode: false })
class ChildContainer extends Component {
render() {
return <div />
Expand Down
2 changes: 1 addition & 1 deletion test/components/connect.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -1697,7 +1697,7 @@ describe('React', () => {
// The state from parent props should always be consistent with the current state
expect(state).toEqual(parentProps.parentState)
return {}
})
}, null, null, { react15CompatibilityMode: false })
class ChildContainer extends Component {
render() {
return <Passthrough {...this.props}/>
Expand Down

0 comments on commit f41df99

Please sign in to comment.