亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 React Router 導航到頁面時 useEffect 根本不運行

使用 React Router 導航到頁面時 useEffect 根本不運行

智慧大石 2023-11-02 22:35:45
應用程序.js:import React, { Fragment } from "react";import Header from "./components/Header";import PostList from "./components/PostList";import Post from "./components/Post";import TagList from "./components/TagList";import { BrowserRouter as Router, Switch, Route } from "react-router-dom";const App = () => {  return (    <Fragment>      <Router>        <Header />        <Switch>          <Route exact path="/" component={PostList} />          <Route path="/tags" component={TagList} />          <Route path="/posts/:id" component={Post} />        </Switch>      </Router>    </Fragment>  );};export default App;郵政.js:import React, { useEffect, useState } from "react";import Tag from "./Tag";import { useParams } from "react-router-dom";import axios from "axios";const Post = () => {  const { id } = useParams();  const [post, setPost] = useState({});  useEffect(() => {    const fetchPost = async () => {      try {        const res = await axios.get(`/api/posts/${id}`);        setPost(res.data);      } catch (err) {        console.error(err);      }    };    fetchPost();  }, []);  return (    <div>      <h2>{post.title}</h2>      <p>{post.text}</p>      <div>        {post.tags.map((tag) => (          <Tag key={tag._id} tag={tag} />        ))}      </div>    </div>  );};export default Post;我正在嘗試建立一個簡單的博客網站的框架并運行,但我在使用 Post 組件時遇到了問題。當使用路線“/posts/:id”導航到特定帖子時,應該從我的 API 獲取帖子的 useEffect 似乎沒有運行,并且不可避免地會出現“post.tags 未定義”錯誤。其他一切都工作正常 - API 按預期響應來自 Postman 的請求,并且“useParams”從 URL 中獲取帖子 id 很好 - 只是 useEffect 根本沒有運行(也沒有顯示)console.logs。我在以前的項目中以這種方式做事沒有遇到任何問題 - 事實上 TagList 組件中的 useEffect 幾乎是相同的,并且 /tags 路由按預期工作,所以我不確定我錯過了什么?
查看完整描述

1 回答

?
SMILET

TA貢獻1796條經驗 獲得超4個贊

useEffect僅在第一次渲染時運行,如果指定的依賴項已更改,則在任何其他渲染時運行。由于您添加了一個空數組,因此它們永遠不會改變。

如果想useEffect在post id更改后再次運行,則需要添加id為useEffect的依賴。

useEffect(() => {
  ....
}, [id, setPost]);

另外,你的post.tags意志仍然是未定義的,因為數據是在組件完成渲染之后出現的,所以你應該在返回之前檢查是否有發布數據,如果沒有發布數據,則返回 null 或加載骨架。


查看完整回答
反對 回復 2023-11-02
  • 1 回答
  • 0 關注
  • 284 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號