1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
function App() {
const [movies, setMovies] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(null);
const fetchMoviesHandler = useCallback(async () => {
setIsLoading(true);
setError(null);
try {
// fetch接收資料的網址也改為firebase,但收到的資料結構會有變
const response = await fetch(
"https://react-http-6b4a6.firebaseio.com/movies.json"
);
if (!response.ok) {
throw new Error("Something went wrong!");
}
const data = await response.json();
// 新的資料結構uid{屬性1:值, 屬性2:值...}
console.log(data);
const loadedMovies = [];
// loop所有uid(key)
for (const key in data) {
loadedMovies.push({
id: key,
title: data[key].title,
openingText: data[key].openingText,
releaseDate: data[key].releaseDate,
});
}
setMovies(loadedMovies);
} catch (error) {
setError(error.message);
}
setIsLoading(false);
}, []);
useEffect(() => {
fetchMoviesHandler();
}, [fetchMoviesHandler]);
async function addMovieHandler(movie) {
// firebase 發送請求網址最後需要加上.json 不然會失敗
// movies為儲存的資料表
const response = await fetch(
"https://react-http-6b4a6.firebaseio.com/movies.json",
{
method: "POST",
// 表單物件轉JSON資料格式
body: JSON.stringify(movie),
// 非必要,但對某些restAPI可能需要這個欄位
headers: {
"Content-Type": "application/json",
},
}
);
const data = await response.json();
console.log(data);
// 這邊先不處理錯誤 專注於post程式碼
}
let content = <p>Found no movies.</p>;
if (movies.length > 0) {
content = <MoviesList movies={movies} />;
}
if (error) {
content = <p>{error}</p>;
}
if (isLoading) {
content = <p>Loading...</p>;
}
return (
<React.Fragment>
<section>
<AddMovie onAddMovie={addMovieHandler} />
</section>
<section>
<button onClick={fetchMoviesHandler}>Fetch Movies</button>
</section>
<section>{content}</section>
</React.Fragment>
);
}
export default App;
|