【发布时间】:2022-01-18 16:48:30
【问题描述】:
我有这个 App 组件,我想从背面的 API 中获取一些数据:
const App = () => {
const [restaurants, setRestaurants] = useState("");
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(
"http://localhost:3001/api/v1/restaurants"
);
const data = await response.json();
console.log(data);
setRestaurants(data);
} catch (err) {
console.log("Cant fetch");
}
};
fetchData();
}, []);
return (
// <RestaurantContextProvider>
<div className="container">
<Router>
<Routes>
<Route exact path="/" element={<Home restaurants={restaurants} />} />
<Route
exact
path="/restaurants/:id/update"
element={<UpdatePage />}
/>
<Route
exact
path="/restaurants/:id"
element={<RestaurantDetailPage />}
/>
</Routes>
</Router>
</div>
// </RestaurantContextProvider>
);
};
export default App;
如果我在 Route 元素中更改组件的元素,它会获取但不会呈现。 怎么了?我在Router的V6文档上没有找到答案。
已编辑:
如果我在这个组件中添加 fetch,它会正常获取数据。
const RestaurantsList = (restaurants) => {
return (
<div className="list-group">
<table className="table table-hover table-dark">
<tbody>
{restaurants &&
restaurants.map((res) => (
<tr key={res.id}>
<td>{res.name}</td>
<td>{res.location}</td>
<td>{"$".repeat(res.price_range)}</td>
<td>Reviews</td>
<td>
<button className="btn btn-warning">Update</button>
</td>
<td>
<button className="btn btn-danger">Delete</button>
</td>
</tr>
))}
</tbody>
</table>
</div>
);
};
export default RestaurantsList;
这里是 index.js:
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
ReactDOM.render(<App />, document.getElementById("root"));
【问题讨论】:
-
我的意思是......如果出现错误,您没有更新饱和状态,因此获取可能存在错误?
-
我不明白。如果我在孩子中获取数据,它可以正常工作
-
你试过 route 的 render props 吗?
<Route render={(routerProps => <Home restaurants={restaurants} {...routerProps} /> -
您需要在 useEffect 挂钩中将餐厅作为依赖项传递。基于依赖关系,重新渲染发生。在 useState 中也使用空数组而不是空字符串。
-
@miouri 你的 fetchData 应该返回一个承诺。您编写方法的方式没有遵循最佳实践。您可以在 useEffect 之外声明 fetchData,并将方法名称作为依赖项传递给 useEffect。您也可以使用 useCallback 为记忆版本包装 fetchData。现在你试试这样 useEffect(() => { fetchData().then((data) => setRestaurants(data)); }, []);
标签: reactjs react-router