前兩篇的文章有介紹到 useEffect 和 JSON Server(假後端),並說明 db.json 的內容應該如何撰寫
這篇文章主要會示範如何將這兩個方法結合,在 React 抓取並顯示資料
npx json-server --watch data/db.json --port 8000
確保伺服器正在運行,否則 React 無法獲取資料
Home.js
import { useEffect, useState } from "react";
import BlogList from "./BlogList";
const Home = () => {
const [blogs, setBlogs] = useState(null)
useEffect(() => {
fetch('http://localhost:8000/blogs')
.then(res => {
return res.json();
})
.then(data => {
setBlogs(data);
})
}, [])
return (
<div className="home">
{blogs && <BlogList blogs={blogs} />}
</div>
);
}
export default Home;
第一部分主要程式碼:
useEffect(() => {
fetch('http://localhost:8000/blogs')
.then(res => {
return res.json();
})
.then(data => {
setBlogs(data);
})
}, [])
http://localhost:8000/blogs
)發送 GET 請求.then(res => res.json())
res.json()
轉成JavaScript物件 / 陣列.then(data => setBlogs(data))
data
就是 JSON Server 回傳的資料setBlogs(data)
會更新 React 的 state → 把抓到的資料放進 blogs 這個 state 裡useEffect(() => {
(…)
},[])
[]
,代表這段程式碼只會在元件第一次載入時執行一次第二部分主要程式碼:渲染資料
return (
{blogs && <BlogList blogs={blogs} />}
</div>
);
}
註:原本 blogs && <BlogList blogs={blogs} />
,是被視為純文字 / HTML,因此需要加上 {}
來表示要寫JavaScript 的條件判斷
{blogs && <BlogList blogs={blogs} />}
意思:
fetch
拿到資料後setBlogs(data)
,此時 blogs 不再是 null,而是一個陣列(或物件)blogs && ...
成立,React 就會渲染 <BlogList blogs={blogs} />
當整個流程完成了以後,前端就可以抓取到後端的資料,並顯示在畫面上,就不需要從在元件的程式碼寫上這些資料