ctrlplusb/react-async-component

Error walking your react tree

gurnzbot opened this issue · 1 comments

I am attempting to use this library for SSR.

I go to the route that loads the only async component I have in my app at the moment, and get the following error in the server console:

TypeError: _this.context.asyncComponents.getNextId is not a function
    at new AsyncComponent (/Users/markcampbell/Desktop/Mercury React Cart/node_modules/react-async-component/commonjs/asyncComponent.js:94:56)
    at /Users/markcampbell/Desktop/Mercury React Cart/node_modules/react-tree-walker/commonjs/index.js:131:24
    at new Promise (<anonymous>)
    at reactTreeWalker (/Users/markcampbell/Desktop/Mercury React Cart/node_modules/react-tree-walker/commonjs/index.js:70:10)
    at mapper (/Users/markcampbell/Desktop/Mercury React Cart/node_modules/react-tree-walker/commonjs/index.js:88:29)
    at /Users/markcampbell/Desktop/Mercury React Cart/node_modules/react-tree-walker/commonjs/index.js:52:28
    at /Users/markcampbell/Desktop/Mercury React Cart/node_modules/react-tree-walker/commonjs/index.js:38:14
    at <anonymous>
(node:32826) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: _this.context.asyncComponents.getNextId is not a function
(node:32826) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Routes.js


const Home = asyncComponent({
	resolve: () => import("../components/home/Home")
});

export default [
	{
		path: "/",
		exact: true,
		component: Home
	}
];

Home.js

import { connect } from "react-redux";

// Components
import Banners from "./Banners";
import Promos from "./Promos";

// Banners state
import { getBanners } from "../../store/actions/banners";

class Home extends Component {
	static initialAction(store, props) {
		let res = store !== null ? getBanners() : props.getBanners();
		return res;
	}

	componentDidMount() {
		// console.log('HOME BANNERS:', this.props.banners, !this.props.banners)
		if (!this.props.banners) {
			Home.initialAction(null, this.props);
		}
	}

	render() {
		return (
			<div>
				<Banners />
				<Promos />
			</div>
		);
	}
}

const mapStateToProps = state => {
	return {
		banners: state.banners.banners
	};
};

export default connect(mapStateToProps, { getBanners })(Home);

I'm guessing it's because of the initialAction static function that preloads any data necessary from the store...??

Any help is more than welcome :)

It looks like you are trying to preload some data. You could write your own implementation to do this using react-async-bootstrapper (which supports react-async-component), or you could alternatively use my library react-jobs to achieve something similar. I am updating react-async-component and react-jobs to use the new versions of react-async-bootstrapper though, so just a friendly heads up there. 👍