javascript - history.push 不会在 React/Typescript 中重新渲染/刷新组件
问题描述
我正在导航到具有 ajax 请求的组件,但是仅在第一次导航到该组件时才调用 ajax 调用。所有其他路线看起来都不错,但这是有问题的路线:
const history = useHistory();
onClick={() => history.push(`/details/${id}`}
路线:
import React from 'react';
import { BrowserRouter, Route, Switch} from 'react-router-dom';
import { QueryClient, QueryClientProvider } from 'react-query';
import { RouteComponentProps } from "react-router-dom";
import Component1 from '../Component1';
import Component2 from '../Component2';
const queryClient = new QueryClient()
const Routing: React.FunctionComponent = () => {
return (
<QueryClientProvider client={queryClient}>
<BrowserRouter>
<Switch>
<Route exact path="/" component={Component1} />
<Route path="/details/:id" render={(props: RouteComponentProps<any>) => <Component2 {...props}/>} />
<Route component={NotFound} />
</Switch>
</BrowserRouter>
</QueryClientProvider>
)
}
export default Routing;
组件 2 代码:
import React from 'react';
import { RouteComponentProps, useLocation } from "react-router-dom";
import { useQuery, useQueryClient} from 'react-query';
const Component2: React.FunctionComponent<RouteComponentProps<any>> = (props) => {
const { state } = useLocation<stateType>();
let id = props.match.params.id;
const fetchData = async () => {
const res = await fetch(`/detail/${id}`);
return res.json();
};
const { data, status } = useQuery('chartInfo', fetchData, {
staleTime: 5000,
});
return (
{status === 'error' && (
<div className="mt-5">Error fetching data!</div>
)}
{status === 'loading' && (
<div className="mt-5">Loading data ...
</div>
)}
{status === 'success' && (
<div className="mt-5">
// data binded here
</div>
)}
)
}
export default Component2;
解决方案
现在更清楚可能导致问题的原因:看起来您正试图从返回实际页面的同一路径获取 json。换句话说,当您请求时,您必须确定您对服务器/detail/${id}
的期望:页面或 json。如果服务器已经设置为返回 json,那么您必须为页面分配不同的路径。但我会将 json 的路径改为类似的路径/api/detail/${id}
,因为通常人们会/api/*
为请求 json 数据创建路由
推荐阅读
- angular - 如何在 nginx 容器下部署 Angular 应用程序?
- java - 定义多个 kafkaComponent bean 时,Kafka Camel Spring Boot AutoConfiguration 不会被拾取
- bootstrap-4 - 不确定这是否可行,但我想在视口底部放置一个栏,直到页脚滚动到视图中
- javascript - 没有使用相同的组件在 beforeRouteUpdate 上调用 Next()
- javascript - 如何从 Promise 中提取值并通过 node.js 服务器将它们发送到客户端?
- ssh - SSH 进入运行 Ubuntu 的树莓派
- sql - 提升查询性能
- project - 如何使用 IVY 创建 Angular 9 项目?
- amazon-redshift - Amazon Redshift 是否会自动清理用于在查询溢出到磁盘时创建的临时表和工作表的磁盘空间?
- animation - Flutter:无法使用偏移量将容器定位在另一个容器上