📅  最后修改于: 2023-12-03 15:19:47.882000             🧑  作者: Mango
本文将介绍如何使用 Redux 过滤电影列表容器。我们将使用 React 和 Redux 构建一个电影列表应用程序。该应用程序将从一个 API 中获取数据,并渲染成一个电影列表。我们将添加一个过滤器,用户可以根据电影名称来过滤电影列表。
我们将使用以下技术栈来完成这个应用程序:
我们的应用程序将包括以下组件:
在我们开始编写代码之前,我们需要设置 Redux。
我们将创建以下三个 Redux 动作:
fetchMovies
:从 API 中获取所有电影。setMovies
:将电影存储在 Redux store 中。filterMovies
:过滤电影列表。我们将创建以下三个 Redux reducer:
isLoading
:检查是否正在从 API 中获取数据。movies
:存储电影列表。filter
:存储过滤器表单的值。我们将在 store 中引入 Redux Thunk 中间件,允许我们执行异步操作。
现在我们已经设置好了 Redux,我们可以开始编写组件了。我们将逐一介绍如何编写这些组件。
MovieList 组件将渲染电影列表。如果电影列表尚未加载,它将显示一个加载动画。如果电影列表为空,它将显示一个无电影的消息。
import React from "react";
import { connect } from "react-redux";
import MovieItem from "./MovieItem";
const MovieList = ({ isLoading, movies }) => {
if (isLoading) {
return <div>Loading...</div>;
}
if (!movies.length) {
return <div>No movies available.</div>;
}
return (
<div>
{movies.map((movie) => (
<MovieItem key={movie.id} movie={movie} />
))}
</div>
);
};
const mapStateToProps = (state) => ({
isLoading: state.isLoading,
movies: state.movies,
});
export default connect(mapStateToProps)(MovieList);
MovieItem 组件将渲染单个电影的详细信息。
import React from "react";
const MovieItem = ({ movie }) => (
<div>
<h2>{movie.title}</h2>
<p>{movie.plot}</p>
</div>
);
export default MovieItem;
Filter 组件将渲染过滤器表单。它将根据用户的输入更新 Redux store 中的 filter 值。
import React from "react";
import { connect } from "react-redux";
import { filterMovies } from "../actions/actions";
const Filter = ({ filter, filterMovies }) => (
<form>
<label>
Filter movies by title:
<input
type="text"
value={filter}
onChange={(e) => filterMovies(e.target.value)}
/>
</label>
</form>
);
const mapStateToProps = (state) => ({
filter: state.filter,
});
const mapDispatchToProps = {
filterMovies,
};
export default connect(mapStateToProps, mapDispatchToProps)(Filter);
App 组件将将所有组件集成到一个容器中,并通过 Redux store 获取电影列表。
import React, { Component } from "react";
import { connect } from "react-redux";
import { fetchMovies, setMovies } from "../actions/actions";
import MovieList from "./MovieList";
import Filter from "./Filter";
import axios from "axios";
class App extends Component {
componentDidMount() {
this.props.fetchMovies();
axios
.get("url/to/api")
.then((response) => {
this.props.setMovies(response.data);
})
.catch((error) => {
console.log(error);
});
}
render() {
return (
<div>
<Filter />
<MovieList />
</div>
);
}
}
const mapStateToProps = (state) => ({
filter: state.filter,
});
const mapDispatchToProps = {
fetchMovies,
setMovies,
};
export default connect(mapStateToProps, mapDispatchToProps)(App);
我们可以使用 Redux DevTools Extension 来调试 Redux store。在创建 store 时添加以下代码即可启用该功能:
const store = createStore(
rootReducer,
initialState,
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);
现在,当我们在应用程序中更改状态时,将在 Redux DevTools 中显示这些更改。
现在我们已经成功地构建了一个电影列表应用程序,并添加了一个过滤器。我们学习了如何使用 React、Redux 和 Redux Thunk,以及如何编写组件和调试 Redux store。我希望这篇文章能够帮助你更好地理解 Redux,并教你如何在应用程序中使用它。