React 页面不加载新内容
React page doesn't load the new content
我正在尝试以声明方式重定向页面。
这是我的 Header.js:
const Header = () => {
const [data, setData] = useState({ objects: [] });
useEffect(async () => {
const result = await axios.get(
"http://example.com/api/v1/categories"
);
setData(result.data);
}, []);
return (
<div>
{courses.map( objects => (
<Link to={`/cats/${objects.id}`}>{objects.title}</Link>
))}
</div>
);
};
export default Header;
这是我的App.js
class App extends Component {
render(){
return (
<Router>
<Redirect exact from="/" to="/index" />
<Route path = "/" component = {App}>
<Header/>
<Route path="/cats/:objectId" component={CoursePage} />
</Route>
</Router>
);
}
}
export default App;
这里是 CoursePage.js:
const CoursesPage = (props) => {
let { objectId } = useParams();
const [data, setData] = useState({ courses: [] });
useEffect(() => {
(async () => {
const result = await axios.get(
"http://example.com/api/v1/cats/"+objectId
).catch(err => {
console.error(err);
});
setData(result.data);
})();
}, []);
return (
<Fragment>
{courses.title}
</Fragment>
);
};
export default CoursesPage;
在页眉上,我单击 links。它成功重定向到课程页面。但是,当我再次单击另一个课程 link 时,它不会重新加载组件,也不会加载新数据。 URL 改变了,但页面没有。
如何强制页面重新加载组件?
您应该将 CoursePage
中 useEffect 的依赖数组更改为依赖 objectId
,只要对象 ID 发生变化,它就会重新运行效果。
const CoursesPage = (props) => {
let { objectId } = useParams();
const [data, setData] = useState({ courses: [] });
useEffect(() => {
(async () => {
setData({ courses: [] }); // add this line
const result = await axios.get(
"http://example.com/api/v1/cats/"+objectId
).catch(err => {
console.error(err);
});
setData(result.data);
})();
}, [objectId]); // Update dependency array here
return (
<Fragment>
{courses.title}
</Fragment>
);
}
export default CoursesPage;
一旦对象 ID 更改,这将重置以前的数据以加载新数据。
如果您想在 url 中的参数更改时完全重新挂载组件,那么您可以向组件根元素添加一个 id。
return (
<Fragment key={objectId}>
{courses.title}
</Fragment>
);
我正在尝试以声明方式重定向页面。
这是我的 Header.js:
const Header = () => {
const [data, setData] = useState({ objects: [] });
useEffect(async () => {
const result = await axios.get(
"http://example.com/api/v1/categories"
);
setData(result.data);
}, []);
return (
<div>
{courses.map( objects => (
<Link to={`/cats/${objects.id}`}>{objects.title}</Link>
))}
</div>
);
};
export default Header;
这是我的App.js
class App extends Component {
render(){
return (
<Router>
<Redirect exact from="/" to="/index" />
<Route path = "/" component = {App}>
<Header/>
<Route path="/cats/:objectId" component={CoursePage} />
</Route>
</Router>
);
}
}
export default App;
这里是 CoursePage.js:
const CoursesPage = (props) => {
let { objectId } = useParams();
const [data, setData] = useState({ courses: [] });
useEffect(() => {
(async () => {
const result = await axios.get(
"http://example.com/api/v1/cats/"+objectId
).catch(err => {
console.error(err);
});
setData(result.data);
})();
}, []);
return (
<Fragment>
{courses.title}
</Fragment>
);
};
export default CoursesPage;
在页眉上,我单击 links。它成功重定向到课程页面。但是,当我再次单击另一个课程 link 时,它不会重新加载组件,也不会加载新数据。 URL 改变了,但页面没有。
如何强制页面重新加载组件?
您应该将 CoursePage
中 useEffect 的依赖数组更改为依赖 objectId
,只要对象 ID 发生变化,它就会重新运行效果。
const CoursesPage = (props) => {
let { objectId } = useParams();
const [data, setData] = useState({ courses: [] });
useEffect(() => {
(async () => {
setData({ courses: [] }); // add this line
const result = await axios.get(
"http://example.com/api/v1/cats/"+objectId
).catch(err => {
console.error(err);
});
setData(result.data);
})();
}, [objectId]); // Update dependency array here
return (
<Fragment>
{courses.title}
</Fragment>
);
}
export default CoursesPage;
一旦对象 ID 更改,这将重置以前的数据以加载新数据。
如果您想在 url 中的参数更改时完全重新挂载组件,那么您可以向组件根元素添加一个 id。
return (
<Fragment key={objectId}>
{courses.title}
</Fragment>
);