diff --git a/.gitignore b/.gitignore index b3ad8dc84..251f3eb95 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ test/**/lcov.info test/**/lcov-report test/react/*/test/**/*.spec.js test/react/**/src +test/jest-config.json lcov.info lib/core/metadata.js diff --git a/src/components/connectAdvanced.js b/src/components/connectAdvanced.js index 2aeb9b4a4..d074b8c42 100644 --- a/src/components/connectAdvanced.js +++ b/src/components/connectAdvanced.js @@ -120,7 +120,6 @@ export default function connectAdvanced( const { pure } = connectOptions let OuterBaseComponent = Component - let FinalWrappedComponent = WrappedComponent if (pure) { OuterBaseComponent = PureComponent @@ -131,15 +130,25 @@ export default function connectAdvanced( let lastState let lastDerivedProps let lastStore + let lastSelectorFactoryOptions let sourceSelector - return function selectDerivedProps(state, props, store) { + return function selectDerivedProps( + state, + props, + store, + selectorFactoryOptions + ) { if (pure && lastProps === props && lastState === state) { return lastDerivedProps } - if (store !== lastStore) { + if ( + store !== lastStore || + lastSelectorFactoryOptions !== selectorFactoryOptions + ) { lastStore = store + lastSelectorFactoryOptions = selectorFactoryOptions sourceSelector = selectorFactory( store.dispatch, selectorFactoryOptions @@ -157,14 +166,23 @@ export default function connectAdvanced( } function makeChildElementSelector() { - let lastChildProps, lastForwardRef, lastChildElement + let lastChildProps, lastForwardRef, lastChildElement, lastComponent - return function selectChildElement(childProps, forwardRef) { - if (childProps !== lastChildProps || forwardRef !== lastForwardRef) { + return function selectChildElement( + WrappedComponent, + childProps, + forwardRef + ) { + if ( + childProps !== lastChildProps || + forwardRef !== lastForwardRef || + lastComponent !== WrappedComponent + ) { lastChildProps = childProps lastForwardRef = forwardRef + lastComponent = WrappedComponent lastChildElement = ( - + ) } @@ -182,7 +200,14 @@ export default function connectAdvanced( ) this.selectDerivedProps = makeDerivedPropsSelector() this.selectChildElement = makeChildElementSelector() - this.renderWrappedComponent = this.renderWrappedComponent.bind(this) + this.indirectRenderWrappedComponent = this.indirectRenderWrappedComponent.bind( + this + ) + } + + indirectRenderWrappedComponent(value) { + // calling renderWrappedComponent on prototype from indirectRenderWrappedComponent bound to `this` + return this.renderWrappedComponent(value) } renderWrappedComponent(value) { @@ -206,10 +231,15 @@ export default function connectAdvanced( let derivedProps = this.selectDerivedProps( storeState, wrapperProps, - store + store, + selectorFactoryOptions ) - return this.selectChildElement(derivedProps, forwardedRef) + return this.selectChildElement( + WrappedComponent, + derivedProps, + forwardedRef + ) } render() { @@ -222,7 +252,7 @@ export default function connectAdvanced( return ( - {this.renderWrappedComponent} + {this.indirectRenderWrappedComponent} ) } diff --git a/test/run-tests.js b/test/run-tests.js index 640a79d4a..9830503b5 100644 --- a/test/run-tests.js +++ b/test/run-tests.js @@ -1,4 +1,6 @@ const npmRun = require('npm-run') +const fs = require('fs') +const path = require('path') const LATEST_VERSION = '16.6' const version = process.env.REACT || LATEST_VERSION @@ -27,7 +29,13 @@ if (version.toLowerCase() === 'all') { } } +const configFilePath = path.join(__dirname, 'jest-config.json') + +fs.writeFileSync(configFilePath, JSON.stringify(jestConfig)) + +const commandLine = `jest -c "${configFilePath}" ${process.argv.slice(2).join(' ')}` + npmRun.execSync( - `jest -c '${JSON.stringify(jestConfig)}' ${process.argv.slice(2).join(' ')}`, + commandLine, { stdio: 'inherit' } )