This repository has been archived by the owner on Jul 11, 2023. It is now read-only.
React Router v4 withTracker
Rorz edited this page Jul 2, 2020
·
12 revisions
Author | @juliaqiuxy |
---|---|
Usage | Triggers a pageview when the route is hit. |
Dependencies | react-router: ^4.0.0 |
For full thread see: #122
import withTracker from './withTracker';
ReactDOM.render(
<Provider store={store}>
<ConnectedRouter history={history}>
<Route component={withTracker(App, { /* additional attributes */ } )} />
</ConnectedRouter>
</Provider>,
document.getElementById('root'),
);
import React, { Component, } from "react";
import GoogleAnalytics from "react-ga";
GoogleAnalytics.initialize("UA-0000000-0");
const withTracker = (WrappedComponent, options = {}) => {
const trackPage = page => {
GoogleAnalytics.set({
page,
...options,
});
GoogleAnalytics.pageview(page);
};
// eslint-disable-next-line
const HOC = class extends Component {
componentDidMount() {
// eslint-disable-next-line
const page = this.props.location.pathname + this.props.location.search;
trackPage(page);
}
componentDidUpdate(prevProps) {
const currentPage =
prevProps.location.pathname + prevProps.location.search;
const nextPage =
this.props.location.pathname + this.props.location.search;
if (currentPage !== nextPage) {
trackPage(nextPage);
}
}
render() {
return <WrappedComponent {...this.props} />;
}
};
return HOC;
};
export default withTracker;
With react hooks:
import React, { useEffect } from "react";
import ReactGA from "react-ga";
ReactGA.initialize("UA-0000000-0");
export default (WrappedComponent, options = {}) => {
const trackPage = page => {
ReactGA.set({
page,
...options
});
ReactGA.pageview(page);
};
const HOC = props => {
useEffect(() => trackPage(props.location.pathname), [
props.location.pathname
]);
return <WrappedComponent {...props} />;
};
return HOC;
};
React Hooks [TypeScript]
import React, { useEffect } from "react";
import ReactGA, { FieldsObject } from "react-ga";
import { RouteComponentProps } from "react-router-dom";
ReactGA.initialize("UA-0000000-0");
export default <P extends RouteComponentProps>(
WrappedComponent: React.ComponentType<P>,
options: FieldsObject = {},
) => {
const trackPage = (page: string) => {
ReactGA.set({ page, ...options });
ReactGA.pageview(page);
};
return (props: P) => {
useEffect(() => {
trackPage(props.location.pathname);
}, [props.location.pathname]);
return <WrappedComponent {...props} />;
};
}