教程使用 React Hook,但我在 Class 组件设置中工作
Tutorial uses a React Hook, but I'm working in a Class Component setting
我正在尝试按照 this tutorial 在我的 React 应用程序中实施 Google 带有页面浏览跟踪的分析。但是,本教程使用 React 挂钩,而我使用 class 组件设置我的应用程序。我未能成功将教程转换为 class 设置。我应该如何调整以使其适用于我的用例?
路由页面,\src\pages\index.js:
// the function of concern
import useGaTracker from "../useGaTracker";
class Base extends Component {
render() {
useGaTracker();
// The hook inside a Class component, which is not allowed.
// But how can I make it work in my class components setting?
function withProps(Component, props) {
return function (matchProps) {
return <Component {...props} {...matchProps} />;
};
}
return (
<Router history={history}>
<Switch>
<Route exact path="/" component={Homepage} />
// Etc.
GA函数,\src\useGaTracker.js:
import { useEffect, useState } from "react";
import { useLocation } from "react-router-dom";
import ReactGA from "react-ga";
const useGaTracker = () => {
const location = useLocation();
const [initialized, setInitialized] = useState(false);
useEffect(() => {
ReactGA.initialize(process.env.REACT_APP_GA_TAG);
setInitialized(true);
}, []);
useEffect(() => {
if (initialized) {
ReactGA.pageview(window.location.pathname + window.location.search);
}
}, [initialized, location]);
};
export default useGaTracker;
和\src\index.js:
import Base from "./pages";
render(
<Provider store={store}>
<BrowserRouter>
<Base />
</BrowserRouter>
</Provider>,
document.getElementById("root")
);
调用 Base class 内部的 GA 函数产生错误:
Error: Invalid hook call. Hooks can only be called inside of the body
of a function component.
我应该如何重写它以使其在我的 Class 组件设置中工作?
您可以让一个 higher-order 组件创建一个功能组件,并在渲染给定的 non-functional 组件之前调用 useGaTracker
组件:
const withGaTracker = (Component) => {
return (props) => {
useGaTracker();
return (
<Component {...props} />
);
};
};
然后传入Base
组件
const BaseWithGaTracker = withGaTracker(Base);
并通过将 <Base />
替换为 <BaseWithGaTracker />
在 index.js 中呈现结果。
编辑:更简单,只需制作一个调用挂钩并呈现其子组件的功能组件:
const GaTracker = ({children}) => {
useGaTracker();
return children;
}
然后将 <Base />
包裹在 index.js
中
<GaTracker>
<Base />
</GaTracker>
如果您不打算在其他任何地方使用该挂钩,您也可以将其内联到新组件中。
我正在尝试按照 this tutorial 在我的 React 应用程序中实施 Google 带有页面浏览跟踪的分析。但是,本教程使用 React 挂钩,而我使用 class 组件设置我的应用程序。我未能成功将教程转换为 class 设置。我应该如何调整以使其适用于我的用例?
路由页面,\src\pages\index.js:
// the function of concern
import useGaTracker from "../useGaTracker";
class Base extends Component {
render() {
useGaTracker();
// The hook inside a Class component, which is not allowed.
// But how can I make it work in my class components setting?
function withProps(Component, props) {
return function (matchProps) {
return <Component {...props} {...matchProps} />;
};
}
return (
<Router history={history}>
<Switch>
<Route exact path="/" component={Homepage} />
// Etc.
GA函数,\src\useGaTracker.js:
import { useEffect, useState } from "react";
import { useLocation } from "react-router-dom";
import ReactGA from "react-ga";
const useGaTracker = () => {
const location = useLocation();
const [initialized, setInitialized] = useState(false);
useEffect(() => {
ReactGA.initialize(process.env.REACT_APP_GA_TAG);
setInitialized(true);
}, []);
useEffect(() => {
if (initialized) {
ReactGA.pageview(window.location.pathname + window.location.search);
}
}, [initialized, location]);
};
export default useGaTracker;
和\src\index.js:
import Base from "./pages";
render(
<Provider store={store}>
<BrowserRouter>
<Base />
</BrowserRouter>
</Provider>,
document.getElementById("root")
);
调用 Base class 内部的 GA 函数产生错误:
Error: Invalid hook call. Hooks can only be called inside of the body of a function component.
我应该如何重写它以使其在我的 Class 组件设置中工作?
您可以让一个 higher-order 组件创建一个功能组件,并在渲染给定的 non-functional 组件之前调用 useGaTracker
组件:
const withGaTracker = (Component) => {
return (props) => {
useGaTracker();
return (
<Component {...props} />
);
};
};
然后传入Base
组件
const BaseWithGaTracker = withGaTracker(Base);
并通过将 <Base />
替换为 <BaseWithGaTracker />
在 index.js 中呈现结果。
编辑:更简单,只需制作一个调用挂钩并呈现其子组件的功能组件:
const GaTracker = ({children}) => {
useGaTracker();
return children;
}
然后将 <Base />
包裹在 index.js
<GaTracker>
<Base />
</GaTracker>
如果您不打算在其他任何地方使用该挂钩,您也可以将其内联到新组件中。