路由后useEffect不触发

useEffect is not triggering after routing

在使用 React Hooks、渲染和路由方面,我是一个新手。

App.js

function App() {
  return (
    <div className="App">
      <Navbar />
    </div>
  );  
}

Navbar.js

export default function Navbar() {
    return(
        <BrowserRouter>
            <Routes>
                <Route path = '/:page' element = {<Header/>} />
                <Route path='/' element={<Header/>} />

                <Route exact path='' element = {<Home/>}/>
                <Route exact path='home' element = {<Home/>}/>
                <Route exact path='players' element = {<BasicTable/>}/>
                <Route exact path='about' element = {<About/>}/>
                <Route path="*" element={<Home />} />
            </Routes>
        </BrowserRouter>
    )
}

BasicTable.js

const getObj = async () => {
    const value = await axios.get(...);
    return value;
}

export function BasicTable(){
    const [obj, setObj] = useState();

    console.log("getting object");
    useEffect (()=> {
        console.log("using Effect");
        setObj(getObj());
    }, []);

    //Rest of the code below this...
}

我试图让 axios get 调用在每次有人导航到基本 table 页面(/players 页面)时触发。如果我只是将 axios.get 调用裸插入到基本 table 函数中,这将导致 api get 调用的无限循环。现在我正在使用 useEffect 挂钩,但当我导航到“/players”时它永远不会触发。事实上,它永远不会触发。我唯一看到的是“获取对象”控制台日志,但从未“使用效果”。我是否遗漏了 useEffect 的一个重要部分?

useEffect 挂钩正在将 obj 状态更新为使用 setObj(getObj()); 隐式 returned Promise 对象。至少,useEffect 钩子需要等待 getObj 函数解析。这可以通过几种方式完成:

const getObj = async () => {
  const value = await axios.get(...);
  return value;
}

使用async/await:

export function BasicTable(){
  const [obj, setObj] = useState();

  console.log("getting object");
  useEffect (()=> {
    console.log("using Effect");

    const getObject = async () => {
      const obj = await getObj();
      setObj(obj);
    }
    
    getObject();
  }, []);

  // Rest of the code below this...
}

使用 Promise 链:

export function BasicTable(){
  const [obj, setObj] = useState();

  console.log("getting object");
  useEffect (()=> {
    console.log("using Effect");
    
    getObj().then(obj => setObj(obj));
  }, []);

  // Rest of the code below this...
}

事实上,因为 getObj 隐式地 return 是一个 Promise 对象,你可以简单地 return 来自 axios 的 Promise。

const getObj = () => {
  return axios.get(...);
}