为什么我的路由器不重定向 - 交互式地图?
why isn't my router redirecting - interactive map?
我有这张交互式地图,如果您点击某个国家/地区,它会将您重定向到该特定国家/地区的页面,但重定向对我不起作用,我不明白我做错了什么。这是代码:
onClick={() => {
const {NAME} = geo.properties;
if(NAME == 'Bulgaria')
{
<Redirect to='pages/services' />
}
}}
这是我的交互式地图的 .js 文件的完整代码:
import React, { memo } from "react";
import {
ComposableMap,
Geographies,
Geography
} from "react-simple-maps";
import { Redirect } from "react-router-dom";
import { BrowserRouter } from 'react-router-dom';
...
const MapChart = ({ setTooltipContent }) => {
return (
<>
<ComposableMap data-tip="" projectionConfig={{ scale: 200 }}>
<Geographies geography={geoUrl}>
{({ geographies }) =>
geographies.map(geo => (
<Geography
key={geo.rsmKey}
geography={geo}
onMouseEnter={() => {
const { NAME, POP_EST } = geo.properties;
setTooltipContent(`${NAME} — ${rounded(POP_EST)}`);
}}
onMouseLeave={() => {
setTooltipContent("");
}}
onClick={() => {
const { NAME } = geo.properties;
if (NAME === 'Bulgaria') {
this.setState({ redirect: true });
}
}}
...
/>
))
}
</Geographies>
</ComposableMap>
</>
);
};
export default memo(MapChart);
问题
这不是 JSX 的工作方式。它不是重定向,因为函数不能 return 渲染 JSX,也不会尝试导航。呈现的所有内容都需要在 render
函数或功能组件 return 中。此处理程序没有 return 任何东西。
解决方案
您可以以声明方式有条件地呈现 Redirect
组件,或强制发出导航操作。
根据条件使用 Redirect
组件。
// later in render/return
if (redirect) {
return <Redirect to='/pages/services' />;
}
return (
...
onClick={() => {
const { NAME } = geo.properties;
if (NAME === 'Bulgaria') {
setRedirect(true);
}
}}
...
);
地图图表
const MapChart = ({ setTooltipContent }) => {
const [redirect, setRedirect] = useState(false); // <-- add redirect state
return redirect ? ( // <-- conditional render redirect
<Redirect to="/pages/services" />
) : (
<ComposableMap data-tip="" projectionConfig={{ scale: 200 }}>
<Geographies geography={geoUrl}>
{({ geographies }) =>
geographies.map((geo) => (
<Geography
...
onClick={() => {
const { NAME } = geo.properties;
if (NAME === "Bulgaria") {
setRedirect(true); // <-- set redirect state
}
}}
...
/>
))
}
</Geographies>
</ComposableMap>
);
};
使用 history.replace
.
onClick={() => {
const { NAME } = geo.properties;
if (NAME === 'Bulgaria') {
history.replace('/pages/services');
}
}};
地图图表
const MapChart = ({ history, setTooltipContent }) => { // <-- destructure history route prop
return (
<ComposableMap data-tip="" projectionConfig={{ scale: 200 }}>
<Geographies geography={geoUrl}>
{({ geographies }) =>
geographies.map((geo) => (
<Geography
...
onClick={() => {
const { NAME } = geo.properties;
if (NAME === "Bulgaria") {
history.replace("/pages/services"); // <-- imperative navigation
}
}}
...
/>
))
}
</Geographies>
</ComposableMap>
);
};
注意: 如果 MapChart
不是直接由 Route
组件呈现(即它不接收 route props) then you can use the useHistory
反应挂钩.
const history = useHistory();
并且导航与点击处理程序完全相同。
我有这张交互式地图,如果您点击某个国家/地区,它会将您重定向到该特定国家/地区的页面,但重定向对我不起作用,我不明白我做错了什么。这是代码:
onClick={() => {
const {NAME} = geo.properties;
if(NAME == 'Bulgaria')
{
<Redirect to='pages/services' />
}
}}
这是我的交互式地图的 .js 文件的完整代码:
import React, { memo } from "react";
import {
ComposableMap,
Geographies,
Geography
} from "react-simple-maps";
import { Redirect } from "react-router-dom";
import { BrowserRouter } from 'react-router-dom';
...
const MapChart = ({ setTooltipContent }) => {
return (
<>
<ComposableMap data-tip="" projectionConfig={{ scale: 200 }}>
<Geographies geography={geoUrl}>
{({ geographies }) =>
geographies.map(geo => (
<Geography
key={geo.rsmKey}
geography={geo}
onMouseEnter={() => {
const { NAME, POP_EST } = geo.properties;
setTooltipContent(`${NAME} — ${rounded(POP_EST)}`);
}}
onMouseLeave={() => {
setTooltipContent("");
}}
onClick={() => {
const { NAME } = geo.properties;
if (NAME === 'Bulgaria') {
this.setState({ redirect: true });
}
}}
...
/>
))
}
</Geographies>
</ComposableMap>
</>
);
};
export default memo(MapChart);
问题
这不是 JSX 的工作方式。它不是重定向,因为函数不能 return 渲染 JSX,也不会尝试导航。呈现的所有内容都需要在 render
函数或功能组件 return 中。此处理程序没有 return 任何东西。
解决方案
您可以以声明方式有条件地呈现 Redirect
组件,或强制发出导航操作。
根据条件使用 Redirect
组件。
// later in render/return
if (redirect) {
return <Redirect to='/pages/services' />;
}
return (
...
onClick={() => {
const { NAME } = geo.properties;
if (NAME === 'Bulgaria') {
setRedirect(true);
}
}}
...
);
地图图表
const MapChart = ({ setTooltipContent }) => {
const [redirect, setRedirect] = useState(false); // <-- add redirect state
return redirect ? ( // <-- conditional render redirect
<Redirect to="/pages/services" />
) : (
<ComposableMap data-tip="" projectionConfig={{ scale: 200 }}>
<Geographies geography={geoUrl}>
{({ geographies }) =>
geographies.map((geo) => (
<Geography
...
onClick={() => {
const { NAME } = geo.properties;
if (NAME === "Bulgaria") {
setRedirect(true); // <-- set redirect state
}
}}
...
/>
))
}
</Geographies>
</ComposableMap>
);
};
使用 history.replace
.
onClick={() => {
const { NAME } = geo.properties;
if (NAME === 'Bulgaria') {
history.replace('/pages/services');
}
}};
地图图表
const MapChart = ({ history, setTooltipContent }) => { // <-- destructure history route prop
return (
<ComposableMap data-tip="" projectionConfig={{ scale: 200 }}>
<Geographies geography={geoUrl}>
{({ geographies }) =>
geographies.map((geo) => (
<Geography
...
onClick={() => {
const { NAME } = geo.properties;
if (NAME === "Bulgaria") {
history.replace("/pages/services"); // <-- imperative navigation
}
}}
...
/>
))
}
</Geographies>
</ComposableMap>
);
};
注意: 如果 MapChart
不是直接由 Route
组件呈现(即它不接收 route props) then you can use the useHistory
反应挂钩.
const history = useHistory();
并且导航与点击处理程序完全相同。