我正在尝试制作一个 Disney Plus 克隆版,并且正在从 Firebase 数据库中获取电影。但是,当我尝试显示数据时,它不起作用。奇怪的是,它会在我每次 console.log 时显示数据。
import React from "react";
import "./App.css";
import Header from "./components/Header";
import Home from "./components/Home";
import Detail from "./components/Detail";
import Login from "./components/Login";
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
function App() {
return (
<div className="App">
<Router>
<Header />
<Switch>
<Route path="/login">
<Login />
</Route>
<Route path="/detail/:id">
<Detail />
</Route>
<Route path="/">
<Home />
</Route>
</Switch>
</Router>
</div>
);
}
export default App;
import React, { useEffect } from "react";
import styled from "styled-components";
import ImgSlider from "./ImgSlider";
import Viewers from "./Viewers";
import Movies from "./Movies";
import db from "../firebase";
import { useDispatch } from "react-redux";
import { setMovies } from "../features/movie/movieSlice";
function Home() {
const dispatch = useDispatch();
useEffect(() => {
db.collection("movies").onSnapshot((snapshot) => {
let tempMovies = snapshot.docs.map((doc) => {
return { id: doc.id, ...doc.data() };
});
dispatch(setMovies(tempMovies));
console.log(tempMovies);
});
}, []);
return (
<Container>
<ImgSlider />
<Viewers />
<Movies />
</Container>
);
}
export default Home;
const Container = styled.main`
min-height: calc(100vh - 70px);
padding: 0 calc(3.5vw + 5px);
position: relative;
overflow-x: hidden;
&:before {
background: url("/images/home-background.png") center center / cover
no-repeat fixed;
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: -1;
}
`;
import React from "react";
import styled from "styled-components";
import { Link } from "react-router-dom";
import { selectMovies } from "../features/movie/movieSlice";
import { useSelector } from "react-redux";
function Movies() {
const movies = useSelector(selectMovies);
return (
<Container>
<h4>Recomended for You</h4>
<Content>
{movies &&
movies.map((movie) => (
<Wrap key={movie.id}>
<Link to={`/detail/${movie.id}`}>
<img src={movie.cardImg} />
</Link>
</Wrap>
))}
</Content>
</Container>
);
}
export default Movies;
const Container = styled.div``;
const Content = styled.div`
display: grid;
grid-gap: 25px;
grid-template-columns: repeat(4, minmax(0, 1fr));
`;
const Wrap = styled.div`
border-radius: 10px;
cursor: pointer;
overflow: hidden;
border: 3px solid rgb(249, 249, 249, 0.1);
box-shadow: rgb(0 0 0 / 69%) 0px 26px 30px -10px,
rgb(0 0 0 / 73%) 0px 16px 10px -10px;
transition: all 250ms cubic-bezier(0.25, 0.46, 0.45, 0.94) 0s;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
&:hover {
transform: scale(1.05);
box-shadow: rgb(0 0 0 / 80%) 0px 40px 58px -16px,
rgb(0 0 0 / 72%) 0px 30px 22px -10px;
border-color: rgb(249, 249, 249, 0.8);
}
`;
import { createSlice } from "@reduxjs/toolkit";
const initialState = {
movies: [],
};
const movieSlice = createSlice({
name: "movie",
initialState,
reducers: {
setMovies: (state, action) => {
state.movie = action.payload;
},
},
});
export const { setMovies } = movieSlice.actions;
export const selectMovies = (state) => state.movie.movies;
export default movieSlice.reducer;
import { configureStore } from "@reduxjs/toolkit";
import counterReducer from "../features/counter/counterSlice";
import movieReducer from "../features/movie/movieSlice";
export const store = configureStore({
reducer: {
movie: movieReducer,
},
});
注意:这些不是所有文件,只是使用 Redux 数据的文件。